FXトレードシステム（機械学習）開発

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

・機械学習の方法については[「この講座」](https://www.udemy.com/tensorflow_rnn/)と[「この書籍」](
https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-TensorFlow%E3%83%BBKeras%E3%81%AB%E3%82%88%E3%82%8B%E6%99%82%E7%B3%BB%E5%88%97%E3%83%87%E3%83%BC%E3%82%BF%E5%87%A6%E7%90%86-%E5%B7%A3%E7%B1%A0-%E6%82%A0%E8%BC%94-ebook/dp/B072JC21DH/ref=sr_1_4?ie=UTF8&qid=1514686411&sr=8-4&keywords=%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0)で学んだ方法をアレンジしながら作っています。

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

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

# 日々の予測のワークフロー
1. 為替相場は２４時間変動しているため、利用している証券会社の終値(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トレード実践ブログ](https://ameblo.jp/da-trader)

で公開しています。

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

[「機械学習」ができるプログラミング言語とは？](https://www.programming-fun.net/article/article_70.html)

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

■2018年2月2日追記

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

１月の予測結果は

|  日付             |終値|予測結果|収益（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](https://qiita-image-store.s3.amazonaws.com/0/96997/aa4c6ac5-75bf-4a1e-339a-3ed750e722ad.jpeg)


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

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

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

まず、

ML1(STEP1)

![nn_arc.jpg](https://qiita-image-store.s3.amazonaws.com/0/96997/f85be142-031f-e657-bc8a-83885caccaba.jpeg)

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

ML2(STEP2)

![nn_arc_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/96997/7455e31d-d818-2f97-a1fd-5e67c94bc1eb.jpeg)

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

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