AIによるFX予測キット。正解率は人以上!!

正解率60%弱のFX予測AIを作ったよ。詳しく紹介するね。

趣旨

当記事について

kerasとLSTMを使ってFX予測AIを作りました。正解率は60%弱です。
大抵の人はFXで正解率60%弱など出ません。これは驚異的な数値なので詳しくやり方を紹介します。
※本記事ではディープラーニングにより作成したモデルをAIと記載します。※

1.AIでFX予測を行う仕組み

LSTM(Long short-term memory)を使ってFXの未来予測をしました。

興味がある方はこちらの記事を参照ください
↓↓↓
kerasとLSTMで未来予測を行う方法をどこよりも詳しく紹介します

2.AIによるFX予測結果

まずは論より証拠。
AIによるFX予測結果をご紹介します。

AIによるFXの予測方法

2018年のFX(ドル円)の日次データをAIに学習させました。
学習したAIを持ちて、2019年の各日の終値および過去25日のデータを元に、1日後、3日後、5日後、10日後、20日後の終値を予測させました。

AIによるFXの予測結果(グラフ)

AIのFX予測

  • real(diff) ・・・ 実際の値動き(前日比)
  • ai(diff) ・・・ AI予測(前日比)
  • real ・・・ 実際の値動き
  • ai ・・・ AI予測

すごい綺麗な予測だと思いませんか??
AIを知っている人から見ると、「そんなわけない。何かやり方間違っているんじゃない?AIに未来の情報を実は与えていない?」と思われるくらい良く出来た予測です。
でも、やり方は間違ってません!!詳しいやり方も次節以降で紹介しますが、AIが未来の情報を全く知らない状態で20日先まで予想させています。

AIによるFXの予測結果(グラフ)1年分

※ クリックすると大きい画像が開きます。
AIのFX予測1AIのFX予測2
AIのFX予測3AIのFX予測4
AIのFX予測5AIのFX予測6

グラフを見る限り良い感じなグラフが多い。
まあ、合っている時と、そうで無い時がありますが・・・、2018年のデータを元に学習しているから、2019年の中盤からは外すことが多い気がする。

AIによるFXの予測結果(CSV)1年分

グラフだと何となく合ってそうくらいしか分からないので、数字でも出してみました。

FX予測評価1
FX予測評価2

AIによるFXの予測の精度

10日後のAI予測の正解率が脅威の58%です。

えっ?大したことなくない?って思われた方もいると思いますが、そんなことありません。FXや株の値動きはランダムウォークと言われています。極端な表現をすると、FXや株の値動きに法則なんてないよ! サルがサイコロ振って予測しても人が予測しても正解率はどっちも1/2だよという理論です。しかも、不思議なことに、現実では、大半の方のFXの正解率は1/2も行きません。

それが、AIの場合、正解率が58%です。
試行回数が200以上なので、たまたまという分けでもなさそうです。

話が横道にそれますが、
チャートで勝っている人は実在するけど、でも、それはたまたまで、市場はランダムウォークなのかな・・・と思い始めていましたが、この結果は自分の中で光明です。市場はランダムウォークではなくテクニカル分析で予測できるという証拠だと思います。俄然やる気がでました。

3.AIによるFX予測の方法

自作のFX予測AIキット

https://github.com/shibayu2002/MLLib
※ そのままだとデータが無いので動かないです。ここでは説明割愛します。そのあたりは読み解いてデータ用意して下さい。要望があればそのうち詳しく記事にします。

FX予測AIキットの免責事項

著作権

本ツールは無料で公開しておりますが、著作権を放棄しておりません。 著作権はぴよ猫に帰属します。

ソフトウェアの修正、複製、再配布

本ツールは個人利用に限り自由に使用して頂いて構いません。商業利用や無断で改変・再配布・設置することは出来ません。

ソフトウェアを使用したことによる損害、保証等

投資は自己責任です。
本ツールを使用したことによる一切の損害(一次的、二次的に関わらず)に対し、ぴよ猫は責任を負いません。

