2015末~2016頭ぐらいに、DeepLearningを使って為替の予測にチャレンジしていました。
しばらくDeepLearningから遠ざかっていたので、思い出しがてら、その内容を書いていきます。

概要

現在の日付を$T$とすると、$T+1$から$T+30$までにおける日次価格の単純移動平均をDeepLearningを使って予測し、
image.png
ロングポジションを持った(もしくはショート)時の価格より、予測した移動平均を上(下)回れば利益確定するようなシミュレーション売買を行いました。また、30日保持したら強制的に手仕舞いするようにします。
エントリーは日時毎に残高があれば全力で行うようにします。
image.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
なお、学習時にはすべて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
ディープラーニングといっていいのか微妙ですが、wikipediaだと中間層3層から言っていいらしいので、一応銘打たせてもらってます。
活性化関数はReLU、最適化関数はAdamを使いました。ハイパーパラメータはChainerのデフォルトだったはずです。
ドロップアウトも使いましたが、あまり良い結果が出なかったと記憶してます。
出力層の活性化関数は$tanh$、誤差関数は二乗誤差です。

学習結果

訓練データ2000日分、テストデータ1325日で学習、検証しました。
特に良い結果の出た英ポンド対日本円の結果が以下になります。
どの結果もテスト期間の後半になってくると乖離が大きくなる傾向にありました。
市場のトレンドが変わってきているのが一因にあると思うので、LSTMなどの時系列に特化したモデルの方が上手く学習してくれるかもしれません。
image.png
全体の学習結果は以下になります。誤差は分散であらわしています。
image.png
スイスフランは2015年の大高騰の部分がちょうどテスト期間と重なってしまい、大きく乖離が出ています。
学習に使った入力データとの相関がないような値動きの予測はそもそも無理なので、ファンダメンタル要因で大きく値動きするような場合は単に過去の時系列データだけでは難しく、twitterやニュースなどの最新情報からをいち早く値動きに影響がでそうな部分を検知する必要があると思います。

トレーディングシミュレーション結果

簡単に自前でバックテストを組んで、行いました。
検証期間はテストデータ期間である2010/7/7~2015/12/11の1325日分です。
初期金額1000万、取引単位は1000通貨単位で、スプレッドも考慮しました。
ただ、データは上記の日次データのみを使っているので、実際のトレーディングにおいては細かく変動しているうえ、約定も決まるかどうかわからないので、バックテストとしての再現性は低いです。
image.png
image.png
image.png
やはり一番学習精度の高かったGBPで良い結果がでました。
逆にCHFは学習結果が悪かったので、トレーディングの結果も悪くなっています。

注意として、今回テスト期間の誤差を下限まで下げるように学習しているため、この学習結果はテスト期間で最適化されており、別の期間で同じ学習結果を用いてテストしても上手くいかない(過学習、とはちょっと違うかも?)可能性があります。(テスト期間後半になってくると乖離が大きくなってきているように、期間によって市場の動きの仕方が変わるなどがあるため)
なので、テスト期間外の検証期間を設けて実際のシミュレーションしたほうがよいのですが、今回はそれを行っていません。

まとめ

時系列データだけでもディープラーニングは為替予測でも結果を出してくれる可能性がありそうです。
色々課題は山積み(根拠のブラックボックス、ファンダメンタルのリスク回避、検証の不十分など)なので、他の検証結果や論文等を読んで勉強・検証していきたいと思います。改良、検証を重ねて儲かる自信があったら実運用もやってみたいですね。

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

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

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.