2018年ぼくが運用していた平均回帰法ボット

平均回帰法とは
投資ではよく知れている戦略で,価格が平均へ帰ってくるものとして逆張りで建玉を集める方法.買いなら取得平均価格を過去平均価格よりいかに安くするか.売りなら平均取得価格を上げるためいかに高値で売るかという戦略です.

ここでぼくが書く平均回帰法では, (定義時間範囲で)始点価格から終点価格を結ぶ線と同じ傾きで方向感が継続することを前提としたもので,そのプログラムを2018年稼働させてみた経験と反省の一部を書いた記事になっています.

目次

平均回帰法概要

実戦では,過去価格から現在価格への傾き(上昇/下降)で推移する前提で
平均価格以上/以下の騰貴/下落時に建玉を集め,見込み価格に回復することを建玉管理しつつ待つ戦略です.


「でもあれじゃんね,チャートって複雑な形状してんじゃん?
波々っていうか,フラクタルというか」

ですね,その波々なのを平坦にして傾きを算出しています.

線形平均回帰法を選択した背景

時系列データの場合,異常値が出た後の値は平均値に戻る場合が多いです.

例えば,
- (お財布的に)極端に消費が増えた翌月は買い物を控える
- (心身的に)極端に頑張った翌日は頑張りたくない,むしろご褒美ちょうだい
- (金融市場的に)極端に暴落したら次は暴騰じゃぁぁっぁ(参照チャート: 東日本大震災・スイスショック・リーマンショック・ブレグジット・2019/1/3 Apple下方修正ショックなど)

資源的なことや人間心理的な補正機能が働くのかも知れません.

上記の事からぼくがいう線形平均回帰法は,上昇下降を予想する戦略ではなく,異常値を検出して平均に近いところに戻ることを見込む戦略ということになります.

実際,線形平均回帰法は有用な手法として金融市場でも活用されており論文多数です.実装については様々ありますが一般的には相対力指数(RSIなど)や標準偏差(ポリンジャーバンドなど)を使う方法が比較的簡単だと思います.

対処したいポイント

「異常値ってww金融市場が正規分布してねぇし,戻んなかったらどうすんの?ロスカ?リスカ?首吊るの?逆張りで何人が退場してきたか分かってんの?ワロス」

ですね,
実装後過去データをもとにデータ解析をすると更に有用にするための問題点が見えてきます.
プログラムだからこそできる計算や高速実行なども味方につけたいですね.


上記で挙げた異常値からの異常値,一方通行への対応はもちろん,他にも

  • 設定時間軸
  • 異常値が出る状況で指値注文が通るのか
  • その際適切な指値価格はどこか
  • 限られた資源をローリスクかつ機会最適化して投じるか
  • 損益確定有無・方法

特に,
取引所固有の問題対策遅延対策資産維持管理/効率活用・変動出来高に合わせた適切な指値算出などは優先的に組み込みたいです.

ロングテールで極端な事象が集中し狂気が狂気を呼びエスカレートするのがこの市場です.
例えば,ある日市場価格の10%以上下落しても翌日さらに10%下落することも…
標準偏差-2σってたので買ったら次々と安値更新されて偏差が広がり続けるという状況が…あるの余裕で💦

ちなみに,チャートに正規分布を当てはめて儲けてやろう野郎であるボリンジャーバンドの考案者ジョン・ボリンジャーは破産したと聞いています.

過去に多発した失敗は解決策がある可能性,事例や論文から学ぼ

上記のように過去のデータを盲信すると,平均値が異常値に近づく状況では市場からBANされます.
異常値で建玉を追加すれば証拠金維持率が低下します.退場者の理由は,損失時の建玉追加(ナンピン)です.

「ナンピン退場で後悔!投資怖い!」
でもこれって,すでに負けて反省もない再チャレンジもない人ですよね.

温故知新,過去踏襲,先人から学びましょ
論文から学びましょ.研鑽しましょ.
こうして線形平均回帰法は、優位性を見いだし、当戦略に付帯する取引戦略も開発され有用な戦略になっています.各取引所ではこの戦略を取り入れ,顧客の注文マッチや取引を促進するために自社でマーケットメイク(板置き注文)している場合も.そう,もちろん負けないように.

下記に各取引所が公式提供するMarket maker programのサンプルがあります,実際活用し利益を出した方も多いようです.
- BitMEX(香港) sample market maker
- BitBank(日本) sample market maker

線形平均回帰法を有効化させる鍵は?

  • 設定時間軸
  • 異常値が出る状況で指値注文が通るのか
  • その際適切な指値価格はどこか
  • 限られた資源をローリスクかつ機会最適化して投じるか
  • 損益確定有無・方法

特に,
- 取引所固有の問題対策
- 遅延対策
- 資産維持管理/効率活用
- 変動出来高に合わせた適切な指値算出

ここでは,資産維持管理を少し

資産維持管理法

