最高成績ほど危ない?過剰最適化・ウォークフォワード検証の実践入門

過剰最適化とウォークフォワード検証の記事アイキャッチ。左に成人日本人女性、右に記事タイトル

バックテストで100通りの設定を試し、最も成績のよい1通りを選ぶとします。その1通りが優秀なのか、過去の偶然へ最も上手に合っただけなのかは、最高成績だけでは分かりません。試行回数が増えるほど、実力のないルールにも見栄えのよい結果が混ざります。

この問題が過剰最適化(過剰適合、オーバーフィッティング)です。防ぐ中心は、設定を決める期間と成績を測る期間を分け、時間の順番を守って窓を前へ進めるウォークフォワード検証です。ただし、分けるだけでは不十分です。評価期間を何度も見て直したり、100案のうち都合のよい1案だけを報告したりすれば、その評価期間も実質的に学習へ使われます。

この記事では、インサンプル、検証期間、アウトオブサンプルの役割、ローリング型と拡大型、パラメータの安定性、多重検定、データ漏洩、AIモデルの評価、注文・撤退・数量・見送りまでを、実行できる手順に落とします。

先に結論
候補の作成と選択は過去側だけで完結させ、直後の期間を触らずに評価します。評価結果を見て条件を変えたら、その期間はもう未使用ではありません。最高点より周辺設定の安定性を重視し、試した案の総数、不採用案、費用、銘柄集合、データ版を保存します。最後の未使用期間は原則1回だけ開封し、その後は小さい数量のフォワード検証へ移します。
目次

過剰最適化とは?過去の規則ではなく過去のノイズを覚えること

最適化そのものは悪くありません。たとえば移動平均の期間、損切り幅、保有日数を、戦略の目的に合うよう決める作業は必要です。問題は、利用できるデータ量に対して候補が多すぎ、過去の偶然な並びまでルールへ取り込むことです。学習に使った期間では高成績でも、新しい期間へ移ると崩れます。

Halbert Whiteは、同じデータを推論やモデル選択へ繰り返し使うデータ・スヌーピングでは、満足できる結果が手法の能力ではなく偶然から生じ得ると整理し、多数の候補を考慮するReality Checkを提案しました(White, 2000, Econometrica)。重要なのは「採用した1案」だけでなく、そこへ到達するまでに何案を見たかです。

状態何をしているか判断
合理的な最適化経済的な仮説から少数の候補を事前定義別期間と費用悪化でも確認する
過剰最適化結果を見ながら条件を足し、最高値だけを選ぶ試行数と選択過程を含めて再評価する
データ漏洩未来情報や評価期間の統計量が学習へ入る処理順と情報時点を修正する
相場依存特定の上昇相場や1銘柄だけで利益が出る局面・銘柄・期間別に分解する

100通り試した最高値は、最初の1通りと意味が違う

説明用に、真の優位性がない架空のルールを多数試す場面を考えます。各結果には偶然のばらつきがあるため、100案の最大値は平均より高くなりやすくなります。ここで最大値だけを「発見」と呼ぶと、選択の過程が消えます。この例は特定の勝率や成績を示すものではなく、多数から最大を選ぶだけで上方へ偏る仕組みを説明しています。

Baileyらは、インサンプルで選んだ最適戦略がアウトオブサンプルで相対的に劣る確率を、Probability of Backtest Overfitting(PBO)として評価する枠組みを示しました。単純な1回のホールドアウトだけでは投資バックテストの過剰適合を捉えにくい点も論じています(Bailey et al., “The Probability of Backtest Overfitting”)。PBOは魔法の合否判定ではありませんが、候補群全体と選択手順を分析対象にする考え方が重要です。

3つの期間を分ける――学習、選択、最終確認

最低でも、期間を次の3役へ分けます。名称はソフトや論文で異なりますが、役割を混ぜないことが大切です。

  1. 学習・インサンプル:アイデアを実装し、特徴量やパラメータ候補を作る期間。
  2. 検証・バリデーション:候補を比較し、採用する1案と運用条件を固定する期間。
  3. 最終アウトオブサンプル:固定後に一度だけ確認する未使用期間。ここを見て直し続けない。

時系列データを無作為に混ぜる一般的な交差検証は使いません。scikit-learnの公式文書は、時間順データでは通常の分割が未来で学習して過去を評価する形になり得るため、TimeSeriesSplitを用意しています。各分割は過去を学習、直後をテストにし、訓練末尾とテスト開始の間から標本を除くgapも指定できます(TimeSeriesSplit公式文書)。

