前提・実現したいこと
Keras を使った LSTM で、FXチャートの予測を行おうとしています。
発生している問題・エラーメッセージ
予測結果が実際のデータと乖離しており、その原因が不明な状態です。
該当のソースコード
データ構造
入力データがチャートの値(価格の変化率)を表し、それを24個まとめたものを一つの学習データとしています
それを一時間づつずらし、合計 15000 個のデータを作っています
# input_data_list_train[0] array([[0.62224413], [0.66206642], [0.6454561 ], [0.61505502], [0.62129441], [0.62455067], [0.61315435], [0.60636639], [0.63473543], [0.60595753], [0.61952831], [0.63188613], [0.62686003], [0.6337822 ], [0.6303857 ], [0.64639128], [0.64555965], [0.62278596], [0.60192606], [0.61492496], [0.6166857 ], [0.62427806], [0.62102386], [0.62495597]]) # input_data_list_train[1] array([[0.66206642], [0.6454561 ], [0.61505502], [0.62129441], [0.62455067], [0.61315435], [0.60636639], [0.63473543], [0.60595753], [0.61952831], [0.63188613], [0.62686003], [0.6337822 ], [0.6303857 ], [0.64639128], [0.64555965], [0.62278596], [0.60192606], [0.61492496], [0.6166857 ], [0.62427806], [0.62102386], [0.62495597], [0.6320059 ]]) # input_data_list_train[14999] array(・・・
上のデータに対するラベルは次のような構造で、
例えば input_data_list_train[0] が 0時から24時の価格を表した場合、
そのラベル(=予測したい値)label_data_list_train[0] は 25時 の価格を表しています。
# label_data_list_train[0] array([0.6320059]) # label_data_list_train[1] array([0.62942768]) # label_data_list_train[14999] array(・・・
モデル構築
python
1from keras.layers import Dense, Activation, SimpleRNN, LSTM 2from keras.optimizers import Adam 3from keras.models import Sequential 4 5CHUNK_LENGTH = 24 6HIDDEN_SIZE = 128 7BATCH_SIZE = 64 8NUM_ITERATIONS = 1 9NUM_EPOCHS_PER_ITERATION = 5 10NUM_PREDS_PER_EPOCH = 1 11INPUT_SIZE = 1 12OUTPUT_SIZE = 1 13 14model = Sequential() 15model.add(LSTM(HIDDEN_SIZE, stateful=False, batch_input_shape=(None, CHUNK_LENGTH, INPUT_SIZE))) 16model.add(Dense(OUTPUT_SIZE)) 17model.add(Activation('linear')) 18optimizer = Adam(lr=1e-5) 19model.compile(loss='mean_squared_error', optimizer=optimizer)
from keras.callbacks import EarlyStopping for iteration in range(NUM_ITERATIONS): print('=' * 20) print('Iteration #: %d' % (iteration)) model.fit( input_data_list_train, label_data_list_train, batch_size=BATCH_SIZE, epochs=NUM_EPOCHS_PER_ITERATION, shuffle=False )
未来予測
# 未来予測 import numpy as np # 学習データの末尾より、24時間分の価格を予測します FUTURE_PREDICTION_NUM = 24 predicted = [] input_data_list_prediction = input_data_list_test[len(input_data_list_test) - 1:] for i in range(FUTURE_PREDICTION_NUM): _predict_data = input_data_list_prediction[i : i + 1] _predicted = model.predict(_predict_data, batch_size=BATCH_SIZE) # 入力データの先頭を除き、末尾に予測を加え、新たな入力データを作成 next_chunk = np.append(input_data_list_prediction[i][1:], np.array(_predicted[0])).reshape(CHUNK_LENGTH, 1) # numpyArray を list に戻し、多次元配列同士を結合、その後 numpyArray に戻す _tmp_list = input_data_list_prediction.tolist() _tmp_list.append(next_chunk) input_data_list_prediction = np.array(_tmp_list) predicted.append(_predicted)
次のような流れになっています
- 末尾の学習データ(0時~24時のチャートの値)の、一時間後の価格を予測
- 予測した結果を学習データの末尾に加える
- 一時間後ろにずらしたデータを作る(1時~25時分のデータを作る)(25時のデータは予測で取れた値)
- 1時~25時のチャートの値の、一時間後の価格を予測
- 予測した結果を学習データの末尾に加える
これを24回繰り返す
結果
以下の画像は末尾の学習データより24時間以降のチャート変化率をプロットしたものです。
- 青
実際のデータ
- 赤
求める結果
実際のデータに近くなくとも、はっきりと価格の上下が表れるような結果を求めています。
(現状は価格の上下がほぼ無いに等しい真っ直ぐな線にしかならないため)
試したこと
Keras 公式や同じようなことを行っている人の記事などを見てハイパーパラメータの調整などを行っていましたが、一向に改善が見られない状態です。
補足情報(FW/ツールのバージョンなど)
- Google Colaboratory
- Python 3.6
- Keras 2.3.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/01 07:58
2020/07/01 08:11