
未来永劫 株価を予測することが可能!? LSTMで予測精度向上を図りたい編
LSTM構造のAIモデルで回帰による日経平均株価の予測精度向上を図りたい
これまでは、主に4層Affine構造のAIモデルを使って、回帰による日経平均株価の予測を行ってきました。
しかし、AIモデルの予測精度は、それなりに低そうでした。
そこで、予測精度向上を図るためにLSTM構造のAIモデルを使って、回帰による日経平均株価の予測を行ってみることにしました。
今回使用したLSTM構造のAIモデルと説明変数の構成について
今回使用したLSTM構造のAIモデルは、下記となります。

また、説明変数の構成は、下記の通りです。
説明変数の構成
5日分の日経平均株価 (始値、高値、安値、終値)
さらに、Neural Network ConsoleのRNNの段数を5段としました。
このため、上記のAIモデルにおいて、RecurrentInput層以下が「x5」になっています。
LSTM構造のAIモデルによる回帰の学習および評価結果
以下に、学習曲線を記載します。

AIモデルの学習にかかった時間は40分59秒でした。
最近は、AIモデルの学習時間が1日以上となることが多かったので、何だか短く感じてしまいます。
また、TRAINING ERRORおよびVALIDATION ERRORは、かなり大きい値となっているのが確認できます。
LSTM構造のAIモデルといっても、今回はAffineが1層なので、性能は今ひとつなのかもしれません。
続いて、評価結果を見ていきます。
日経平均株価の始値、高値、安値、終値に対して、実際の値(正解値)とAIモデルの予測値を比較したグラフを下記に示します。
ただし、学習済みAIモデルによる推論の結果ではありませんのでご注意ください。
下記は、あくまで、AIモデルの学習中に最も良い結果として評価されたものです。

y__0が始値(正解値), y'__0が始値(予測値)を表しています。
また、グラフの縦軸が日経平均株価([円])を、横軸が営業日の日数を表しています。

y__1が高値(正解値), y'__1が高値(予測値)を表しています。

y__2が安値(正解値), y'__2が安値(予測値)を表しています。

y__3が終値(正解値), y'__3が終値(予測値)を表しています。
全然ダメでした。
下記の記事にて確認した4層Affine構造のAIモデルの方がもっと良い結果でした。
4層Affine構造のAIモデルでは、VALIDATION ERRORがおよそ80000でした。
一方で、今回のLSTM構造のAIモデルではVALIDATION ERRORが500000前後となっており、1桁多くなっています。
どうしたものかと上記の記事を眺めていたところ、HuberLossの記述を見つけました。
今回のAIモデルは、ロス関数にSquaredErrorを使用していますが、HuberLossを使用することでより安定した連続値推定が可能なケースがあるとのことでした。
これまで、HuberLossの効果は未確認だったので、このタイミングで確認することにしました。
ロス関数をHuberLossに変更したLSTM構造のAIモデルによる回帰の学習および評価結果
上記のAIモデルに対して、ロス関数をSquaredErrorからHuberLossに変更した場合の学習曲線を以下に記載します。
その他の条件は全て同じです。

AIモデルの学習にかかった時間は45分04秒でした。
驚くべきは、TRAINING ERRORとVALIDATION ERRORがかなり小さくなっている点です。
続いて、日経平均株価の始値、高値、安値、終値に対して、実際の値(正解値)とAIモデルの予測値を比較したグラフを下記に示します。




学習曲線での各エラーの値が小さくなったので、かなり期待していたのですが、あっさりと期待を裏切られました。
単純に、エラーの値が小さくなると、AIモデルの予測精度が向上するわけではないようです。
結果について気になったこと
日経平均株価(正解値)と学習済みAIモデルの予測値とを比較したグラフを見ていて、ふと気になったことがあります。
それは、正解値と予測値が横軸方向にズレているように見えるという点です。
試しに、ロス関数にSquaredErrorを使用した結果に対して、終値(y__3およびy'__3)を対象に、y'__3(予測値)を左方向に5営業日分ズラしたグラフを下記に示します。

こうしてみると、それなりの結果に見えます。
折角ですので、ロス関数にHuberLossを使用した結果についても同様の確認を行いました。

予測値が正解値と比べて5つズレているとなると、気になるのが、AIモデルで使用しているSliceのパラメーター設定です。
Sliceは、RNN構造で繰り返し行われる学習処理において、1段ずつデータを取り出す機能を果たしています。
今回のAIモデルは5段のRNN構造であり、ちょうど5つズレている結果との因果関係が気になります。
もしかしたら、Sliceのパラメーター設定が間違っているのかもしれません。
というか、そんな気がしてきました。
次回は、Sliceに対する確認を行った内容を記事にまとめたいと思います。