異常値を検出して買い注文を出したいと思います.さて,一括で証拠金を使い切る建玉枚数で注文を行うことはベターでしょうか.多くの場合否.
相当確証があるか無謀かどちらからです.

発注する場合,以下の方法が考えられます.
1. 1回の注文でmax建玉を作る.
1. 複数回注文でmax建玉を作る.複数回の注文すべてで同じ枚数(l)を発注.
1. 複数回注文でmax建玉を作る.複数回の注文で別々の枚数(l)を発注.

ここでは簡易的に略語を用いています.

max = 最大保有建玉数
p = 保有建玉数


alpha = 定数(0.1 < alpha < 2.0 で適当に設定し防御力としても使われる)
time = 発注回数
l = 一度の発注枚数

1()の場合,注文後pはmaxで利益損失ともに最大.指値にかからなければp=0,機会損失最大です.
2()の場合,注文後線形p=l*timeに建玉数が伸びます.利益機会損失ともに線形です.指値にかからなければ注文を次回に繰り越す. 3()の場合,注文後曲線p=l{max * tanh(alpha*abs(p-max)/max)}*timeを描き,maxを満たすかシグナルがなくなるまで発注枚数を緩やかに減らしながら注文し続けます.

3で使っているalphaは適当に決めていい定数です.0.1だとビビりながら,0.5ならドドーンと枚数積みます.
図3についてはわかりやすくmax(最大保有建玉数)を1000にしています.

要は,保有建玉が0のときはシグナルに応じていっぱい注文しちゃうよ!その後設定した最大建玉数まで徐々に増やしていくけど最大建玉数は超えないよ,身の程を知っているよ!って関数です.

遅延なども考慮し,最大保有建玉数を数割超えてしまうことを想定してmax値を設定するのがセオリーかと思います.

戦略設計構築編

戦略と建玉構築が決まったら,実際のデータを使ってテストをしながらチューニングしていきます.取引所相手ではなく,過去の確定したいつでも売り買いできる価格でテストしてみましょ.

バックテスト

過去のデータは各市場の履歴を取ればあるし,Kaggleにあったりします.当戦略をそのデータに照らし合わせ,利益が出る状態を作りましょう.

過去データで利益がでないのに未来では出ません(多分).
かと言って,過去で最適化された値が未来で常に役に立つとは限りません.

弊事例では過去のデータを数ヶ月ごとに区切り配列を準備しました.
その各配列100から,90取り出して最適値を算出し,(ここでは未来とした)残り10に実践し利益が出るか検証しました.また,実戦プログラムでも数時間前から現在までに現在使用値よりさらに最適値があったのか,それはどの値だったのか,その値がランダムで抜き出した過去データ期間でも有効ならば現在値と入れ替えています.

失敗から学びたい,学びの経験値効率を上げたいですね(自戒として

問題点の洗い出し

利益などをプロットすると利益カーブが順調に伸びていない箇所があると思います.
過去のデータでも利益を失っている所があれば,実戦では遅延や建玉処分未遂などでさらに大きな損失が出ていると思われます.その箇所をドローダウンといい改善点になります.

改善点と言ってもチャートに以上がなければ,データやログを見てみないとなにを修正するべき歌がわからないです.あとは画面とにらめっこです.

この他にも
> - 取引所固有の問題対策
> - 遅延対策
> - 変動出来高に合わせた適切な指値算出

をお話したいのでまた追って続編を書きたいと思います.

おまけ

同時間軸(bar)のOpen/Closeと時間前後で値がある場合両者検証

同時間軸(bar)のOpen/Closeで検証してみる.open→closeのはずなのにopenを検証値に使ったほうが未来を予想しやすい場合が多い(らしい)

時間逓減する情報にペナルティ(無価値係数)を与える

過去情報に対するペナルティ(w)を与える,たまに草になり森となり野に帰る.過去の騰落情報は時間軸次第では必要ない場合が多いから.

短期でテストしやすくする

テストが早く終われば,常々ウォークフォワードテストでき,現状により即した値で稼働できます.

取得保存しておくデータは少なくが基本,
多くしたくなるぼく凡人,賢者はイカにスプラトゥーンらしい

遅延は怖い!?

遅延は注文溜まりが起きるので起点で建玉を持てると大きな利益に繋がります.
察知方法としては,
- (難)各取引所で異常状態が起こっていないか監視する
- (不確定)SuperBusyなどの取引所定義
- (不確定)板乗りまでの時間で異常検出
- (易)webcoketが落ちる
- (易)大きな約定で検出

皆が集中して注文したい状況を検出し逆手に取ります.
例えば,フルレバレッジ勢が強制執行される値幅をクソポジから算出したり,大きな約定で値が動いたら強制執行の同方向注文を受け得る価格に指値を置いたりします.

おわりに

続編書いたら,2018年昇華しながらずっと使っていた低頻度ボットプログラムをgitlabで配布予定でいます.配布用にコードリファクタリング中,もうしばらくお待ちください🙇🙇