期間許される作業してはいけないこと
学習ルール作成、特徴量作成、候補探索未来期間の平均・最大最小を前処理へ使用
検証候補比較、複雑さと費用耐性の確認成績が上がるまで無制限に追加探索
最終OOS固定版を一度評価結果を見て同じ期間へ合わせ直す
フォワード小さい数量で注文・約定・費用を記録想定外の損失を検証のせいにして放置

ラベルが「5日後リターン」のように先の価格を使う場合、学習末尾のラベル期間が評価側へ重なります。単に日付で切るだけでなく、保有期間やラベルの重なりに応じて間隔を置きます。移動平均や標準化も全期間で計算してから切らず、各学習窓の情報だけで計算し、その変換を直後の評価へ適用します。

ウォークフォワード検証の2方式

ウォークフォワードは、過去側で設定を決め、直後の期間で測り、窓を未来へ進める方法です。1回の分割より複数の相場局面を通せます。ただし、再最適化の頻度、学習長、評価長、gap、候補数、採用基準は結果を見る前に決めます。

固定長ローリングと拡大型のウォークフォワード検証を比較する図
図1:各評価区間では直前までの情報だけを使います。評価結果を見て変更した区間は、以後は学習側です。

固定長ローリング

直近の一定期間だけを学習へ使い、古いデータを落としながら進めます。市場構造の変化へ追随しやすい一方、学習標本が少なくなり、再最適化のたびに設定が不安定になることがあります。短期の需給や制度変更へ対応したい手法に向きますが、学習長を成績に合わせて動かし続けると、そこ自体が新しいパラメータになります。

拡大型(アンカード)

開始点を固定し、新しい評価期間を次回の学習へ加えていきます。標本が増えて推定は安定しやすい反面、古い市場構造の影響が残ります。長期的な関係を利用する戦略に向きますが、売買制度やコスト構造が明確に変わった場合は、単純な累積が適切とは限りません。古い経験を役立てたい気持ちはありますが、市場の前提が変わったなら、その期間も同じように数えてよいかを考えたいです。

設計項目決める基準注意点
学習長必要取引数と複数局面を含む長さ長いほど正しいとは限らない
評価長実際の再調整間隔と同程度短すぎると数件の取引に支配される
gapラベル・保有期間・情報公表遅れ0が常に安全ではない
更新頻度データ更新、制度、売買回転率不調のたびに変更しない
採用指標費用後期待値、DD、安定性総利益だけで選ばない

普遍的な「学習3年、評価6か月」のような正解はありません。日中売買と月足投資では標本数も市場構造も異なります。長さの候補を試したなら、それも試行数へ含め、近い長さでも結論が反転しないかを確認します。

最高点よりパラメータの「台地」を選ぶ

損切り7.3%だけが突出し、7.2%と7.4%で成績が急落するなら、7.3%に特別な市場原理があるのか、偶然の約定が数件変わっただけなのかを疑います。反対に、6〜9%の広い範囲で費用後期待値とドローダウンが許容範囲なら、推定誤差や相場変化に耐える余地があります。

安定した広いパラメータ台地と不安定な針状の最高点を比較する図
図2:架空の評価面。最大値そのものより、周辺設定でも性質が残るかを見ます。

確認するのは、1変数ずつの線だけではありません。移動平均期間×損切り幅、保有日数×利確幅のように組み合わせた面を見ます。さらに、手数料・スリッページを増やす、注文を1本遅らせる、最大利益の取引を除く、銘柄群を分けるなど、現実的な揺さぶりをかけます。

  • 局所感度:採用値の前後へ小さく動かしても方向が同じか。
  • 期間感度:開始日・終了日をずらしても一部の年月だけに依存しないか。
  • 銘柄感度:1銘柄、1業種、現在の生存銘柄だけに偏っていないか。
  • 費用感度:スプレッドとスリッページを悪化させても費用後期待値が残るか。
  • 集中度:最大利益の数取引を除いたら成績が反転しないか。

多重検定と選択バイアスを成績へ反映する

通常のシャープレシオは、報告された1本の収益系列だけを見ます。しかし、実際には多数のルールから最高のシャープレシオを選んだかもしれません。BaileyとLópez de PradoのDeflated Sharpe Ratio(DSR)は、複数試行による選択バイアスと、リターンの非正規性による成績の膨らみを補正する考え方です(“The Deflated Sharpe Ratio”)。DSRを使わなくても、総試行数と候補間の類似性を隠さないことが出発点です。

