
教えてChatGPT 日経平均株価を予測するAIモデルに最適な学習データと評価データについて
久しぶりにChatGPTに質問してみました
これまで、翌営業日の日経平均株価が陽線か陰線かを予測するAIモデルを作成する努力を続けてきました。
しかし、予測精度の最高値が58.4%と期待通りの成果(できれば70%以上)をあげることができていません。
現状、過学習を抑えることができておらず、これにより予測精度が上がらないというのが私の理解です。
過学習とは、AIモデルが学習データに最適化された結果、評価データに対するパフォーマンスが悪化してしまう状況です。
これはつまり、学習データに含まれる特徴と評価データに含まれる特徴が異なっているからではないか、と私は考えました。
そこで、学習データと評価データを見直し、根本からやり直すことにしました。
とはいえ、何をどうして良いのか分かりません。
そこで、久しぶりにChatGPTに質問してみました。
ChatGPTへの質問内容(プロンプト)
ChatGPTに入力したプロンプトの内容は、以下の通りです。
■目的
ニューラルネットワーク構造のAIモデルに株価の予測を行わせたい
■AIモデルの仕様
説明変数は、日経平均株価(始値、高値、安値、終値)とVIX指数、等を与える
目的変数は、0なら翌営業日の日経平均株価が陰線で、1なら翌営業日の日経平均株価が陽線となる
つまり、AIモデルにより二値分類を行う
また、AIモデルの構造は、DenseレイヤーとReLUの組み合わせを多層化し、最終段にSigmoidとBinaryCrossEntropyを配置したものとする
■ChatGPTへの質問
このようなAIモデルに最適な学習データおよび評価データを教えて欲しい
具体的には、説明変数の種類や対象となるデータの期間、等である
これに対するChatGPTの回答(一部抜粋)は、以下となります。
最適な学習データおよび評価データの設計
1. 説明変数の種類
以下の情報を説明変数として活用することを推奨します:
データタイプ具体的な内容株価データ日経平均株価(始値、高値、安値、終値、出来高)ボラティリティVIX指数(日次終値)テクニカル指標移動平均(5日、25日)、ボリンジャーバンド、RSI、MACD外部市場米国市場の主要指数(S&P500、NASDAQ)、ドル円為替レート経済指標日銀政策金利、米国雇用統計(重要指標は適宜選択)
2. データ期間
・学習データ期間:
5年〜10年程度のデータ(例えば、2013年〜2023年)。
ボラティリティや市場サイクルの多様性を反映するため、できるだけ長期間のデータが望ましい。
・評価データ期間:
直近1〜2年分のデータ(例えば、2023年〜2024年)
モデルが最近の市場動向に対応できるかを確認するため、直近データは評価用に保持します。
3. データ収集方法
・株価データ:
日経平均株価のデータはYahooファイナンスやQUANDLから取得可能。
・VIX指数:
CBOE公式サイトやQUANDLから取得。
・外部市場データ:
S&P500やNASDAQ、為替レートもYahooファイナンスなどで取得可能。
4. データ前処理
・ラベル付け:
翌営業日の日経平均株価終値 > 当日終値 で「1」、そうでなければ「0」としてラベル付け。
・スケーリング:
標準化(StandardScaler)または正規化(MinMaxScaler)を実施。
特にVIX指数や株価はスケールが異なるためスケーリングは必須です。
・欠損値処理:
祝日や週末による欠損データには前日データのキャリーオーバーを利用。
5. データ拡張
移動平均やテクニカル指標を説明変数に追加することで特徴量を強化します。
ChatGPTの回答に従い、学習データおよび評価データを以下のように作成します。
学習データ
期間: 2015年1月1日 ~ 2023年12月31日の9年間
評価データ
期間: 2024年1月1日 ~ 2024年12月31日の1年間
説明変数
日経平均株価
単純移動平均
ボリンジャーバンド
MACD
RSI
S&P500
NASDAQ
VIX指数
これまでは、説明変数に日経平均株価およびVIX指数の30日分を使用してきました。
今回は、とりあえず上記のデータを1日分および30日分用意し、結果の差分を確認したいと思います。
ところで、評価データを上記の期間に設定した場合に、ひとつ問題が発生します。
それは、AIモデルの学習および評価に使用していないデータが2025年1月分以降しか残っていないということです。
AIモデルは、作成した後に推論を行います。
補足
そもそもAIモデルの学習は、学習データに基づきAIモデルを学習させ、その後、AIモデルを評価データで評価するのが1セットです
推論とは、学習および評価を完了したAIモデルに対して、新たなデータを使用して評価を行うことを意味します
しかし、上記の場合、推論に使用するデータがほとんど無い状態なのです。
より正確には、株価のデータが貯まるまで待つ必要があります。
しかし、現状は、期待通りのAIモデルが全く作成できない状況ですので、気にしないことにします。
学習および評価データの作成
上記で挙げた学習および評価データの作成には、以前に私が用意した下記のPythonプログラムを使用します。
Pythonプログラムを保存したファイル名をfilename.pyとした場合の実行時のオプションは次の通りです。
> python filename.py --elm SMA BB MACD RSI SP500 NAS VIX --s 2015-1-1 --e 2024-12-31 --vnum 245
上記が説明変数として1日分を設定する場合です。
> python filename.py --elm SMA BB MACD RSI SP500 NAS VIX --s 2015-1-1 --e 2024-12-31 --vnum 245 --day 30
上記が説明変数として30日分(--dayオプションで指定)を設定する場合です。
説明変数として1日分あるいは30日分を使用する場合、学習データおよび評価データにおいて、その期間分だけずれが生じる点はご了承ください。
学習および評価データの検証に使用するAIモデル
学習および評価データを検証するためのAIモデルは、これまでの検証で最高の予測精度を叩き出した、下記の構造とします。

ちなみに、30日分の説明変数を使用する場合は、InputレイヤーのSizeパラメータは840となります。
学習および評価結果の詳細
説明変数として1日分および30日分を使用した場合の学習曲線を以下に示します。


VALIDATION ERRORの最小値は、以下の通りです。
1日分: 0.668610
30日分: 0.690960
学習曲線より、30日分のデータを使用した方がAIモデルの学習が進んでいるように見えます。
続いて、それぞれにおける混同行列を以下に示します。


混同行列では、1日分のデータを使用した方が、AIモデルの予測のバラつき度合いと予測精度の高さの観点で良い結果と言えます。
結果に対する考察
ChatGPTの回答に従い、AIモデルに与える学習および評価データの見直しを行いました。
学習曲線におけるVALIDATION ERRORの推移を見ると、これまでのように上昇するような気配はなく、過学習が抑えられているようにも感じます。
それでも、VALIDATION ERRORが下降するには至っておらず、予測精度は相変わらず低い状態です。
しかし、学習および評価データの見直しによって、弱冠ですが状況が改善したのではないかと私は考えます。
そこで次回は、この学習および評価データに最適なAIモデルの構造について、ChatGPTに質問してみたいと思います。