
AIの学習が終わらない!! 未来永劫 株価を予測することが可能!? 説明変数にテクニカル指標を加えた編【前編】
説明変数にテクニカル指標を加えてみたら?
前回の回帰による日経平均株価の予測に対する検証では、以下の内容に関する結果を記載しました。
前回の回帰による日経平均株価の予測に対する検証内容
説明変数に日経平均株価(始値、高値、安値、終値)を5, 20, 40日分割り当てた
8層Affine構造 + 説明変数に40日分の日経平均株価を割り当てた
結果に対する私の感想は、以下の通りでした。
結果より、私が感じたこと
説明変数の期間およびAIモデルの中間層の層数と予測精度の関連性が今ひとつ理解できない
いずれにせよ、現状では長期の株価予想は難しそう
仮に数日程度の予想がそれなりの精度で可能ならばバックテストに使える
説明変数にテクニカル指標(移動平均線、等)を加えたらどうなるか
他のAI構造(LSTM, 等)のAIモデルも試してみたい
詳細は、下記を参照ください。
今回は、回帰を行うAIモデル向けの説明変数にテクニカル指標(移動平均線、等)を加えたらどうなるかを確認したいと思います。
説明変数の構成
日経平均株価(始値、高値、安値、終値)
移動平均線(5, 25, 75日)
ボリンジャーバンド(20日)
MACD(12, 26, 9日)
RSI(14, 9日)
ストキャスティクス(9, 3, 3日)
学習データおよび評価データを作成する方法
今回使用するテクニカル指標は、移動平均線(SMA), ボリンジャーバンド、MACD, RSI, ストキャスティクスです。
回帰向け学習データおよび評価データにテクニカル指標を加える方法は、私が作成したPythonプログラムを使用します。
Pythonプログラムに関しては、下記の記事を参照ください。
今回の検証では、次の3種類の学習データおよび評価データを用意しました。
日経平均株価 + テクニカル指標の5日分を1つの説明変数としたもの
日経平均株価 + テクニカル指標の20日分を1つの説明変数としたもの
日経平均株価 + テクニカル指標の40日分を1つの説明変数としたもの
具体的なPythonプログラムの実行方法は、以下となります。
> python filename.py --elm SMA BB MACD RSI STOCH --day 5 --t training_5days.csv --v validation_5days.csv
Start day: 1986-01-01
End day: 2024-01-31
Training data element: SMA, BB, MACD, RSI, STOCH
Day params: 5
Number of rows for validation data: 250
Training data period: 1986-04-22 00:00:00 - 2023-01-19 00:00:00
Validation data period: 2023-01-20 00:00:00 - 2024-01-25 00:00:00
Training data csv file: training_5days.csv
Validation data csv file: validation_5days.csv
Done.
上記は、5日分を1つの説明変数とした場合の実行方法です。
学習データおよび評価データの参照期間は、デフォルトの1986年1月1日から2024年1月31日です。
参照期間を変更する場合は、--sオプションで開始年月日を、--eオプションで終了年月日を指定します。
学習データは--tオプションで指定したtraining_5days.csvに、また、評価データは--vオプションで指定したvalidation_5days.csvに保存されます。
n日分の場合は"--day n"とします。
また、注意点があります。
--elmオプションで指定したテクニカル指標の順番は、AIを学習させた後に行う推論を実行させる際にも同じ順番で指定する必要があります。
続いて、回帰による日経平均株価の予測を行うAIモデルの作成を行います。
説明変数に5日分の日経平均株価 + テクニカル指標を使用した場合
今回使用するAIモデルは、4層Affine構造としました。
ただし、説明変数の数が95と多いため、AffineのOutShapeパラメーターを下記のように1000に変更しました。

以下に、学習曲線を示します。

今回は、学習曲線の縦軸をログスケール(これまではリニアスケール)としました。
これで、少しは見やすくなったかと思います。
とは言え、相変わらずValidation Errorは凄いことになっています。
続いて、学習済みAIモデルに対して、2024年2月1日から2024年5月31日の日経平均株価を予想させ、予測値と実際の日経平均株価とを比較しました。
始値、高値、安値および終値に対する正解値(実際の日経平均株価)とAIモデルの予測値を比較した結果を以下に示します。




