前回の第1話では、なぜAI株価予測システムを作ろうと思ったかを書いた。
今回はその続き。「64.3%という数字を超えられない」という話だ。
ある日の予測結果を見て、固まった
システムが稼働を始めてしばらく経った3月中旬のことだ。
その日の予測結果ログを開いた瞬間、目を疑った。
3/16 → 3/17 正解率: 25.0%(8銘柄中2銘柄のみ正解)
3/17 → 3/18 正解率: 25.0%(8銘柄中2銘柄のみ正解)
2日連続で25%。
コインを投げた方がましだ。50%を大きく下回っている。何かがおかしい。
慌ててその日の実際の値動きを調べた。
3月17日→18日。日経平均が53,700円から55,239円へ。一日で+1,539円、率にして+2.9%の急騰だった。
私のシステムは、その日の予測で日経平均を「下落」と判定していた。他の7銘柄も、ほぼ全て「下落」と予測していた。
市場は真逆に動いた。
なぜ全部「下落」になったのか
冷静になって考えると、理由はすぐにわかった。
私のシステムが使っていた特徴量は、過去の価格データから計算されるテクニカル指標だ。RSI、MACD、ボリンジャーバンド、移動平均線——これらは全て「過去を見ている」。
3月中旬の日本株は、米国株の下落と円安の影響でじりじりと値を下げていた。テクニカル指標はそれを忠実に反映し、「下落トレンド継続中」と判断していた。
だがその瞬間、何かが変わった。おそらく何らかのニュース、あるいは下げすぎた株への買い戻し。市場のムードが一瞬で反転した。
テクニカル指標はそれを知らなかった。昨日の値動きを見て、今日も下がると言い続けた。
「過去を見ているシステムは、未来の転換点を見えない」
頭ではわかっていたが、実際のデータで突きつけられると、こたえた。
改善策1:トレンドフィルター(失敗)
最初に思いついた改善策は「トレンドが不明瞭なときは予測しない」というものだった。
ロジックはシンプルだ。短期移動平均と長期移動平均の乖離率を計算し、一定の範囲内に収まっているときは「トレンドなし」と判定して予測を出力しない。トレンドが明確なときだけ予測すれば、精度が上がるはずだ。
実装してテストした。
結果:精度は変わらなかった。
問題は「トレンドなし」の定義だった。乖離率の閾値を厳しくすれば予測回数が減り、精度は上がったように見える。だが予測できないときが多すぎて、システムとして機能しない。閾値を緩めると、精度は元に戻る。
そして致命的な問題がある。急騰・急落は「トレンドあり」の状態から起きない。じわじわと下がっているトレンドの最中に、突然反発する。それがまさに3月17日だった。トレンドフィルターは機能しなかった。
改善策2:class_weight(失敗)
次に試みたのは、機械学習の定番テクニックであるクラスの重み付けだ。
予測データを分析すると、システムが「下落」を過剰に予測していることがわかった。56件の予測のうち、「上昇」予測は全体の約30%しかなかった。市場は50%前後で上下するはずなのに、明らかに「下落バイアス」がかかっている。
これは学習データに偏りがあるからだ。3月の日本株は全体的に下落傾向にあったため、学習データに「下落」のサンプルが多くなっていた。
そこでclass_weight='balanced'を設定し、「上昇」サンプルの重みを増やした。これで上昇予測が増え、バランスが取れるはずだった。
結果:精度が下がった。
今度はシステムが「上昇」を過剰に予測するようになった。確かに下落バイアスは消えた。だが「上昇バイアス」に変わっただけだ。
本質的な問題は「どの方向に動くかを当てる難しさ」にあり、重み付けで解決できる問題ではなかった。当然といえば当然だ。
改善策3:MAフィルター(失敗)
3つ目は「移動平均との位置関係で予測を補正する」というものだ。
発想はこうだ。現在価格が20日移動平均を大きく下回っているなら、いずれ平均回帰するはず。だから「売られすぎ=上昇予測」に補正する。逆に平均を大きく上回っているなら「買われすぎ=下落予測」に補正する。
これはRSIの考え方に近い。平均回帰という市場原理に基づいた、それなりに合理的なアイデアだと思っていた。
結果:精度はほぼ変わらず、悪化した日もあった。
問題は「平均回帰しないケース」の多さだった。トレンドが強い相場では、価格は移動平均から乖離し続ける。「売られすぎ」と判断した銘柄がさらに下がり続ける、いわゆる「落ちるナイフ」だ。
特に3月の日本株のように、外部要因(米国株の動向、為替)が支配する相場では、テクニカルな平均回帰は機能しにくかった。
3つ全部失敗して、気づいたこと
3つの改善策を試し、3つとも結果が出なかった。
全体の精度は64.3%。最初に計測したときとほぼ変わらない。
ただ、失敗を通じてひとつのことがクリアになった。
テクニカル指標だけで予測できることの限界が、ここだ。
移動平均もRSIもMACDも、全て過去の価格データから計算される。これらをどう組み合わせ、どう重み付けしても、「外部環境の変化」は読み取れない。3月17日に何が起きたのか、AIは知らない。FRBの発言も、地政学的なニュースも、機関投資家の思惑も、テクニカル指標には映らない。
ランダムよりはマシな64.3%は出せている。だが「なぜ当たったか、なぜ外れたか」がまだよく理解できていない。
次に試すこと
今考えているのは2つだ。
ひとつは特徴量の追加。VIX(恐怖指数)、ドル円レート、セクター別の動向——テクニカル指標以外の「市場センチメント」を加えることで、急反転を少しでも察知できるようにする。
もうひとつは機械学習モデルの変更。今は移動平均の単純な計算式で予測している。Random ForestやGradient Boostingなら、複数の特徴量の複雑な組み合わせを学習できる。同じ入力データでも、より高度なパターンを見つけられるかもしれない。
どちらも「65%の壁」を超えられる保証はない。
でもやらないと何もわからない。
次回はその実験の記録を書く。うまくいっても失敗しても、そのまま載せる。