機械学習でFXの予測をしてみる
目次
この記事の内容を使用して、いかなる損害を被ったとしても責任を負えないので、実際に試す場合は自己責任でお願いします。 また、機械学習にわかが書いている記事なので温かい目で見ていただけると幸いです。
この記事は、🎄GMOペパボエンジニア Advent Calendar 2022の18日目の記事です。
昨日は、june29さんの「ソフトウェアエンジニアが書いた文章をレビューするときに考えていること」でした。
時間のない人のためのまとめ この記事では、FXの日足過去データを使って翌日の終値を機械学習で予測をします。 データの正規化を、全体に対してまとめて行うのではなく学習のレンジごとに行い特徴が分かりやすくした状態で予測を行いました。 結果は学習レンジ5日で57%の正答率を出し、10万円開始の雑運用シミュレーションでは1年で+8万となりました。
はじめに
今回は、かねてから思いついて試してみたいと思っていたことをやってみます。
機械学習でFXの予測!!!
このテーマ自体は、自身の大学の卒業研究でも扱った内容なのですが、その際は以下のような内容でした。
【条件】
- データは、AUD/JPYの2010~2018の8年間の日足データを使用
- 終値、始値、高値、安値、25日平均を各値の8年分で正規化し入力データとして与える
- ネットワークは、LSTM、RNN、GRUの3つを使用しアンサンブル学習する
- 3つのネットワークを並列で予測させ、それぞれの予測結果の平均を最終的な予測値として評価する
モデルの図は下記のような感じです。
研究中に思っていたことは、エヴァのMAGIシステムっぽいなと思ってましたw この研究の結果は、だいたい54%の正答率で予測できるという結果になりました。 その予想をもとに資産運用を1年間してみたらというシミュレーションを行ったところ、初期資産50万円から1年で56,716円プラスとなる結果になりました。 でも、このモデル学習にめちゃくちゃ時間かかるし、1年でそこまでプラスにならないのでほかにもっといいモデルやデータの準備がないかなと思っていました。
そこで今回は
値ではなく、形に着目して学習させてみたいと思います。 今まで自分がやってきた正規化は、下記のようにテストデータすべての最大最小値を使用して正規化していました。
ですが、これだと特徴が分かりにくいんではないか? 加えて、数値が違うため同じような形と判断できずに学習しているのではないかと思いました。 なので、今回は下記のように学習させるレンジで正規化して特徴をとらえやすくしてみました。また似た形の場合は数値も似るはずなので結構いい感じに学習してくれるんではないかな~と思いました。
汎用をつけ忘れたので、ここに書いておきます。
青:終値
黄:始値
緑:高値
赤:安値
また、今までは明日の終値がいくらか?という風に予測をさせていましたが今回は明日の終値が上がっているか下がっているかの2択で予測をするようにしました。
やってみた
条件は、下記でやってみようと思います。
- データは、AUD/JPYの2010~2021の11年間の日足データを使用
- 終値、始値、高値、安値を各値の学習レンジで正規化し入力データとして与える
- 学習レンジは3日と5日で行う(なんとなくで選定)
- ネットワークは、LSTMを使用する
- 検証は、2022年の日足データを使用する
コードは下記で確認できます。
使用したデータは下記です。
学習の様子は下記のようになりました。 学習レンジ3日の場合
学習レンジ5日の場合
損失はきれいに減っていっているけど、正答率がぐちゃぐちゃですね。 しっかり学習できてなさそう。。。
とりあえず2022年のデータで予測させてみたらどうなるのか検証してみます。 検証シートは下記です。
変化率の個所を見てプラスの変化であればupと判断し、予測と比較し予測もupであれば正誤にOKと出すようにしました。 これで見てみると、3日のほうが50%の正答率5日のほうが57%の正答率となりました。 57%!? 意外と特徴とらえて予測できているのかも?
細かい設定(ロスカットなどの考慮)とかおいておいて、5日のほうで運用してたらだいたいいくらくらいになるのか雑に確かめてみました。 方法的には、10万を初期資産だとして、予想があっている場合その日の変化率を資産にかけた額を足していくというものです。 逆に予想が外れていれば、変化率をかけた金額をマイナスします。 結果は下記のとおりです。
上がり下がりしながらも、最終的には¥188,550になっているという結果がでました。
+88,550円
あまりにも出来すぎている。。。。 おかしい どこかで、予測データの中に正解がまぎれてしまっているのではないか? そう疑ってしまうような結果です。 ここがおかしそうだと気づいた方、ぜひコメントください。
まとめ
今回はかねてから試してみたかった方法を用いてFXの予測を行いました。 結果は疑いしかないものとなってしまいましたが、試みとしては面白かったのではないかと思います。 もっと正答率あげるために、別の活性化関数と損失関数の組み合わせを試してみたり、学習レンジを変えてみたり、入力データに平均線をいれてみたり、モデルもアンサンブル学習するように変えてみたりいろいろできることがあると思います。 また時間があれば別のパターンを試してみたいと思います。 何か意見や気付き等ありましたら是非コメントください~