FX予測AIキットの実行方法と実行結果

FX為替データ予測AIモデルの学習の実行

[user1@xxx fx_lstm]# python monthFXML.py tran
INFO:user1:this target is [tran]
INFO:user1:dataset is [./tran.csv]
INFO:user1:-- data label---- --------------------------
INFO:user1:        label
0    20180201
1    20180202
2    20180204
3    20180205
4    20180206
..        ...
281  20181226
282  20181227
283  20181228
284  20181230
285  20181231

[286 rows x 1 columns]
INFO:user1:-- data tran_In(x) --------------------------
INFO:user1:       x1    x2    x3    x4    x5    x6    x7    x8    x9  ...   x17   x18   x19   x20   x21   x22   x23   x24   x25
0    0.32  0.22  0.38 -0.03  0.04 -0.53 -1.21 -0.19 -0.19  ...  0.25 -0.67 -1.08  0.47 -0.97 -0.02  0.32 -0.22  0.44
1    0.22  0.38 -0.03  0.04 -0.53 -1.21 -0.19 -0.19  0.08  ... -0.67 -1.08  0.47 -0.97 -0.02  0.32 -0.22  0.44  0.26
2    0.38 -0.03  0.04 -0.53 -1.21 -0.19 -0.19  0.08 -0.59  ... -1.08  0.47 -0.97 -0.02  0.32 -0.22  0.44  0.26  0.78
3   -0.03  0.04 -0.53 -1.21 -0.19 -0.19  0.08 -0.59 -0.08  ...  0.47 -0.97 -0.02  0.32 -0.22  0.44  0.26  0.78  0.02
4    0.04 -0.53 -1.21 -0.19 -0.19  0.08 -0.59 -0.08  0.90  ... -0.97 -0.02  0.32 -0.22  0.44  0.26  0.78  0.02 -1.14
..    ...   ...   ...   ...   ...   ...   ...   ...   ...  ...   ...   ...   ...   ...   ...   ...   ...   ...   ...
281  0.27 -0.15 -0.18  0.17  0.11 -0.10 -0.87  0.39 -0.42  ...  0.10 -0.50 -0.34 -0.06 -1.14  0.02 -0.26 -0.59 -0.23
282 -0.15 -0.18  0.17  0.11 -0.10 -0.87  0.39 -0.42 -0.06  ... -0.50 -0.34 -0.06 -1.14  0.02 -0.26 -0.59 -0.23  1.08
283 -0.18  0.17  0.11 -0.10 -0.87  0.39 -0.42 -0.06 -0.03  ... -0.34 -0.06 -1.14  0.02 -0.26 -0.59 -0.23  1.08 -0.38
284  0.17  0.11 -0.10 -0.87  0.39 -0.42 -0.06 -0.03  0.63  ... -0.06 -1.14  0.02 -0.26 -0.59 -0.23  1.08 -0.38 -0.54
285  0.11 -0.10 -0.87  0.39 -0.42 -0.06 -0.03  0.63  0.13  ... -1.14  0.02 -0.26 -0.59 -0.23  1.08 -0.38 -0.54 -0.08

[286 rows x 25 columns]
Train on 257 samples, validate on 29 samples
Epoch 1/100
257/257 [==============================] - 1s 4ms/step - loss: 0.1718 - val_loss: 0.2187
Epoch 2/100
257/257 [==============================] - 0s 2ms/step - loss: 0.1704 - val_loss: 0.2281
Epoch 3/100
257/257 [==============================] - 0s 1ms/step - loss: 0.1697 - val_loss: 0.2325
Epoch 4/100
257/257 [==============================] - 0s 1ms/step - loss: 0.1694 - val_loss: 0.2326
Epoch 5/100
・・・
Epoch 21/100
257/257 [==============================] - 0s 1ms/step - loss: 0.1666 - val_loss: 0.2289
INFO:user1:model_file saved to ./model/model.json
INFO:user1:hdf5_file saved to ./model/param.hdf5
INFO:user1:tran_result saved to ./result/tran_result.png

