ディープラーニングで日経平均株価を予測 その2(RNN)


はじめに

この記事は、ディープラーニングの勉強の一環です。
間違いなどはご指摘頂ければ幸いです。

以前の記事では、ニューラルネットワークで日経平均株価(終値)を予測をしましたが、今回は RNN(リカレントニューラルネットワーク)を用いて予測します。

今回のソースファイルはこちら

※この記事を参考にした取引によって発生した損害、またはトラブルについては、一切の責任を負いかねます。

環境

  • Windows 7 Proffessional 64bit
  • Python 3.6.7 (anaconda)
  • TensorFlow 1.12.0
  • Keras 2.2.4

データについて

以下については、以前の記事をご参照下さい。
だたし、今回はデータを標準化(平均 0, 分散 1)しています。

訓練

今回は LSTM を使用します。
エポック数は、以前の記事と同じ 3,000 としています。
過学習が発生するため、ドロップアウトを追加しています。
また、compile メソッドと fit メソッドは以前の記事と同じです。

from keras.models import Sequential
from keras.layers import Dense, LSTM, GRU
from keras.optimizers import RMSprop

model = Sequential()
model.add(LSTM(128, 
              dropout=0.2, 
              recurrent_dropout=0.2, 
              return_sequences=False, 
              input_shape=(None, X_train_std.shape[-1])))
model.add(Dense(1))

model.compile(optimizer=RMSprop(), loss='mae', metrics=['accuracy'])

result = model.fit(X_train_std, y_train_std, 
                   verbose=0,   ## 詳細表示モード
                   epochs=epochs, 
                   batch_size=64, 
                   shuffle=True, 
                   validation_data=(X_valid_std, y_valid_std))

訓練結果(損失値)

予測(テスト)結果

直近30日を予測(テスト用データを予測)した結果です。
二乗平均平方根誤差(RMSE)は 462.446
ニューラルネットワークで予測した以前の記事より精度が悪くなりました。

GRU での予測(テスト)結果

GRU でも予測をしました。
ソースファイルの変更は

model.add(LSTM(128, 
              dropout=0.2, 
              recurrent_dropout=0.2, 
              return_sequences=False, 
              input_shape=(None, X_train_std.shape[-1])))

モデルの LSTM を GRU に置換するだけ。

model.add(GRU(128, 
              dropout=0.2, 
              recurrent_dropout=0.2, 
              return_sequences=False, 
              input_shape=(None, X_train_std.shape[-1])))

予測(テスト)結果

二乗平均平方根誤差(RMSE)は 226.110 と LSTM より良くなりました。

今後の課題

さらなる精度向上のため、以下を検討します。

  • 特徴量(説明変数)の数を増やす(例 過去30日分の株価 ⇒ 過去100日分の株価)
  • RNN の中間層を増やす
  • リカレント層のスタッキング