バックテストの信頼性:未来関数・過剰適合・取引摩擦の排除
資産曲線(NAV)の美しさを疑うことから始める。時系列アライメント、Point-in-Time財務データ、摩擦コスト感応度、および過剰適合の防止策。
クオンツ戦略の研究開発において、最も頻発する過ちは、バックテストの資産曲線(NAV)の滑らかさやシャープレシオの高さを盲信することです。パラメータの過剰チューニング、未来関数の混入、取引コストの過小評価によって作られた「見せかけの優位性」は、実運用(Live Trading)環境において致命的な破綻を招きます。
バックテストの目的は戦略の正当化ではなく、「どのような仮定や欠陥が潜んでいるか」を徹底的に監査することにあります。本稿では、バックテストの信頼性を担保するための厳格な検証規律をまとめます。
先読みバイアス(未来関数)とタイムスタンプ整合性
最も初歩的でありながら深刻なバグが、当日の終値確定シグナルで当日のリターンを算入してしまうタイムスタンプのズレです:
# 先読みバイアスを防止するT+1執行アサーション
import pandas as pd
price = pd.Series([10.0, 10.0, 11.0, 12.0, 13.0]) # Day 2 に急騰
raw_signal = (price > price.shift(1)).astype(int) # 引け後確定シグナル
position = raw_signal.shift(1).fillna(0) # 翌営業日寄付執行(T+1)
returns = price.pct_change().fillna(0)
strategy_returns = position * returns
# 検証:Day 2 の値動きによるリターンは Day 3 以降にしか発生しないこと
assert strategy_returns.iloc[2] == 0.0
assert strategy_returns.iloc[3] > 0.0
Point-in-Time (PIT) 財務データ管理
企業の財務諸表は四半期末(report_period)から実際の公表(available_at)まで数週間のタイムラグが存在します。さらに、速報値から確定値、事後修正値(Restatement)への改定が行われます。
バックテスト実行時には、以下のPITメタデータを厳格に適用します:
- 各リバランス日 $T$ において、利用可能なレコードは $available_at \le T$ を満たすものに限定する;
- 事後修正された最新データを過去日付に遡及適用(Look-ahead)しない。
| フィールド | 目的 |
|---|---|
report_period | 対象四半期/決算期 |
available_at | 市場開示日時(この日時以降にのみ計算可能) |
revision_type | 業績予想 / 速報値 / 確定決算 / 修正申告 |
クエリ制約: SELECT * FROM fundamental_data WHERE available_at <= current_backtest_date
グロスリターンは現実世界のものではない
取引摩擦コストと感応度分析
手数料、売買スプレッド、スリッページ、マーケットインパクトなどの摩擦コストをゼロまたは非現実的な低水準に設定した場合、高回転戦略のバックテスト結果は大幅に過大評価されます。
戦略の堅牢性を検証するため、以下の3段階のコスト感応度テストを実施します:
- 基本コストモデル: 現実的な手数料 + 想定スリッページ(例:片道 10〜15 bps);
- ストレステスト(コスト倍増): 手数料・スリッページを2倍に引き上げた条件下でのリターンと最大ドローダウン;
- 回転率抑制テスト: リバランス頻度を落とした場合のアルファ減衰測定。
コスト倍増時に戦略リターンが急激に赤字転落する場合、その戦略は実市場における取引摩擦に耐えられない「見せかけの優位性」に依存しています。
サンプル外(OOS)テストと過剰適合の防止
テスト期間のパフォーマンスを見てからパラメータを再調整する行為は、テストデータを実質的な学習データへ変貌させ、重大な過剰適合を引き起こします。
システムでは Walk-Forward 分析を標準ワークフローとして採用しています:
- 各ローリングウィンドウにおいて、パラメータ探索はインサンプル(IS)期間のみで行う;
- 最適化されたパラメータをロックし、直後のアウトオブサンプル(OOS)期間に一度だけ適用;
- 過去のテスト結果に基づく事後的なパラメータ修正を禁止。
生存者バイアス・売買制限の監査
- 生存者バイアス: 上場廃止銘柄や経営破綻銘柄を含めた完全な過去ヒストリカルユニバースを使用;
- 値幅制限(ストップ高・ストップ安)と売買停止: ストップ高比例配分での買付や、売買停止中の強制約定を禁止し、未約定シグナルとして処理;
- 動的ユニバースの時系列更新: 時価総額順位やセクター分類は各リバランス時点の過去値を使用。
監査チェックリスト
| 監査項目 | 失敗時のリスク | 対策 |
|---|---|---|
| タイムスタンプ | 当日確定シグナルの即時約定(未来関数) | $T$ 日シグナルは $T+1$ 日執行を強制 |
| 財務データ | 開示日前の未公表データの利用 | Point-in-Time (available_at) 制限 |
| 摩擦コスト | 取引コスト過小評価による虚偽の優位性 | 2倍コストでのストレステスト |
| パラメータ検証 | テストセットへの過剰適合 | Walk-Forward サンプル外結合 |
| 銘柄ユニバース | 生存者バイアスと売買停止の無視 | 上場廃止銘柄含有・ストップ高約定禁止 |
これらの検証基盤と監査フローは、AI Quant System に組み込まれています。
本記事は定量的手法とシステム設計に関する技術記録であり、投資助言を提供するものではありません。