背景知識: 時系列クロスバリデーション(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の上に:

  1. 時間順序: K個のフォールドを時系列順に分割
  2. Purge: ラベルがテストセットと重複する訓練サンプルを削除
  3. 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日の訓練サンプルを削除

可視化:

Purged K-Foldクロスバリデーション

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削除有効訓練サンプル
11-200なしなし210-1000(790)
2201-400191-200401-4051-190, 406-1000(785)
3401-600391-400601-6051-390, 606-1000(785)
4601-800591-600801-8051-590, 806-1000(785)
5801-1000791-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の結果を比較
この章を引用する
Zhang, Wayland (2026). 背景知識: 時系列クロスバリデーション(Purged CV). In AIクオンツ取引:ゼロからイチへ. https://waylandz.com/quant-book-ja/Time-Series-Cross-Validation-Purged-CV
@incollection{zhang2026quant_Time_Series_Cross_Validation_Purged_CV,
  author = {Zhang, Wayland},
  title = {背景知識: 時系列クロスバリデーション(Purged CV)},
  booktitle = {AIクオンツ取引:ゼロからイチへ},
  year = {2026},
  url = {https://waylandz.com/quant-book-ja/Time-Series-Cross-Validation-Purged-CV}
}