はじめに
深層強化学習モデルIMPALAを開発する前段階として、CNN-LSTMモデルの実装を行なった。
ソースコードはこちら
使用データについて
トレンド傾向の掴みやすさから、yahoo financeからGSPCの日足を使用した。
訓練データの期間:2015/1/1 - 2017/6/30
テストデータの期間:2017/7/1 - 2021/1/1
以下ソースコード
時系列におけるCNN
一般的なCNN
CNN(Convolutional Neural Networks)は、畳み込み層を含んだニューラルネットワークで、画像データから意味のあるデータを抽出し、画像認識などを行えるようにする。
畳み込み層・・・入力データから特徴量を抽出する層
プーリング層・・・入力データを圧縮する層
全結合層・・・全てのニューロンが繋がった層
時系列におけるCNN
CNNは、時系列データに置いて、1次元の入力データを2次元の行列に変換することで、特徴量の抽出に用いる。1
LSTM2
LSTM(Long Short-Term Memory)は,勾配の爆発と勾配の消失を解決するため、1997年にJ.Schmidhuberらによって提案されたネットワークモデルである。2今現在、音声認識,感情分析,テキスト分析、時系列分析の分野で用いられている。LSTM は、長期記憶、短期記憶、忘却の3つの機能がある。このことから、過去の状態が今現在に影響を与える時系列データを取り扱うのに適している。
CNN-LSTM3
CNN-LSTMを組み合わせることにより、波形のパターンを時系列的に処理することができる。
モデルの構造図を示す。主な構造は入力層、一次畳み込み層、プーリング層、LSTM隠れ層、完全結合層を持つ。
3より引用
以下の構造図より、LSTMの入力形式(サンプル数、ルックバック数、変数量)を踏襲している。
3より引用
モデル構築3
conv_filter = 4
units = 8
batch_size = 8
look_back = 10
opt = Adam(learning_rate=0.001)
model = Sequential()
model.add(Conv1D(filters=conv_filter, kernel_size=1, padding="same", activation="tanh",batch_input_shape=(None, look_back, 1)))
model.add(MaxPool1D(pool_size=1, padding='same'))
model.add(Activation("relu"))
model.add(LSTM(units, return_sequences=True))
model.add(Dense(1, kernel_initializer='random_uniform'))
model.compile(loss = "mean_absolute_error", optimizer=opt)
print(model.summary())
損失関数
学習結果
-
S. Chen and H. He, 'Stock Prediction Using Convolutional Neural Network' (2018),Materials Science and Engineering443 ↩
-
S. Hochreiter and J. Schmidhuber, 'Long Short Term Memory' (1997),Neural Computation 9,p.1735-1780 ↩ ↩2
-
W. Lu,J. Li,Y. Li, A. Sun, and J. Wang, 'A CNN-LSTM-Based Model to Forecast Stock Prices', (2020), Hindawi Complexity Volume 2020,p.10 ↩ ↩2 ↩3 ↩4