少なくとも、長期の予測が不可能であることは容易に理解できる結果でした。
説明変数に20日分の日経平均株価 + テクニカル指標を使用した場合
AIモデルの構造図は省略しますが、この場合の説明変数は380となるため、AffineのOutShapeパラメーターを3000に変更しました。
以下に、学習曲線を示します。

学習曲線の縦軸は、ログスケールとしています。
先の例と比べても、Validation Errorに大きな差は見られません。
ちなみに、今回のAIモデルに対する学習は、メチャクチャ時間ががかりました。
合計時間が01:13:16:37となっています。
おそらく、AIモデルの学習に1日と13時間16分37秒かかったと思われます。
単純な4層Affine構造であるものの、AffineのOutShapeパラメーターを3000にしているため、これほどの時間が必要になったと思われます。
続いて、始値、高値、安値および終値に対する正解値(実際の日経平均株価)とAIモデルの予測値を比較した結果を以下に示します。




説明変数を20日分の日経平均株価 + テクニカル指標とした場合の回帰による日経平均株価の予測結果を見ると、少し状況が変わってきた気がしました。
予測精度の粗さはあるものの、2024年2月の1カ月間における予測は、実際の日経平均株価の値を追従しようとする意志を感じます。
説明変数に40日分の日経平均株価 + テクニカル指標を使用した場合はAIの学習が終わらない
この条件では説明変数が760となるため、AffineのOutShapeパラメーターを5000に変更しました。
実際のAIモデルの構造図が下記となります。

その後、AIモデルの学習を始めているのですが、AIモデルの学習が終わりません。
学習時のログから、1 Epochを計算するのに3分強かかっています。
500 Epochで終了となるのですが、1 Epochが4分とすると500回 * 4分で約33時間です。
説明変数が20日分の日経平均株価 + テクニカル指標の場合は、学習時のログから1 Epochを1分強で計算していました。
単純に計算すると、500回 * 2分で約17時間ですが、実際のAIモデルの学習時間は約37時間でした。
今回はその3倍ほどかかりそうです。
幸いなことに、Neural Network Consoleには、AI学習の一時中断と再開機能が備わっています。
このため、AI学習の途中でもパソコンの電源をオフにすることができます。
こうした事情から、この条件での検証結果は、後日、【後編】でまとめることとします。
2024年2月の実際の日経平均株価と学習済みAIモデルの予測との比較
2024年2月における実際の日経平均株価の終値と、下記の2パターンによる学習済みAIモデルの終値の予測とを比較しました。
日経平均株価 + テクニカル指標の5日分を1つの説明変数としたもの
日経平均株価 + テクニカル指標の20日分を1つの説明変数としたもの

上記のグラフを見ると、確かに、日経平均株価 + テクニカル指標の20日分を1つの説明変数とした場合の方が予測精度が高いと感じます。
一方で、日経平均株価 + テクニカル指標の40日分を1つの説明変数とした場合にどうなるのか、結果が待ち遠しいです。
個人的に気になっていること
個人的に気になっているのが、学習済みAIモデルの予測値が、基本的に単調増加となっている点です。
実際の日経平均株価は、上がることもあれば下がることもあるので、学習済みAIモデルが株価下落に対応できているのかを懸念しています。
前回の検証では、回帰による日経平均株価の予測値が下降から上昇に転じた結果がありました。
私としては、もっと複雑な値動きを予測するAIモデルを作りたいと考えています。
ふと思ったのですが、もしかしたら、回帰による予測を開始するために与える最初の説明変数によって状況が変わってくるのかもしれません。
これまでの学習済みAIモデルに与えた最初の説明変数は、2024年1月31日の日経平均株価、等の値でした。
例えば、日経平均株価が一時的に下落している2024年3月下旬の日経平均株価 + テクニカル指標を説明変数として学習済みAIモデルに与えた場合はどうなるのでしょうか。
もしかしたら、実際の日経平均株価と同じく、AIモデルの予測値が単調減少となったりするかもしれません。
この点は、現在実行中のAIの学習と並行して確認できますので、結果を別の記事にまとめたいと思います。