過学習とは?バックテストを良くしすぎると危ない理由
「バックテストで負けた条件を直していけば、戦略はどんどん良くなる?」
一見すると、そう思えます。
でも、過去の結果を見ながら条件を何度も直すほど、その過去データにだけ都合よく合うルールになることがあります。
これが「過学習(かがくしゅう)」です。
30秒で結論
過学習とは、過去データへ合わせすぎた結果、別の期間では同じように機能しにくくなる状態です。
バックテストの数字を良くすることと、まだ見ていないデータでも通用することは同じではありません。
この実験室では、Daily Replay(市場終了後の確定データを使う振り返り検証)のDay1が3シグナル・1勝2敗・平均損益-0.4652%でしたが、その結果を見て翌日から条件を変更しませんでした。
現在は、同じ条件を20営業日分記録する方針です。
なぜ「改善」が過学習につながることがある?
たとえば、過去の株価を使って売買ルールを試しているとします。
負けた場面を見るたびに、
- 出来高の条件を少し変える
- 利益を確定する幅を変える
- 損失を止める幅を変える
- 負けやすかった時間帯だけ除外する
と調整すれば、その過去期間の成績は良くなるかもしれません。
ただし、そのたびに同じ過去データを見て直していると、「その期間の答え」をルールへ覚え込ませている可能性があります。
過去で良く見えることと、別の期間でも良いことは分けて確認する必要があります。
身近なたとえ:過去問を丸暗記する
過学習は、学校の過去問で考えると分かりやすいです。
同じ問題を何度も解き、間違えるたびに答えだけ覚えれば、その問題では100点を取れるかもしれません。
でも、初めて見る問題で同じように解けるとは限りません。
売買ルールでも同じです。
見たデータの成績を上げることより、まだ見ていないデータでも同じ考え方が通用するかを確認する方が重要です。
この実験室で実際に「変えなかった」こと
Daily ReplayのDay1では、3銘柄の確定済みデータを使った検証で、次の結果でした。
- シグナル:3件
- 勝ち:1件
- 負け:2件
- 平均損益:-0.4652%
この数字だけを見れば、すぐに条件を直したくなります。
しかし、Day1の結果を見たあとも、現在の20営業日検証では売買条件を途中変更しない方針を維持しています。
Daily Replay Day1の実測結果(1勝2敗)はこちら。
なぜ途中で条件を変えないの?
目的は、今の条件が「勝てる」と証明することではありません。
同じ条件を繰り返したとき、どのような結果が積み上がるかを見るためです。
毎日条件を変えると、
- ルールを変えたから結果が変わったのか
- その日の相場が違ったから結果が変わったのか
を分けにくくなります。
新しい改善案が出た場合は、現在の実験を上書きせず、別の比較実験として扱う方が検証しやすくなります。
「改善」と「過学習」はどう見分ける?
改善そのものが悪いわけではありません。
大切なのは、結果を見たあとに都合よく直しただけになっていないかを確認することです。
初心者なら、次の4点を確認すると整理しやすくなります。
- 同じ過去データを見ながら何度も条件を変えていないか
- 負けた直後だけ条件を変えていないか
- どの時点で、どのルールを使うと決めたか記録しているか
- ルール作りに使っていない別のデータで確認する予定があるか
4つ目が、OOS(Out of Sample)という考え方につながります。
今の20営業日検証で「分かること」と「分からないこと」
現在のDaily Replayでは、同じ条件を20営業日分記録しています。
この方法で確認しやすいのは、
- 途中でルールを変えずに結果を積み上げられるか
- 同じ条件でどれくらいシグナルが出るか
- 勝ち負けや平均損益がどう積み上がるか
といった点です。
一方で、この20営業日の記録だけで、
- 過学習していない
- 別の期間でも通用する
- 将来も利益が出る
と証明できるわけではありません。
現在のDaily Replayは、ルール作りに使ったデータと、最後まで見ずに残した確認用データを厳密に分けたOOS試験ではないためです。
Daily Replayは、このサイト独自の「市場終了後に確定データを時間順に振り返る検証」です。実際のお金を使った売買ではありません。
バックテストが良くなったときこそ疑う
バックテストの成績が改善すると、つい「戦略が強くなった」と考えたくなります。
でも、そこで一度確認したいのは、
- 本当にルールが改善したのか
- 見た過去データへ合わせただけなのか
という違いです。
コードが正しく動くことと、戦略として有効であることも別です。
過学習を疑ったら次に確認するもの
過去に合わせすぎていないかを確認するには、OOSで未使用データを残し、さらにWalk-forwardで期間を前へずらしながら確認します。売買コストも別に入れて、良く見える条件だけを残さないようにします。
実際に日経225構成銘柄225社・50戦略を検証したときは、途中まで良く見えたS37も最後の未使用期間では1株・1回あたり平均約10.5円のマイナスになりました。
まとめ
過学習は、過去データへ合わせすぎて、別のデータでは再現しにくくなる状態です。
現在のAI株システムでは、Daily Replay Day1が3シグナル・1勝2敗・平均損益-0.4652%でも、結果を見て条件を途中変更しませんでした。
ただし、条件を固定しているだけで「過学習していない」と証明できるわけではありません。
次の段階では、ルール作りに使っていない別のデータで確認するOOSなど、別の検証が必要になります。
覚えておきたいのは、「バックテストの成績が良くなった=戦略そのものが良くなった、とは限らない」ということです。
※この記事は個人的なAI株システムの開発・検証記録です。過去データを使った検証結果は将来の利益を保証するものではなく、特定銘柄の推奨や投資助言を目的としません。