説明変数とRNNについてもっと知りたい 未来永劫 株価を予測することが可能!? LSTM試行錯誤編
今回は説明変数の構成と予測精度との関連について検証します
前回のLSTMを4層Affine化した効果に対する検証では、以下のことが確認できました。
前回の検証で確認できたこと
説明変数にテクニカル指標を加えなくても予測精度には影響がなさそう
VALIDATION ERRORの最小値は70000前後
終値に対するRMSEは320円前後
そこで、今回は説明変数をより極端な構成とし、予測精度との関連について検証することにしました。
検証する説明変数の構成は、以下の2通りです。
説明変数の構成
40日分の日経平均株価 × 5段のRNN
1日分の日経平均株価 × 40段のRNN
また、使用するAIモデルは、前回の記事で使用した4層Affine化したLSTM構造のものとします。
ただし、AffineのOutShapeパラメーターについては、説明変数の要素数に基づいて調整することとします。
ちなみに、前回の記事については、下記を参照ください。
評価結果1: 説明変数の構成が40日分の日経平均株価 × 5段のRNNの場合
説明変数の構成を40日分の日経平均株価とした場合、説明変数の要素数が160(40日 × 4(始値、高値、安値、終値))となってしまいます。
このため、AffineのOutShapeパラメーターを100から500に変更しました。
以下に、説明変数の構成が40日分の日経平均株価 × 5段のRNNの場合における学習曲線を示します。
学習曲線の縦軸は、ログスケールで表示されています。
AffineのOutShapeパラメーターを500としたため、AIモデルの学習時間が19時間35分8秒と長くなりました。
学習曲線から、VALIDATION ERRORの最小値が70000弱であることが確認できます。
続いて、AIモデルの評価結果に対する実際の日経平均株価の終値(y__3)と終値に対する予測値(y'__3)を比較した結果を以下に示します。
グラフの縦軸は日経平均株価([円])を、横軸は評価期間における営業日の日数を表しています。
上記の差分を算出し、グラフ化したものが下記となります。
グラフの縦軸は終値の差分([円])を、横軸は評価期間における営業日の日数を表しています。
上記の差分のグラフから、AIモデルの終値に対する予測値は、実際の終値に対して+900円~-700円の範囲で収まっていることが確認できます。
終値に対する差分が、若干、上方向にシフトしています。
また、終値に対するRMSEは336.89円となりました。
RMSEは、これまでの約320円前後と比べると、やや増加しました。
評価結果2: 説明変数の構成が1日分の日経平均株価 × 40段のRNNの場合
説明変数の構成を1日分の日経平均株価とした場合、説明変数の要素数4(始値、高値、安値、終値)となります。
このため、AffineのOutShapeパラメーターは、従来通り100としました。
以下に、説明変数の構成が1日分の日経平均株価 × 40段のRNNの場合における学習曲線を示します。
学習曲線の縦軸は、ログスケールで表示されています。
これまで見たことのない学習曲線の形状で、非常に特徴的なものとなりました。
AffineのOutShapeパラメーターを100としたため、RNNが40段であってもAIモデルの学習時間は10時間47分51秒と短くなりました。
VALIDATION ERRORの最小値は70000弱でした。
ちなみに、RNNの段数を増やすと各エラーの最大値も大きくなるようで、学習曲線の縦軸の最大値が9000000であることを知ることができました。
続いて、AIモデルの評価結果に対する実際の日経平均株価の終値(y__3)と終値に対する予測値(y'__3)を比較した結果を以下に示します。
上記の差分を算出し、グラフ化したものが下記となります。
上記の差分のグラフから、AIモデルの終値に対する予測値は、実際の終値に対して±800円の範囲で収まっていることが確認できます。
また、終値に対するRMSEは324.42円となりました。
結果に対する考察
これまでのところ、AIモデルの構造をどう変えても、また、説明変数の構成をどう変えても、結果はほぼ同じになりました。
これまでの結果
VALIDATION ERRORの最小値は70000前後
RMSEは320円前後
いくら何でも、ここまで結果がバラつかないのはおかしいと考えます。
感覚的には、私が致命的なミスを犯していると思われるのですが、それが何なのか全く思い当たりません。
問題の原因を考えつつ、実際の日経平均株価の終値(y__3)と終値に対する予測値(y'__3)を比較したグラフを眺めていてあることに気がつきました。
実際の日経平均株価の終値(y__3)に対して終値に対する予測値(y'__3)が遅れている(右方向にズレている)のです。
つまり、学習済みAIモデルに当日の日経平均株価の情報を入力すると、本来であれば翌営業日の日経平均株価の情報を期待しているのに、前営業日の日経平均株価の情報が出力されるという状況です。
ポンコツAIです。 _| ̄|○
実際の結果を用いて、私の見立てが正しいか否かを確認することにしました。
例えば、説明変数の構成が40日分の日経平均株価 × 5段のRNNの場合の評価結果に対して、実際の終値(y__3)と翌営業日の終値に対する予測値(y'__3[翌])を比較したグラフが下記となります。
当日の終値に対する予測値(y'__3)と比較したグラフと見比べると、横ズレが解消されていることが確認できます。
また、実際の終値(y__3)と翌営業日の終値に対する予測値(y'__3[翌])の差分をグラフにしたものが下記となります。
上記のグラフから、差分が大幅に減少していることが確認できます。
そして、実際の終値(y__3)と翌営業日の終値に対する予測値(y'__3[翌])のRMSEを算出したところ、95.25円となりました。
続いて、説明変数の構成が1日分の日経平均株価 × 40段のRNNの場合に対しても、同様の確認を行いました。
説明変数の構成が1日分の日経平均株価 × 40段のRNNの場合において、実際の終値(y__3)と翌営業日の終値に対する予測値(y'__3[翌])のRMSEは62.28円となりました。
以上の結果から、実際の日経平均株価の終値(y__3)に対して終値に対する予測値(y'__3)が遅れている(右方向にズレている)ことが確認できました。
問題は、なぜこのようなことが起きるのか、です。
以前に検証したSlice層のパラメーター設定については、これ以上の修正は不可能です。
となると、他に原因があると予想されるのですが、それが何なのかさっぱり分かりません。
それでも可能性があるとすれば、私のNeural Network ConsoleでのRNNの理解が間違っていて、AIモデルの構造に何らかの誤りが含まれているという点です。
次回は、この懸念点を切り分けるため、RNN構造ではない、単純なAIモデルを使った検証を行います。
この記事が気に入ったらサポートをしてみませんか?