Harvey、Liu、Zhuは、期待リターンを説明する多数の要因が研究されてきた状況では、通常の有意性基準をそのまま使うのは不適切だと指摘し、多重検定を踏まえたより高いハードルを論じています(Harvey, Liu & Zhu, 2016, Review of Financial Studies)。個人のテクニカル検証でも、指標名を変えた類似案、期間違い、売買方向違い、フィルター違いを別々に数えず、「合計で何回選び直したか」を記録します。

記録項目残す内容理由
仮説価格形成や需給へ効く理由結果後の物語付けを防ぐ
試行台帳日時、変更点、候補数、結果不採用案を消さない
評価指標費用後期待値、DD、回復期間等都合のよい指標への乗り換えを防ぐ
データ版取得日、銘柄集合、調整方法後日のデータ改訂と区別する
コード版コミット、設定、乱数シード同じ結果を再現する

評価期間を一度だけ開封する手順

候補作成、検証、最終アウトオブサンプル、小さな実運用へ進む手順図
図3:候補が多いほど、最終アウトオブサンプルを選択から隔離します。

実務では、結果ファイルを開ける権限を分ける、最終期間を別ファイルにする、検証計画へ日時とハッシュを付けると、無意識ののぞき見を減らせます。最後の成績が悪いときは、同じ最終期間へ合わせて修正しません。その版を不採用にするか、仮説から作り直し、以後に到着する新データを次の評価期間にします。

「最終期間を見たが、数値は覚えていない」は未使用に戻りません。どの局面で崩れたか、どの設定がよかったかを知った時点で情報が入っています。同様に、ブログや論文で公開された期間を読んでから同じ期間をOOSと呼ぶ場合も、完全な未使用とは言い切れません。外部情報を含む開発履歴として扱います。

AI・機械学習の検証で増える漏洩

AIモデルは、特徴量、学習率、木の深さ、ネットワーク構造、ランダムシード、目的変数など選択肢が多く、試行数が急増します。説明変数が多いから賢いのではなく、探索の自由度が上がるほど偶然へ合わせる余地も増えます。新指標をAIへ大量生成させる場合、生成した案の総数を試行台帳へ含めます。

典型的な漏洩は、全期間の平均と標準偏差で正規化する、全期間の欠損率を見て特徴量を選ぶ、未来の上場廃止を除いた銘柄集合を使う、決算期末日に後日公表された数値を置く、翌週リターンのラベルが評価期間へはみ出す、といった処理です。前処理、特徴量選択、ハイパーパラメータ探索を学習窓の内側でやり直し、直後の評価へ変換器とモデルを固定して適用します。

AI工程安全な分離危険な例
欠損処理学習窓だけで補完値を計算全期間中央値で補完
標準化学習窓でfit、評価はtransformのみ評価を含めて平均・分散を計算
特徴量選択学習内の入れ子検証で選ぶ全期間との相関で選ぶ
閾値調整検証期間で固定最終OOSの利益が最大になるまで変更
モデル比較全候補と試行数を記録最高モデルだけ報告

評価指標も取引目的へ合わせます。分類精度が高くても、上昇幅の小さい日だけを当てて費用後損益が負なら採用できません。逆に勝率が低くても利益と損失の幅で正の期待値になることがあります。必ずシグナルを注文、約定、費用、数量へ通し、単純な移動平均や買い持ちなどのベースラインと同じ期間で比べます。

相場局面・銘柄群・執行条件で頑健性を確認する

ウォークフォワードの合計損益だけでは、どこで効いたかが隠れます。上昇・下落・横ばい、高低ボラティリティ、金利や制度の変化、流動性の大小、時価総額、業種、買いと売りを分けます。ただし、区分を結果後に増やし続ければ、また多重検定になります。局面の定義と見る表を事前に決めます。

全評価窓で利益を求める必要はありません。戦略の狙いがトレンド局面なら横ばいで小さく負ける可能性があります。重要なのは、どの局面で休むのか、損失の大きさが資金計画内か、再開条件が再現できるかです。最大ドローダウンは将来損失の上限ではないため、バックテスト値へ達する前に縮小・停止線を置きます。

各評価窓をつなぐときの注意

ウォークフォワードの成績は、各評価窓で実際に採用した固定ルールの損益だけを時系列に連結します。窓ごとの最高成績を後から選び直した系列や、評価①ではA、評価②ではBがよかったと結果を見て組み替えた系列は、実行できた運用履歴ではありません。再学習日、採用した版、注文可能になった時刻をログへ残し、その時点で選べた設定だけを使います。

集計では合計利益だけでなく、窓ごとの取引数、費用後期待値、最大ドローダウン、回復期間、売買回転率、採用パラメータの変化を並べます。毎回まったく違う設定が選ばれるなら、市場へ適応している可能性と、標本ノイズへ反応している可能性の両方があります。パラメータの変動幅と、変えなかった単純な基準版も併記してください。