FX為替データ予測AIモデルの学習結果(tran_result.png)

教師データと学習モデルで予測した結果を比較したグラフです。
2018年のFXの実際の値動き(前日比)の実際の値と、AIによる予測の結果です。うーん。合っているかこれだけだと分からんな・・・。
FX予測評価2

AIによるFXの未来予測の実行

[user1@vxxx fx_lstm]# python monthFXML.py test
INFO:user1:this target is [test]
INFO:user1:dataset is [./test.csv]
INFO:user1:-- data label---- --------------------------
INFO:user1:        label
0    20190222
1    20190224
2    20190225
3    20190226
4    20190227
..        ...
230  20191118
231  20191119
232  20191120
233  20191121
234  20191122

[235 rows x 1 columns]
INFO:user1:-- data tran_In(x) --------------------------
INFO:user1:       x1    x2    x3    x4    x5    x6    x7    x8    x9  ...   x17   x18   x19   x20   x21   x22   x23   x24   x25
0   -2.97  1.11  0.62  0.03  0.18  0.16 -0.66  0.15  0.23  ... -0.13 -0.29  0.23  0.00  0.08 -0.11 -0.23  0.06 -0.30
1    1.11  0.62  0.03  0.18  0.16 -0.66  0.15  0.23 -0.03  ... -0.29  0.23  0.00  0.08 -0.11 -0.23  0.06 -0.30 -0.23
2    0.62  0.03  0.18  0.16 -0.66  0.15  0.23 -0.03 -0.35  ...  0.23  0.00  0.08 -0.11 -0.23  0.06 -0.30 -0.23  0.71
3    0.03  0.18  0.16 -0.66  0.15  0.23 -0.03 -0.35  0.49  ...  0.00  0.08 -0.11 -0.23  0.06 -0.30 -0.23  0.71 -0.06
4    0.18  0.16 -0.66  0.15  0.23 -0.03 -0.35  0.49  0.47  ...  0.08 -0.11 -0.23  0.06 -0.30 -0.23  0.71 -0.06  0.44
..    ...   ...   ...   ...   ...   ...   ...   ...   ...  ...   ...   ...   ...   ...   ...   ...   ...   ...   ...
230  0.14 -0.02  0.26 -0.46 -0.67 -0.22  0.11 -0.20  0.64  ... -0.03 -0.02 -0.25  0.05  0.20 -0.28  0.25  0.01  0.01
231 -0.02  0.26 -0.46 -0.67 -0.22  0.11 -0.20  0.64 -0.28  ... -0.02 -0.25  0.05  0.20 -0.28  0.25  0.01  0.01  0.07
232  0.26 -0.46 -0.67 -0.22  0.11 -0.20  0.64 -0.28  0.23  ... -0.25  0.05  0.20 -0.28  0.25  0.01  0.01  0.07  0.24
233 -0.46 -0.67 -0.22  0.11 -0.20  0.64 -0.28  0.23  0.76  ...  0.05  0.20 -0.28  0.25  0.01  0.01  0.07  0.24 -0.10
234 -0.67 -0.22  0.11 -0.20  0.64 -0.28  0.23  0.76  0.26  ...  0.20 -0.28  0.25  0.01  0.01  0.07  0.24 -0.10 -0.08

