為替をDeepLearningで予測してみた話

#概要
現在の日付を$T$とすると、$T+1$から$T+30$までにおける日次価格の単純移動平均をDeepLearningを使って予測し、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179005/80f9afa4-7149-7af1-470a-bad570a374ab.png)
ロングポジションを持った（もしくはショート）時の価格より、予測した移動平均を上(下)回れば利益確定するようなシミュレーション売買を行いました。また、３０日保持したら強制的に手仕舞いするようにします。
エントリーは日時毎に残高があれば全力で行うようにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179005/39b50e2b-628f-de92-675f-82b63aaeadb6.png)
※オレンジのラインが30日後の30日単純移動平均になります。緑がx軸の日付時点における為替価格です。
#使用したDLフレームワーク
chainer ver1.3~1.5
ちょうどver1.5で互換性が大幅に変更になって、対応するのが大変でした。
2017/8現在はver2.0.2になっているみたいですね。

#使用データ
みずほヒストリカルデータ
https://www.mizuhobank.co.jp/rate/market/historical.html
以下、23通貨の日時データを使用しました。すべて対日本円です。太字になっている上位８通貨がトレーディングシミュレーションを検証した通貨になります。
（2002/4/1から2016/1/29までで、一日も欠かさず日次データがある通貨のみ）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179005/271c913d-1ec3-6681-0217-020881b74621.png)
なお、学習時にはすべて0-1で正規化しています。
##インプットデータ
上記23カ国の通貨、過去30日間分の日次データです。
このインプットデータを選んだ理由としては、それぞれの通貨における為替レートの変動はファンダメンタル、テクニカル要因から相関があるのではと推測したためです。

##教師データ
ある1通貨の30日後の30日単純移動平均を教師データとします。
今回は、日本のFX会社でよく使われる8通貨（上記データにおける太字の通貨）をそれぞれ予測しました。
ちなみに移動平均ではなく、一点予測（翌日の日次データを予測するなど）もいくつか試してみましたが、良い成果が得られませんでした。
やはり、ランダムウォークと言われているだけあって、一定期間のトレンドを予測するようでないと難しいのかもしれません。
※当時参考にしたもの↓（ここでも移動平均を使った予測で成果があったことを言っています。）
https://www.slideshare.net/t_koshikawa/predition
#学習モデル
中間層3層の単純なフィードフォワードNNです。
（入力層が690,中間層1が512,2が256,3が128,出力層が1)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179005/7030877b-79a6-b25e-bd10-ab540b468d53.png)
ディープラーニングといっていいのか微妙ですが、wikipediaだと中間層3層から言っていいらしいので、一応銘打たせてもらってます。
活性化関数はReLU、最適化関数はAdamを使いました。ハイパーパラメータはChainerのデフォルトだったはずです。
ドロップアウトも使いましたが、あまり良い結果が出なかったと記憶してます。
出力層の活性化関数は$tanh$、誤差関数は二乗誤差です。
#学習結果
訓練データ2000日分、テストデータ1325日で学習、検証しました。
特に良い結果の出た英ポンド対日本円の結果が以下になります。
どの結果もテスト期間の後半になってくると乖離が大きくなる傾向にありました。
単純に後出しジャンケン（前日のレートをそのまま予測値として出す）しているようではなさそうです。
市場のトレンドが変わってきているのが一因にあると思うので、学習期間と検証期間を細かく区切ったり、LSTMなどの時系列に特化したモデルの方が上手く学習してくれるかもしれません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179005/51af75bb-3c78-13c4-d16a-8cd3ce87020e.png)
全体の学習結果は以下になります。誤差は分散であらわしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179005/080d1fa7-bb23-0819-d528-b531daa3d97c.png)
スイスフランは2015年の大高騰の部分がちょうどテスト期間と重なってしまい、大きく乖離が出ています。
学習に使った入力データとの関連がないような値動きの予測はそもそも無理なので、ファンダメンタル要因で大きく値動きするような場合は単に過去の時系列データだけでは難しく、twitterやニュースなどの最新情報からをいち早く値動きに影響がでそうな部分を検知する必要があると考察します。
#トレーディングシミュレーション結果
簡単に自前でバックテストを組んで、行いました。
検証期間はテストデータ期間である2010/7/7~2015/12/11の1325日分です。
初期金額1000万、取引単位は1000通貨単位で、スプレッドも考慮しました。
ただ、データは上記の日次データのみを使っているので、実際のトレーディングにおいては細かく変動しているうえ、約定も決まるかどうかわからないので、バックテストとしての再現性は低いです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179005/49bcc6a2-8b78-14a8-232f-2e3b07903a98.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179005/95ddb640-5371-03a5-1444-8a08fdd48170.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179005/7674550a-9177-2bda-e429-74f5c74d811a.png)
やはり一番学習精度の高かったGBPで良い結果がでました。
逆にCHFは学習結果が悪かったので、トレーディングの結果も悪くなっています。

注意として、今回テスト期間の誤差を下限まで下げるように学習しているため、この学習結果はテスト期間で最適化されており、別の期間で同じ学習結果を用いてテストしても上手くいかない（カーブフィッティング）可能性があります。例えば、テスト期間後半になってくると乖離が大きくなってきているように、期間によって市場の動きの仕方が変わるなどです。
なので、テスト期間外の検証期間を設けて実際のシミュレーションしたほうがよいのですが、今回はそれを行っていません。
#まとめ
為替をディープラーニングでピッタリ予測するというのは難しいと思います。ですが、使用データや売買方法などの工夫次第で、時系列データだけからでもディープラーニングを用いたトレーディングは結果を出してくれる可能性がありそうです。もちろん、マーケットの傾向が変動するリスク等があるので、長期的に儲かるとはいかなそうですが。
色々課題は山積みなので、他の検証結果や論文等を読んで勉強・検証していきたいと思います。改良、検証を重ねて儲かる自信があったら実運用もやってみたいですね。

↓deeplearningを使った為替(FX)のトレードシステムを作るチュートリアル
http://qiita.com/jiji_platform/items/268377c542706e6f44b1

※投資は自己責任で
※この記事の内容で生じた損害については、当方は責任を負いかねますのでご了承ください。