日経平均先物を強化学習でトレードする(mt4シリーズPART2)

botを作成する工程の内で一番楽しいのがこの設計、即ち戦略策定のパートなので、先憂後楽でめんどくさい作業を先に仕上げてしまってからこれは最後にやろうと思ったのですが、ここが決まらないとこの先もぶれてしまうので今やってしまうことにしました。これを書いているのは2022/2/4の夜~2/5の朝なのですが、2/10までには一通り完成させてデモ運用までこぎつけたいと今のところは考えています。
2/12追記:終わりませんでした!とりあえずmodelを作るところまで完成しました


  ~ロードマップ~

・mt4からPythonにデータを渡す環境を整える
Python側でmt4の処理速度に合わせて売買判断ができるシステムを機械学習をベースとして作る←今ここ
Python側からmt4にデータを渡す環境を整える
・mt4の方で売買するためのプログラムおよびそのためのモジュールを作る
・デモ環境で数日動かして成果を確認する
・少額を投入して成行を見る
・もし問題なさそうであれば実践運用(3/1の予定)
・(VPS契約してmt4を動かす?それともpcを一台用意してずっと回す?)


botを作るにはもちろん戦略を決めなくてはいけないわけですが、「短いスパン(10分~15分)以内に確実に上昇/下降すると予測した場合にポジションを多めにとってエントリーし、目標とする時間に達するか利確/損切ラインに到達した時点でクローズ」という戦略に決定しました。
そもそもどうしてbotを使うか、ということを考えると、botのメリットとしては
①24時間常に監視できる ②感情に左右されずルールに則ってトレードできる ③自分を含む殆どの投資家より高いパフォーマンスを発揮できる ④注文を素早く正確に執行できる ことなどが主に上げられるかな、と思います。そしてこの作戦ではこの①~④の利点を存分に生かせている、というのが自分の考えです。

例えば51%の確率で投じた金額が二倍になって返ってくるが49%の確率で没収される、というギャンブルがあるとした場合、十分な回数プレイすることが出来れば恐らくすぐに大金持ちになれるはずなのは納得してもらえると思います(勿論確率的には破産もあり得ますが、、)。これをbotで再現したい、という考えが自分にはあります。
そのためには①のように常にマーケットを見張りチャンスを伺う必要があります。人間の及ばないスピードでbotがマーケットを監視し僅かな歪みをものにするわけです。またチャンスを見つけても注文が遅れたりためらったりしては台無しなので、④注文を素早く正確にかつ②感情にとらわれずに執行できる必要があります。更に裁量で2年近くトレードしてきた自分の実感としては、(株式ならともかく)為替や先物のトレンドを読むのは至極困難な行為です。そこで、⑤のように過去データを沢山食わせた機械学習を用いてトレンドを発見した方がはるかに合理的だろう、と自分は考えるわけです。

ここまではbotを使う優位性についてのみ述べて来ましたが、メリットがあればデメリットもある、ということでデメリットについて考えていきます。
まず一番の問題としては手数料があげられます。今回自分は日経平均先物のCFDを海外口座を使ってトレードするつもりなのですが、成行で注文を出すと大体0.05%ぐらいの手数料を取られます。これも高くはあるのですがFXに比べると若干安くなっています。(これが今回日経先物を選んだ理由でもあります。勿論指値で注文を出せばいいのですがbotの速度を考えるに恐らく追いつかないので今回は成行注文をベースにしていきます)いずれにせよ、一回のトレードで0.05%を大きく上回る利益を見込めないと行けないわけです。大きく上回る、と書いたのは予想が外れた場合のリカバリーがあるためです。

↑ここまで書いてから実際に色々検証してみたのですが、どれも実用的じゃない、というか、自分のお金を預けるには怖いところがあるな、と思い、結局教師あり学習では限界があるなと感じたので上にだらだら書いた内容を消した次第です。結局のところ強化学習しかないだろう、ということに落ち着きました。

強化学習はkeras_rlのDQNAgentを用いて、海外口座と同じ条件でほとんど同じ環境(レバレッジ500倍、証拠金維持率1000%(これは自分のリスク許容度)、成行スプレッド20円(日経平均先物の場合))で2021年の日経平均先物の一分足のデータおよびそれを基に作成したいくつかの特徴量をLSTMモデルの元で学習させました。(コード全体を乗せようかと思ったがボリュームも多い上に自己流で書いた拙い部分も多いので今回は割愛)

強化学習のAction_Spaceは買いと売りの二択にして(勿論現実にはホールドを選択する場合もあるだろうがここではドテン買いのシステムにした)、選択を変更した場合には毎度スプレッドを払う、というシステムにしました。海外口座fxの場合、一番の鬼門になるのはこのスプレッドの高さになるので、ずっとポジションを持ってることによって生じうる損失ないしはポジションを変えることで得られるかもしれない利益と、撤退して無駄に多く払うことになるスプレッドの間でのトレードオフをしっかり学習して欲しいという狙いがあります。

f:id:UTS1:20220213223848p:plain
横軸は経過した分数を、縦軸は誤ってprofit rate(%)と書いてあるが総資産(円)を表す

この学習結果を2022年に入って以降の日経平均先物についてテストした結果が上のグラフになります。過去データで実験しただけだし、ハイレバレッジを掛けている上の絵に描いた餅、ではあるのですが、100万円から始めて40日で最大一億円にまで到達しました。
見ての通りめちゃくちゃうまくいってるのですが、ただここ数年の研究では実験ではうまく行くのに本番だとてんでだめ、ということがしばしばあったので自分としてもとりあえず大きな失敗はしてないな、ということを確認する以上の意味はないと考えております。
ただ、ドローダウンが激しいので、仮に最初大きく損をすることになったとしてもそれを覚悟したうえで長いこと運用し続けることが大きな利益をもたらすという可能性は十分にあることがよく分かるグラフだと思いました。(今まで少々の損で撤退を決めてしまったシステムが沢山あるのでここは反省です)本来ならドローダウンを抑えるシステムを作るべきなのですがそれはいまだ技術力が及ばず。

次の記事ではFlaskを用いてlocalhost経由でmt4からPythonにデータを渡し、それをPython側で判断してその結果を送り返してトレードするシステム全体の骨格になる部分を作るところを書きたいと思っています。