[235 rows x 25 columns]
INFO:user1:-- data tran_Out(y) -------------------------
INFO:user1:       y1    y2    y3    y4    y5    y6    y7    y8    y9  ...   y12   y13   y14   y15   y16   y17   y18   y19   y20
0   -0.23  0.71 -0.06  0.44  0.04 -0.02 -0.17  0.02  0.02  ...  0.56 -0.53 -0.02  0.09  0.04 -0.02  0.19 -0.06 -0.04
1    0.71 -0.06  0.44  0.04 -0.02 -0.17  0.02  0.02  0.58  ... -0.53 -0.02  0.09  0.04 -0.02  0.19 -0.06 -0.04  0.10
2   -0.06  0.44  0.04 -0.02 -0.17  0.02  0.02  0.58  0.07  ... -0.02  0.09  0.04 -0.02  0.19 -0.06 -0.04  0.10  0.27
3    0.44  0.04 -0.02 -0.17  0.02  0.02  0.58  0.07  0.56  ...  0.09  0.04 -0.02  0.19 -0.06 -0.04  0.10  0.27 -0.49
4    0.04 -0.02 -0.17  0.02  0.02  0.58  0.07  0.56 -0.53  ...  0.04 -0.02  0.19 -0.06 -0.04  0.10  0.27 -0.49  0.31
..    ...   ...   ...   ...   ...   ...   ...   ...   ...  ...   ...   ...   ...   ...   ...   ...   ...   ...   ...
230  0.07  0.24 -0.10 -0.08 -0.79  0.19  0.03  0.48  0.45  ... -0.06  0.01 -0.18 -0.05 -0.19 -0.31  0.32 -0.11 -0.03
231  0.24 -0.10 -0.08 -0.79  0.19  0.03  0.48  0.45 -0.24  ...  0.01 -0.18 -0.05 -0.19 -0.31  0.32 -0.11 -0.03 -0.21
232 -0.10 -0.08 -0.79  0.19  0.03  0.48  0.45 -0.24  0.36  ... -0.18 -0.05 -0.19 -0.31  0.32 -0.11 -0.03 -0.21  0.02
233 -0.08 -0.79  0.19  0.03  0.48  0.45 -0.24  0.36 -0.06  ... -0.05 -0.19 -0.31  0.32 -0.11 -0.03 -0.21  0.02  0.10
234 -0.79  0.19  0.03  0.48  0.45 -0.24  0.36 -0.06  0.01  ... -0.19 -0.31  0.32 -0.11 -0.03 -0.21  0.02  0.10  0.05

[235 rows x 20 columns]
INFO:user1:model_file load from ./model/model.json
INFO:user1:-- data start curIn(x) --------------------------
INFO:user1:25
・・・
INFO:user1:predict_result saved to ./result/predict_result{0}.png

AIによるFXの未来予測結果

これで冒頭で紹介した2019年度のFX為替予測結果が作成されます。

AIのFX予測

AIによるFXの未来予測についての補足

AIには2018年分のデータしか渡していないので、これはAIにとって未来予測です。

具体的にはAIに以下のことをさせています。

  • AIに2018年度のFXデータを渡して学習モデルを作成する
  • 作成した学習モデルに基準日の過去25日分(基準日含む)を渡して基準日の1日後の値動きを予測する
  • AIが予測した未来の値動きを元に、更にAIに次の日の値動きを予測させる。
  • これを繰り返し20日先の未来を予測する。

4.大公開FX予測AIプログラム

詳しい解説は省きますが、プログラムを公開します。
AIによるFX予測に興味がある方は参考にして下さい。
また、もし、やり方に間違いあったら指摘して下さい。

monthFXML.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from MLLib import LstmML as LstmML
import logging
import sys
import MySQLdb
import csv
import numpy as np

def connectDB():
  con = MySQLdb.connect(
      host='xxx',
      user='xxx',
      passwd='xxx',
      db='xxx',
      use_unicode=True,
      charset="utf8")
  return con

