はじめに
- 私利私欲のために、機械学習を利用して株価を予測できないかなぁ~、と探していたところ、kaggle notebookで以下を発見。
- LSTMを使った株価予測
- 早速notebookをコピーして実行してみたものの、どういう処理をやっているのか理解に苦労したので、お絵描きしながら理解したことを共有したい。
trainデータとテストデータの作成
- 簡易的に、時系列データが3,000日分あるとする。
- それを、Trainデータとテストデータに分割する。簡易的に、2,500と500に分けたとする。
- テストデータは、後に、モデルの精度検証を行うためのもの。
- 考え方としては、直近過去60日のデータを元に61日目を予測する、という行為をめざすため、Trainデータの全区間を1日ずらしで60日ごとに区切る。
- modelの作成のため、0 ~ 1 にスケーリングする。(該当期間の最安値を0, 最高値を1として、縮尺を変更する)
- 各要素が60個の配列ができあがる。
- 上記でできた配列の教師データとして、y_trainを作成する。過去60日のデータを元に61日目を予測したいわけだから、x_trainで切り取った各60日の要素に対応するかたちで、61日目のデータ、62日目のデータ、という配列を作成する
予測
- 「過去60日のデータを元に61日目の株価を予測する」というモデルができあがったので、予測のためのINPUTとしては、60日分のデータを用意してあげる必要がある。
モデルの検証
- kaggle notobookの例では、最後に予測データと実績データを並べて比較をしている。何をやっているか解説する。
- テストデータとして切り出した500点を、まず予測で出力する
- 予測の2,501点目は、実績の2,441~2,500点目から予測
- 予測の2,502点目は、実績の2,442~2,501点目から予測
- ※2,501点目は、予測ではなく実績を使う点に注意。
- 以降も同様に「実績の過去60日」を元に次の1日を予測することを繰り返し、500点のデータを作成する
- 作成された500点と、実績の500点のデータを比較し精度を出している。
10日後のデータは予測できるか
- モデルの検証精度(rmse)は比較的高い値を出しているが、これはあくまで「実績を元にした翌日」という条件となる。
- したがって、10日後ともなると、前9日は予測を使わざるを得ない。
- これは、不確定な予測値を元にするわけだから、不確定要素が積み重なり、結論としては全くあてにならない、ということになる。
(参考) 10日後を予測するコード
# 最後の60日間のデータを取得
input_data = dataset[-60:]
# print(input_data)
# 未来10日分を予測
for _ in range(10):
# スケーリング
input_data_scaled = scaler.transform(input_data)
# データを整形
X_test = []
X_test.append(input_data_scaled)
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
# 予測
pred_price = model.predict(X_test)
# スケーリングを元に戻す
pred_price_unscaled = scaler.inverse_transform(pred_price)
print(pred_price_unscaled)
# 予測結果を入力データに追加
input_data = np.append(input_data, pred_price_unscaled.reshape(1, -1), axis=0)
input_data = input_data[-60:]
まとめと感想
- この例では過去の株価終値のみを使用した予測となっている。
- 株価は、関連ファクターが多すぎて終値だけでは到底予測はできないと言える。
- こんなことで株価が予測できたら、誰も苦労はしていない。甘い考えは捨てたほうがいいと思った。