Python
機械学習
FX
TensorFlow

FXトレードシステム(機械学習)開発

機械学習で「勝てるFXトレード」ができるのかを実践してみたいと思い、頭で考えるだけでは整理できなそうなのでメモしていきたいと思います。
※このメモの内容を元にFXトレードを実践した結果については、筆者は一切の責任を負いません。

・機械学習の方法については「この講座」「この書籍」で学んだ方法をアレンジしながら作っています。

※どのような技術を用いているのかは書いていきたいと思いますが、投資関連のプログラムは、不正な利用(公開されているプログラムの内容を利用して勝手に販売するなど)の可能性があるため、ソースコードは公開していません。

利用しているプログラム言語・フレームワークなど

プログラム言語は、データ分析用途で用いられることの多い「Python」を利用し、
機械学習フレームワークは「Tensorflow」を利用しています。
機械学習の手法は「リカレントニューラルネットワーク(RNN)」を利用し、為替データは、2010年3月中旬からの「終値」をベースとしているため、LSTM(Long Short Tem memory)を利用し長期時間依存性を考慮した予測を行っています。

日々の予測のワークフロー

  1. 為替相場は24時間変動しているため、利用している証券会社の終値(Bid)の値を元に学習データを作成。

  2. Tensorflowで次の日の終値が「上がる or 下がる」を予測

という非常にシンプルな手順です。

実際に試してみたところ、勝率が高いからといって、収益が必ずプラスになるとは限らないことがわかりました。

例えば、2017年の年末の相場を見てみると、

日付 終値 予測結果 収益(1万通貨を取引)
2017/12/29 112.682 ✖️ -3890
2017/12/28 112.867 1850
2017/12/27 113.332 4650
2017/12/26 113.22 1120
2017/12/25 113.29 700
2017/12/22 113.323 330
2017/12/21 113.31 ✖️ -130
2017/12/20 113.376 660
2017/12/19 112.884 ✖️ -4920
2017/12/18 112.538 ✖️ -3460

という予測結果と収支でしたが、12月18日〜29日の10日間の取引予想は、60%の正解でしたが、収益は -3090円 となっていました。

予想の正解率が高くてもポジションを立てるだけでは損失が発生してしまいます。

もし1000円の損切り決済注文を行なっていた場合は、

日付 終値 予測結果 収益(1万通貨を取引)
2017/12/29 112.682 ✖️ -1000(損切り)
2017/12/28 112.867 1850
2017/12/27 113.332 4650
2017/12/26 113.22 1120
2017/12/25 113.29 700
2017/12/22 113.323 330
2017/12/21 113.31 ✖️ -130
2017/12/20 113.376 660
2017/12/19 112.884 ✖️ -1000(損切り)
2017/12/18 112.538 ✖️ -1000(損切り)

となるため、収益は +12180円 となります。

機械学習で予測をした場合でも「損切り」は必ず入れておくことが収益増には必須と言えそうです。

日々の機械学習の予測結果は、

AI(人口知能)・システムFXトレード実践ブログ

で公開しています。

機械学習はPython一択と思いこんでいたのですが、案外そういうわけでも無さそうです。

「機械学習」ができるプログラミング言語とは?

また何か気づいたことがあればメモしていきたいと思います。

■2018年2月2日追記

損切を試した結果、利益確定前に決済をしてしまったり、損失幅を増やしてしまう結果が見受けられたため、損切投資は上手くいきませんでした。

1月の予測結果は

日付 終値 予測結果 収益(1万通貨を取引)
2018/1/3 112.293 ✖️ -2090
2018/1/4 112.502 ✖️ -2300
2018/1/5 112.732 ✖️ -3240
2017/1/8 113.056 ✖️ -240
2017/1/9 113.29 ✖️ -4420
2017/1/10 113.323 12030
2017/1/11 113.31 1600
2017/1/12 113.376 2330
2017/1/15 112.884 5210
2017/1/16 112.538 340
2017/1/17 112.538 ✖️ -8440
2017/1/18 112.538 2580
2017/1/19 112.538 2520
2017/1/22 112.538 1020
2017/1/23 112.538 6470
2017/1/24 112.538 10490
2017/1/25 112.538 ✖️ -1860
2017/1/26 112.538 7720
2017/1/29 112.538 ✖️ -3150
2017/1/30 112.538 -1820
2017/1/31 112.538 ✖️ -4360

となり、「24,030円」の利益が発生していました。

今後の予測

TensorFlowの予測結果ベクトルをグラフにしてみると、「あたりやすい」グラフと「はずれやすい」グラフがありそうです。

201801_graph.jpg

上部に赤いラベルがあるものが「あたり」で、青いラベルがあるものが「はずれ」です。

データは300次元のベクトルなので、これを新たにMLPで学習すると、予測結果ベクトルの精度を判定することができるのではないかと考えています。

そのため、現在使用しているRNN(LSTM)ともう一つMLPのNNを作る必要があります。

まず、

ML1(STEP1)

nn_arc.jpg

で予測結果ベクトルを取得し、それを

ML2(STEP2)

nn_arc_2.jpg

で判定しようという流れですが、問題は「予測結果ベクトル」が少なすぎて収集するのにも時間がかかります。

これまでの終値データはあるので、過去に遡って過去時点での予測結果ベクトルを取得する方法もありますが、やはり時間はかかりそうです。