# 為替データCSVの作成
def makeCsvDataset(_from, _to, _path, x_size = 1, y_size = 1):
  con = connectDB()
  try:
    cur = con.cursor()
    cur.execute("select A.date, A.close "\
               "from cur_price A inner join ("\
               "select date, max(time) as time "\
               "from cur_price "\
               "where ticker = 'USDJPY' and date >= '" + _from + "' and date <= '" + _to +"'"\
               "group by date"\
               ") B on A.date = B.date and A.time = B.time "\
               "where A.ticker = 'USDJPY' and A.date >= '" + _from +"' and A.date <= '" + _to + "'"\
               "order by A.date")
    res = cur.fetchall()

    head = ['label']
    for i in range(1, 1 + x_size):
      head.append('x' + str(i))
    for i in range(1, 1 + y_size):
      head.append('y' + str(i))

    pre_price = -1
    with open(_path, 'w') as f:
      writer = csv.writer(f)
      writer.writerow(head)

      cols = []
      for r in res:
        date = r[0]
        price = r[1]
        if pre_price == -1:
          pre_price = price
        else:
          diff = price - pre_price
          if len(cols) == x_size + (y_size - 1):
            col = cols.pop(0)
            col.insert(0, date)
            col.append(diff)
            writer.writerow(col)
          for col in cols:
            col.append(diff)
          cols.append([diff])
          pre_price = price
  finally:
    con.close()

# メイン処理
if __name__ == "__main__":
  logging.basicConfig(level=logging.INFO)
  mode = sys.argv[1]

  # 為替データ予測CSVの作成
  if mode == 'make':
    makeCsvDataset('20180101', '20181231', 'tran.csv', 25, 1)
    makeCsvDataset('20190101', '20191231', 'test.csv', 25, 20)
    exit()

  # Lstm学習キット生成
  ml = LstmML(25, 1, 300)
  ml.epochs = 100
  ml.predict_term = 20  # 20日先を予測
  ml.multi_result = 3   # おまじない(学習による減衰予防)

  # 学習と予測の実行
  ml.run(sys.argv[1])

BaseML.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from abc import ABCMeta, abstractmethod
from pandas import Series,DataFrame
from keras.callbacks import EarlyStopping
from keras import models
import pandas as pd
import numpy as np
import logging

# ML基底クラス
class BaseML(metaclass=ABCMeta):
  tran_ds_file = './tran.csv'  # 学習用データファイル
  test_ds_file = './test.csv'  # テスト用データファイル
  tran_result = './result/tran_result.png' # 学習結果ファイル
  predict_result = './result/predict_result{0}.png' # 予想結果ファイル
  predict_result_csv = './result/predict_result.csv' # 予想結果ファイル(csv)
  model_file = './model/model.json' # モデルファイル
  hdf5_file = './model/param.hdf5' # 学習済パラメタファイル
  batch_size = 300 # バッチサイズ
  epochs = 100 # Epochs
  validation_split = 0.1  # 学習データの中の訓練データとテストデータの割合

  # コンストラクタ
  def __init__(self):
    self._label = None      # ラベルデータ
    self._tran_In = None    # 入力データ
    self._tran_Out = None   # 出力データ(教師データ)
    self.model = None       # 学習モデル

  # メイン処理
  def run(self, t='all'):
    logging.info('this target is [' + t + ']')

    # 学習と予測を実施
    if t == 'all':
      self.init('tran')
      self.tran()
      self.init('test')
      self.predict()
    # 学習のみ実施
    elif t == 'tran':
      self.init('tran')
      self.tran()
    # 予測のみ実施
    elif t == 'test':
      self.init('test')
      self.predict()
    # パラメタエラー
    else:
      print("run('all' | 'tran' | 'test')")

  # 準備処理(学習データの読み込み)
  def init(self, t):
    path = self.tran_ds_file
    if t == 'test':
      path = self.test_ds_file

    logging.info('dataset is [' + path + ']')
    csv = pd.read_csv(path, sep=',', header=0)

    logging.info('-- data label---- --------------------------')
    self._label = csv.loc[:, csv.columns.str.contains('label.*')]
    logging.info(self._label)
    logging.info('-- data tran_In(x) --------------------------')
    self._tran_In = csv.loc[:, csv.columns.str.contains('x.*')]
    logging.info(self._tran_In)

    logging.info('-- data tran_Out(y) -------------------------')
    self._tran_Out = csv.loc[:, csv.columns.str.contains('y.*')]
    logging.info(self._tran_Out)

  # 学習
  def tran(self):
    # 学習
    early_stopping = EarlyStopping(monitor='val_loss', mode='auto', patience=20)
    self.model.fit(self._tran_In, self._tran_Out,
      batch_size = self.batch_size,
      epochs = self.epochs,
      validation_split = self.validation_split,
      shuffle = False,
      callbacks=[early_stopping]
      )
    # 学習済モデル保存
    json = self.model.to_json()
    with open(self.model_file, mode='w') as f:
      f.write(json)
    logging.info('model_file saved to ' + self.model_file)
    # 学習済パラメタ保存
    self.model.save_weights(self.hdf5_file)
    logging.info('hdf5_file saved to ' + self.hdf5_file)
    # 学習結果を描画
    out = self.model.predict(self._tran_In)
    self.draw_tran_result(self._tran_Out, out)
    logging.info('tran_result saved to ' + self.tran_result)

  # 学習結果の描画(派生クラスで実装する)
  @abstractmethod
  def draw_tran_result(self, expected, actual):
    pass

  # 予測
  def predict(self):
    # 学習済モデル読込
    with open(self.model_file) as f:
      json = f.read()
    self.model = models.model_from_json(json)
    logging.info('model_file load from ' + self.model_file)
    # 学習済パラメタの読み込み
    self.model.load_weights(self.hdf5_file)
    # 予測処理
    expected_diff, actual_diff, expected, actual= self.predict_impl()
    # 予測結果を描画
    self.draw_predict_result(self._label, expected_diff, actual_diff, expected, actual)
    logging.info('predict_result saved to ' + self.predict_result)

  # 予測処理の実態(派生クラスで実装する)
  @abstractmethod
  def predict_impl(self):
    pass

  # 予測結果の描画(派生クラスで実装する)
  @abstractmethod
  def draw_predict_result(self, label, expected_diff, actual_diff, expected, actual):
    pass

