【ファイナンス機械学習の勉強メモ】組合せパージング交差検証 (Combinatorial Purged Cross-Validation; CPCV) とは【簡単にわかりやすく】

簡単に解説

CPCV法とは、通常の交差検証では1グループしかテストデータに使わないが、複数グループをテストデータに使い、テストデータの組み合わせ複数得ることによって、バックテスト結果の経路を増やす方法である。

バックテスト経路を複数得ることで、バックテスト結果のシャープレシオも複数得たい、というのがモチベーションだ(シャープレシオ以外のパフォーマンス指標も同様に複数得られる)。通常の交差検証では、バックテスト結果の経路は1つしか得られないので、その経路におけるシャープレシオの値が1つしか得られない。一方で、CPCV法であればバックテスト結果の経路が2つ以上得られるので、バックテスト結果からシャープレシオの分布が手に入る。

交差検証 (Cross-Validation)

CPCV法は通常の交差検証と比較しないと理解できないので、まず交差検証を簡単にレビューする。交差検証とは、未来のデータで訓練したモデルを過去のデータでテストしてもよい、とする方法である。

  • 手元にあるデータは1月から6月のものとする。
  • これを各月のデータに6分割する(1月のデータ、2月のデータ、・・・、6月のデータ)。ファイナンス機械学習ではこの各分割を「グループ」と呼んでいる。
  • 交差検証では、6分割したデータのうち、1グループのみをテストデータに使い、残りの5グループ全てを訓練データに使う。
    • 2月~6月のデータで訓練したモデルを1月のデータでテスト(1月の運用結果を得る)。
    • 1月、3月~6月のデータで訓練したモデルを2月のデータでテスト(2月の運用結果を得る)。
    • ・・・
    • 1月~5月のデータで訓練したモデルを6月のデータでテスト(6月の運用結果を得る)。
  • これにより、運用結果(バックテスト結果)の経路が1本得られる。すなわち、1月の運用結果、2月の運用結果、・・・、6月の運用結果、という運用結果の経路は1つしか得られない。
    • 1月の運用結果は、2月~6月のデータで訓練したモデルを使った場合の1つだけ
    • 2月の運用結果は、1月、3月~6月のデータで訓練したモデルを使った場合の1つだけ
    • ・・・
    • 6月の運用結果は、1月~5月のデータで訓練したモデルを使った場合の1つだけ
  • バックテスト結果の「経路」というのが初めはピンとこないかもしれないが、要するに「バックテスト結果を、テストデータの時系列に並べたもの」である。

CPCV (Combinatorial Purged Cross-Validation)

通常の交差検証ではテストデータ期間を1つずつしか選択しなかったが、CPCV法ではテストデータ期間を複数ずつ選択することで、テストデータ期間の「組み合わせ」を生み出す。交差検証と同じ例で見てみる。

  • 手元にあるデータは1月から6月のものとする。
  • これを各月のデータに6分割する(1月のデータ、2月のデータ、・・・、6月のデータ)。ファイナンス機械学習ではこの各分割を「グループ」と呼んでいる。
  • CPCV法では、6分割したデータのうち、複数グループをテストデータに使い、残りのグループ全てを訓練データに使う。ここでは『ファイナンス機械学習』p212の例にならい、6分割したデータから2つのグループをテストデータに選ぶとする。
    • すると、テストデータの組み合わせは、6から2を選ぶ組み合わせ \({}_6 C_2 = 15\) 通り作れる。 これがp212の図におけるS1からS15である。