評価窓に取引がゼロの期間があっても削除しません。条件が厳しすぎて機会を逃したのか、見送りが機能したのかを、事前の目的から判断します。取引が少ない窓だけ期間を延ばすと、停止規則まで結果依存になります。延長条件を先に決めるか、標本不足として不確実性を明記します。

また、複数銘柄を同時に扱う場合は、個別戦略の足し算ではなく口座全体で資金拘束と同時保有を再現します。候補が重なった日の優先順位、現金不足、業種集中、発注量の出来高比率が必要です。別々の検証では買えた銘柄をすべて買ったことにすると、実際の資金を超える成績が作られます。

注文・撤退・数量・見送りまで固定する

過剰最適化を避けても、実際に約定できないルールは運用できません。終値で判定した日足戦略なら、同じ終値へ戻って買わず、原則として翌営業日の実行可能価格を使います。手数料、スプレッド、スリッページ、未約定、部分約定を含める実装はバックテスト入門の記事を参照してください。

以下は成績ではなく設計例です。口座500万円、1回の予定損失0.4%=2万円、予定入口1,200円、初期ストップ1,140円、費用・ギャップ余裕を1株20円とします。1株リスクは80円、数量上限は20,000÷80=250株です。100株単位なら200株へ切り下げ、評価中はさらに半分の100株から始める、と事前に決めます。

  • 注文:終値確定後に作り、翌日寄り。寄りが予定より一定率以上高ければ取り消す。
  • 撤退:価格ストップ、時間切れ、モデル無効化条件を別々に記録する。
  • 数量:許容損失÷(入口とストップの差+費用余裕)。単元へ切り下げる。
  • 見送り:スプレッド過大、必要データ欠損、1単元で許容損失超過、決算またぎ禁止。
  • 停止:実績スリッページの継続超過、評価窓で想定外のDD、データ・コード不具合。

期待値、勝率、ドローダウンの読み方は勝率・期待値・最大ドローダウンの記事、予定損失から株数を決める方法はポジションサイズの記事で詳しく説明しています。

採用前の17項目チェックリスト

  1. 仮説と売買ルールを結果を見る前に書いた。
  2. 学習、検証、最終OOSを時間順に分けた。
  3. ラベル・保有期間に応じたgapを置いた。
  4. 前処理は各学習窓だけでfitした。
  5. 最終OOSを見てから同じ期間へ合わせ直していない。
  6. 試した全候補と不採用案を記録した。
  7. 学習長・評価長・更新頻度の探索も試行数へ含めた。
  8. 最高点の周辺でも成績の性質が残った。
  9. 開始日と終了日をずらしても結論が反転しない。
  10. 銘柄、業種、相場局面別の集中を確認した。
  11. 最大利益の取引を除いた結果も確認した。
  12. 手数料と執行摩擦を悪化させた。
  13. 現金、指数、単純ルールと同条件で比べた。
  14. データ版、銘柄集合、コード版、乱数シードを保存した。
  15. 注文、撤退、数量、見送り、停止を固定した。
  16. 小さい数量のフォワード検証を用意した。
  17. バックテストを実績と表示していない。

まとめ:最高成績を探すより、壊れにくい手順を作る

過剰最適化は、パラメータが多いときだけの問題ではありません。同じ期間を何度も見て条件を足す、評価指標を乗り換える、都合のよい銘柄や開始日を選ぶ行為も、過去の偶然へ合わせる自由度を増やします。戻りたい成績を過去に再現できたことだけでは、これから使えるとは分かりません。選ぶまでに何を試したかも残し、まだ見ていない期間へ問いを持っていきます。

候補作成、選択、最終確認を分離し、時間順のウォークフォワードで複数局面を通してください。最高点ではなく広い台地、費用後の期待値、ドローダウン、試行数、再現性を見ます。最後の未使用期間は一度だけ開封し、その後は小さな数量で注文と約定の差を測ります。投資辞典の索引から、バックテスト、資金管理、出口ルールと組み合わせると、見栄えのよい過去から壊れにくい運用手順へ進めます。

本記事は投資手法の学習を目的とし、特定銘柄の売買を推奨するものではありません。数値例は架空で、バックテストおよびシミュレーションは将来の利益・損失を保証しません。投資判断はご自身の責任でお願いいたします。記載の数値は、本文中に示した日付時点の決算短信・会社のIR資料などの公開情報に基づきます。最新の情報は各社の開示でご確認ください。

過剰最適化とウォークフォワード検証の記事アイキャッチ。左に成人日本人女性、右に記事タイトル

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
目次