LstmML.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.layers.recurrent import LSTM
from keras.optimizers import Adam
from .BaseML import BaseML as BaseML
import numpy as np
import matplotlib.pyplot as plt
import logging
import csv

class LstmML(BaseML):
  predict_term = 100 # 予測期間
  multi_result = 1   # 予想結果の増幅倍率

  # コンストラクタ
  def __init__(self, in_size, out_size, n_hidden):
    super().__init__()

    # LSTM学習モデルの生成
    self.model = Sequential()
    self.model.add(LSTM(n_hidden, batch_input_shape=(None, in_size, out_size), return_sequences=False))
    self.model.add(Dense(out_size))
    self.model.add(Activation("linear"))
    optimizer = Adam(lr=0.001)
    self.model.compile(loss="mean_squared_error", optimizer=optimizer)

  # 準備処理(学習データの読み込みと加工)
  def init(self, t):
    super().init(t)

    # 親クラスで読み込んだ学習データをLSTMで扱える様に加工
    logging.info('-- reshape data tran_In --------------------------')
    x = self._tran_In
    self._tran_In = np.array(x).reshape(len(x), x.shape[1] , 1)
    logging.info(len(self._tran_In))

    logging.info('-- reshape data tran_Out --------------------------')
    y = self._tran_Out
    if t == 'tran':
      self._tran_Out = np.array(y).reshape(len(y), 1)
    else:
      self._tran_Out = np.array(y).reshape(len(y), y.shape[1])
    logging.info(len(self._tran_Out))

  # 学習結果の描画
  def draw_tran_result(self, expected, actual):
    actual = actual * self.multi_result
    plt.figure()
    plt.plot(range(0, len(expected)), expected, color="r", label="real")
    plt.plot(range(0, len(actual)), actual, color="b", label="ai")
    plt.legend()
    plt.savefig(self.tran_result)
    plt.close()

  # 予測処理の実態(LSTM未来予測)
  def predict_impl(self):
    expected_diff = []
    actual_diff = []
    expected = []
    actual = []

    i = 0
    for curIn in self._tran_In:
      logging.info('-- data start curIn(x) --------------------------')
      logging.info(len(curIn))

      # 指定された期間まで順番に予測する
      # 0 = 学習データの最後
      # 1~ = 未来の予測
      outSumDiff = np.empty((0))
      outSum = np.empty((0))
      tmpSum = 0
      term = 0
      while term < self.predict_term:
        # 1つ先の未来を予測
        curOut = self.model.predict(np.reshape(curIn, (1, len(curIn), 1)))
        # 予測結果をcurInの最後に追加。一番古いcurInの値は削除
        curIn = np.delete(curIn, 0)
        curIn = np.append(curIn, curOut)
        # 予想結果が減衰しているっぽいので増幅
        curOut = curOut * self.multi_result
        # 予測結果を予測結果集計に追加
        outSumDiff = np.append(outSumDiff, curOut)
        tmpSum = tmpSum + curOut
        outSum = np.append(outSum, tmpSum)
        if (term != 0) and (term % 10 == 0):
          logging.info('term ' + str(term) + ' finished.')
        term += 1
      actual_diff.append(outSumDiff)
      actual.append(outSum)

      ySumDiff = np.empty((0))
      ySum = np.empty((0))
      tmpY = 0
      for y in self._tran_Out[i]:
        ySumDiff = np.append(ySumDiff, y)
        tmpY = tmpY + y
        ySum = np.append(ySum, tmpY)
      expected_diff.append(ySumDiff)
      expected.append(ySum)
      i = i + 1
    return expected_diff, actual_diff, expected, actual

  # 予測結果の描画
  def draw_predict_result(self, label, expected_diff, actual_diff, expected, actual):
    with open(self.predict_result_csv, 'w') as f:
      writer = csv.writer(f)
      header = []
      header.append('label')
      for i in range(0, len(expected[0])):
        header.append('y' + str(i + 1))
      for i in range(0, len(actual[0])):
        header.append("y'" + str(i + 1))
      writer.writerow(header)

      for i in range(0, len(actual)):
        plt.figure()
        plt.plot(range(0, len(expected_diff[i])), expected_diff[i], color="g", linestyle="dotted", label="real(diff)")
        plt.plot(range(0, len(actual_diff[i])), actual_diff[i], color="y", linestyle="dotted", label="ai(diff)")
        plt.plot(range(0, len(expected[i])), expected[i], color="r", label="real")
        plt.plot(range(0, len(actual[i])), actual[i], color="b", label="ai")
        plt.legend()
        plt.savefig(self.predict_result.format(label.iloc[i,0]))
        plt.close()

        row = []
        row.append(label.iloc[i,0])
        row.extend(expected[i])
        row.extend(actual[i])
        writer.writerow(row)

FX予測AIキットの工夫した点

LSTMにFXの過去データを食わせただけだと、良い予想にならなかったので、すこしデータなどをチューニングしました。

  • 学習データが多すぎると逆に精度が下がるので一番良さそうな学習データ量を探した
  • AI予測のFX為替騰落幅はどうも幅が小さいので、減衰を増幅してみた
  • 増幅をどれくらいにすればよいか適量を探した

5.AI FX予測の今後の展望

かなり良い結果だと思います。
市場が大きく動いた時に外している感はあるので、そこを注意すれば参考にはなるかと。

ただ、まだまだ心もとないので、もう少し工夫してみます。改善したらまた記事にするので応援宜しくお願いします。

せっかくうまくいくかもしれないので、検証結果を毎日掲載することにしました。
https://aidefx.hatenablog.com/

試したいこと

  • 日次の予測ではなく分次の予測にする(10日待つなんて怖すぎるから((((;゚Д゚))))ガクガクブルブル)
  • とりあえず、本当の未来でどこまで当たるか試してみる
  • 終値だけでなく、始値/高値/安値も読み込んだらどうなるか試してみる

本日は以上です。少しでも記事がお役に立てば幸いです。

がんばろー

広告




スポンサーリンク
広告




広告




シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
広告