背景知識: 時系列クロスバリデーション(Purged CV)
「金融データに標準的なK-Foldを使用するのは、明日の新聞を使って今日の株価を予測するようなものだ。」
なぜ標準的なクロスバリデーションが金融では失敗するのか?
標準的なK-Foldの仮定: サンプルは相互に独立。
金融データの現実:
- 今日のリターンは昨日と高い相関(自己相関)
- 100日目を予測するために使用される特徴量は99日目、98日目の情報を含む可能性
- ラベル(リターン)はしばしば複数日のウィンドウを含む
結果: テストセットから訓練セットへの情報「漏れ」、深刻なオーバーフィッティング。
具体的な漏れのケース
シナリオ: 5日後の将来リターンを予測
データ: 1-100日
Label: ret_5d[t] = (close[t+5] - close[t]) / close[t]
サンプル95のラベルは: 95-100日の価格を使用
サンプル96のラベルは: 96-101日の価格を使用(部分的に重複!)
標準的なK-Foldの可能性:
- 訓練セットにサンプル95を含む(ラベルは95-100日を含む)
- テストセットにサンプル96を含む(ラベルは96-101日を含む)
- 96-100日の情報が訓練とテストの両方に!
3つの時系列CV方法
方法1: シンプルな時間分割(Walk-Forward)
Fold 1: Train [1-60] -> Test [61-70]
Fold 2: Train [1-70] -> Test [71-80]
Fold 3: Train [1-80] -> Test [81-90]
Fold 4: Train [1-90] -> Test [91-100]
利点: シンプル、将来情報漏れなし 欠点: 訓練セットが拡大、初期データが古くなる可能性
方法2: ローリングウィンドウ
Fold 1: Train [1-60] -> Test [61-70]
Fold 2: Train [11-70] -> Test [71-80]
Fold 3: Train [21-80] -> Test [81-90]
Fold 4: Train [31-90] -> Test [91-100]
利点: 固定訓練セットサイズ、最新データを使用 欠点: サンプル利用率が低い
方法3: Purged K-Fold(ラベル区間が重なる場合)
観測値が点ラベルではなくラベル区間を持つ場合:
- フォールド定義: 実際のデプロイ問題に合う時間区間でテストフォールドを定義
- Purge: ラベルがテストセットと重複する訓練サンプルを削除
- Embargo: Purgeゾーンを超えて安全バッファーを追加
Purging が処理するのはラベル重複という一つの経路だけである。改訂後データ、将来の利用可能時刻を使った特徴量、ユニバースの生存者バイアス、ターゲットリーク、研究者による結果の反復閲覧、非現実的な執行モデルは修復しない。
Purged CVの説明
問題設定:
- 特徴量ウィンドウ: 過去20日
- ラベルウィンドウ: 将来5日
- データ: 1-100日
ステップ:
1. フォールドを分割(5フォールドと仮定)
Fold 3のテストセット: 41-60日
2. 漏れゾーンを特定
テストラベルが含む: 41-65日(41+5-1から60+5-1)
訓練特徴量が含む: 21-40日もテストに影響可能性
3. Purge
ラベルがテストセットと重複する訓練サンプルを削除
削除: 36-40日(ラベルが36-45を含み、41-65と重複)
4. Embargo
Purge境界を超えてN個の追加サンプルを削除
Embargo = 5日の場合、41-45日の訓練サンプルを削除
可視化:
Embargoの役割
なぜEmbargoが必要か?
ラベルの重複をpurgeしても、まだ存在する可能性:
- 特徴量の自己相関(今日のMA20と明日のMA20はほぼ同一)
- 情報伝播遅延(ニュースの影響が数日続く)
- 市場状態の持続性(トレンドが一夜で消えない)
推奨Embargo長:
| データ頻度 | ラベルウィンドウ | 推奨Embargo |
|---|---|---|
| 日次 | 5日 | 3-5日 |
| 日次 | 20日 | 10-20日 |
| 分次 | 1時間 | 30-60分 |
| ティック | 100ティック | 50-100ティック |
経験則: Embargo ≈ 0.5 x ラベルウィンドウ
実用的な計算例
設定:
- データ: 1000サンプル(4年の日次)
- ラベル: 10日後の将来リターン
- K = 5フォールド
- Embargo = 5日
フォールド割り当て:
| Fold | 元のテスト範囲 | Purge削除 | Embargo削除 | 有効訓練サンプル |
|---|---|---|---|---|
| 1 | 1-200 | なし | なし | 210-1000(790) |
| 2 | 201-400 | 191-200 | 401-405 | 1-190, 406-1000(785) |
| 3 | 401-600 | 391-400 | 601-605 | 1-390, 606-1000(785) |
| 4 | 601-800 | 591-600 | 801-805 | 1-590, 806-1000(785) |
| 5 | 801-1000 | 791-800 | なし | 1-790(790) |
注意: 各フォールドは漏れを防ぐために約15サンプルを失う。
他の方法との比較
| 方法 | 対処するリーク問題 | サンプル利用率 | 計算複雑性 | 適用 |
|---|---|---|---|---|
| シャッフル K-Fold | 通常は時間依存を無視 | 高 | 低 | IID 仮定を正当化し事前宣言できる場合のみ |
| 単純な時間分割 | 順序を保つがラベル重複が残りうる | 中 | 低 | 初期の時系列評価 |
| ローリングウィンドウ | 複数の履歴デプロイ期間を評価 | 低 | 中 | レジームと安定性分析 |
| Purged K-Fold | テスト区間と重なる訓練ラベルを除去 | より高い | 中 | 結果区間が重なるモデル選択 |
| Purged + Embargo | 重複除去に問題固有のバッファーを追加 | 中 | 中 | 情報の持続性がバッファーを正当化する場合 |
マルチエージェントの視点
マルチエージェントシステムでは、異なるエージェントが異なるCV戦略を必要とする:
Signal Agent(5日リターンを予測):
- Purge: 5日ラベルウィンドウ
- Embargo: 3日
- 保守的なモデルパフォーマンス推定
Regime Agent(市場状態を識別):
- Purge: 通常不要(状態は現在のもの)
- Embargo: より長い(状態遷移には慣性がある)
- 状態遷移時の精度に焦点
Risk Agent(ボラティリティを予測):
- Purge: ボラティリティウィンドウ(例: 20日)
- Embargo: 5日
- ボラティリティクラスタリングにはより長いEmbargoが必要
よくある誤解
誤解1: Purged CVを使用するとオーバーフィッティングを防げる
間違い。Purged CVは情報漏れを防ぐだけで、以下を防げない:
- 特徴量が多すぎることによるオーバーフィッティング
- データスヌーピング(良い結果が出るまで繰り返しテスト)
- 過度なモデル複雑性
誤解2: より長いEmbargoは常により良い
完全には正しくない。Embargoが長すぎると:
- 有効な訓練サンプルを無駄にする
- 訓練データが古くなりすぎる可能性
- 計算コストが増加
誤解3: 最終テストのためだけにPurged CVが必要
間違い。ハイパーパラメータチューニングでもPurged CVを使用する必要がある。そうしないとオーバーフィッティングパラメータを選択する。
実用的な推奨事項
1. Purgingが必要かチェック
Purgingが必要な場合:
- ラベルが複数日のウィンドウを含む(例: 将来N日リターン)
- 特徴量が長いウィンドウを含む(例: 60日移動平均)
- サンプルに重複がある
Purgingがあまり必要でない場合:
- ラベルが瞬時的(例: 次のティック方向)
- サンプルが完全に独立(例: 異なる株のクロスセクション)
2. Purge効果を検証
比較実験:
1. 標準的なK-Foldで訓練、テスト精度を記録
2. Purged K-Foldで訓練、テスト精度を記録
3. 差が大きいほど、元の漏れがより深刻
3. 完全に独立したテストセットを確保
例示的な割り当て(境界は割合ではなく問題から決める):
- 開発期間:リーク防止フォールドでモデル選択と調整
- 最終時系列ホールドアウト:研究前に封印し、契約凍結後にだけ開く
「一度だけ使う」はガバナンス規則であって数学的性質ではない。結果を見てモデルを変更すれば、その集合は開発データになり、新しい最終評価が必要になる。
まとめ
| キーポイント | 説明 |
|---|---|
| コア問題 | 時間依存、ラベル重複、データ利用可能時刻が IID 検証仮定を無効にしうる |
| Purge機能 | ラベルがテストセットと重複する訓練サンプルを削除 |
| Embargo機能 | Purge境界を超えて安全バッファーを追加 |
| 方法選択 | ラベル期間とデプロイ問題に合わせ、時系列・ローリング・purged・embargoed 分割を選ぶ |
| 最終証拠 | ゲートを事前登録し、最終時系列ホールドアウトを封印し、試行数と不確実性・コストを報告 |