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

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

[以前の記事](https://qiita.com/shibata0523/items/655b82bbd3e46fc1c128)では、ニューラルネットワークで日経平均株価（終値）を予測をしましたが、今回は RNN（リカレントニューラルネットワーク）を用いて予測します。

今回のソースファイルは[こちら](https://github.com/Fukuhaku/MachineLearning/blob/master/RNN%E3%81%AB%E3%82%88%E3%82%8B%E6%97%A5%E7%B5%8C%E5%B9%B3%E5%9D%87%E6%A0%AA%E4%BE%A1%EF%BC%88%E7%B5%82%E5%80%A4%EF%BC%89%E3%81%AE%E4%BA%88%E6%B8%AC.py)

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

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

#データについて#
以下については、[以前の記事](https://qiita.com/shibata0523/items/655b82bbd3e46fc1c128)をご参照下さい。
だたし、今回はデータを標準化（平均 0, 分散 1）しています。

+ [データのダウンロード](https://qiita.com/shibata0523/items/655b82bbd3e46fc1c128#%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89)
+ [データの確認](https://qiita.com/shibata0523/items/655b82bbd3e46fc1c128#%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E7%A2%BA%E8%AA%8D)
+ [訓練・検証・テスト用データを作成](https://qiita.com/shibata0523/items/655b82bbd3e46fc1c128#%E8%A8%93%E7%B7%B4%E6%A4%9C%E8%A8%BC%E3%83%86%E3%82%B9%E3%83%88%E7%94%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%9C%E6%88%90)

#訓練#
今回は LSTM を使用します。
エポック数は、[以前の記事](https://qiita.com/shibata0523/items/655b82bbd3e46fc1c128)と同じ 3,000 としています。
過学習が発生するため、ドロップアウトを追加しています。
また、compile メソッドと fit メソッドは[以前の記事](https://qiita.com/shibata0523/items/655b82bbd3e46fc1c128)と同じです。

```python
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))
```

#訓練結果（損失値）#
￼![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425339/862fe6c3-c167-fb71-f443-e705376d6e27.png)


#予測（テスト）結果#
直近30日を予測（テスト用データを予測）した結果です。
二乗平均平方根誤差（RMSE）は 462.446
ニューラルネットワークで予測した[以前の記事](https://qiita.com/shibata0523/items/655b82bbd3e46fc1c128)より精度が悪くなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425339/73031ac0-0814-7b81-0eb9-8c537e066c36.png)


#GRU での予測（テスト）結果#
GRU でも予測をしました。
ソースファイルの変更は

```python
model.add(LSTM(128, 
              dropout=0.2, 
              recurrent_dropout=0.2, 
              return_sequences=False, 
              input_shape=(None, X_train_std.shape[-1])))
```
モデルの LSTM を GRU に置換するだけ。

```python
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 より良くなりました。
￼![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425339/34f3c6b3-35cf-991a-203f-04877767bece.png)

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

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