背景知識: 時系列クロスバリデーション(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(推奨)
標準的なK-Foldの上に:
- 時間順序: K個のフォールドを時系列順に分割
- Purge: ラベルがテストセットと重複する訓練サンプルを削除
- Embargo: Purgeゾーンを超えて安全バッファーを追加
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 | 深刻 | 高 | 低 | 金融には不適 |
| シンプルな時間分割 | なし | 中 | 低 | クイック検証 |
| ローリングウィンドウ | なし | 低 | 中 | 戦略安定性テスト |
| 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. 完全に独立したテストセットを確保
データ割り当て:
- 70%: モデル選択とハイパーパラメータチューニングのためのPurged K-Fold
- 30%: 完全に分離された最終テストセット、一度だけ使用
まとめ
| キーポイント | 説明 |
|---|---|
| コア問題 | 時系列サンプルは独立していない、標準CVは漏れを引き起こす |
| Purge機能 | ラベルがテストセットと重複する訓練サンプルを削除 |
| Embargo機能 | Purge境界を超えて安全バッファーを追加 |
| 推奨方法 | Purged K-Fold + Embargo |
| 検証方法 | 標準CVとPurged CVの結果を比較 |