以下の図はこちらに公開されている論文から抜粋

  • xがついているのがテストデータで、空欄が訓練データである。
  • 縦軸のG1からG6が6つのグループ(1月データから6月データ)を表す。
  • 6グループから2グループをテストデータとして選ぶ組み合わせは15通りあり、それが横軸のS1からS15に対応する。
  • S1からS15はそれぞれ、テストデータとして選んだ2グループの組み合わせが異なり、テストデータが異なるということは、テストデータ以外のデータつまり訓練データも異なる。
  • S1からS15はそれぞれ、訓練データとテストデータの内容が異なるので、テストデータから得られる運用結果もそれぞれ異なる。
  • この図から、互いに重複のないバックテスト結果の経路が5通りあることがわかる。
  • 経路の1つ目は、図で「1」となっているグリッドを上から下につないだもの。つまり、
    (G1,S1)→(G2,S1)→(G3,S2)→(G4,S3)→(G5,S4)→(G6,S5)
    である。
    • 1月 (G1) のテスト結果は、訓練データに3月~6月 (S1の列で空欄になっている行) を使ったもの
    • 2月 (G2) のテスト結果は、訓練データに3月~6月 (S1の列で空欄になっている行) を使ったもの
    • 3月 (G3) のテスト結果は、訓練データに2月、4月~6月 (S2の列で空欄になっている行) を使ったもの
    • 4月 (G4) のテスト結果は、訓練データに2月~3月、5月~6月 (S3の列で空欄になっている行) を使ったもの
    • 5月 (G5) のテスト結果は、訓練データに2月~4月、6月 (S4の列で空欄になっている行) を使ったもの
    • 6月 (G6) のテスト結果は、訓練データに2月~5月 (S5の列で空欄になっている行) を使ったもの
  • 経路の2つ目は、図で「2」となっているグリッドを上から下につないだもの。つまり、
    (G1,S2)→(G2,S6)→(G3,S6)→(G4,S7)→(G5,S8)→(G6,S9)
    である。
    • 1月 (G1) のテスト結果は、訓練データに2月、4月~6月 (S2の列で空欄になっている行) を使ったもの
    • 2月 (G2) のテスト結果は、訓練データに1月、4月~6月 (S6の列で空欄になっている行) を使ったもの
    • 3月 (G3) のテスト結果は、訓練データに1月、4月~6月 (S6の列で空欄になっている行) を使ったもの
    • 4月 (G4) のテスト結果は、訓練データに1月、3月、5月~6月 (S7の列で空欄になっている行) を使ったもの
    • 5月 (G5) のテスト結果は、訓練データに1月、3月~4月、6月 (S8の列で空欄になっている行) を使ったもの
    • 6月 (G6) のテスト結果は、訓練データに1月、3月~5月 (S9の列で空欄になっている行) を使ったもの
  • 全く同様に、3つ目の経路から5つ目の経路も求まる。
  • これらバックテスト結果の5つの経路は、互いに重複していない。
  • 経路1のパフォーマンス指標、経路2のパフォーマンス指標、・・・、経路5のパフォーマンス指標、というように、経路の数だけバックテストのパフォーマンス指標が得られる。
  • 経路の数(いまの場合は5)を示しているのが、『ファイナンス機械学習』p212の \(\phi [N, k] = \frac{k}{N} {}_N C_{N-k}\) である。
  • いまの例だと、\(N = 6, k = 2\) である。つまり、N個のグループがあり、そこからテストデータとしてk個のグループを選んでいる。よって組み合わせの数は、 \({}_N C_{k} = {}_N C_{N-k} = 15\) 通りある。
  • テストデータのグループの総数は、2 x 15 = 30個ある。これが6つのグループに渡って一様に分布しているので、30÷6 = 5通りの経路があることになる。
  • データの分割数を増やすことで、グループ数であるNを増やし、それと同時にテストデータのグループ数であるkをN/2に近づければ、バックテスト結果の経路の数 \(\phi[N, k]\) を大きくすることができる。
  • それによってバックテスト結果のパフォーマンス指標の分布が、細かい粒度で求められる。
  • もちろん、データの分割数を増やすと、訓練データ・テストデータのグループ一つ一つのサイズが小さくなってしまうことに注意。

参考資料

Marcos Lopez de Prado (quantresearch.org)

Cross Validation in Finance: Purging, Embargoing, Combinatorial (quantinsti.com)

あわせて読みたい