Combinatorial Purged Cross-Validation (CPCV):Definition, Methodik und Data Leakage
Offizielle Definition
Die Combinatorial Purged Cross-Validation (CPCV) ist ein fortschrittliches Kreuzvalidierungsverfahren für Finanzzeitreihen und maschinelles Lernen im quantitativen Wertpapierhandel, entwickelt von Marcos López de Prado (2018)[cite: 9, 10]. Sie adressiert die gravierenden Schwächen klassischer K-Fold-Kreuzvalidierungen sowie herkömmlicher Backtesting-Verfahren, indem sie zwei methodische Prinzipien vereint: Das Purging und Embargoing zur vollständigen Beseitigung von Informationsüberlappungen (Data Leakage) sowie eine kombinatorische Aufteilung der Gesamtstichprobe. Dadurch generiert CPCV aus einem einzigen historischen Datensatz eine empirische Verteilung multipler, realitätsnaher Backtest-Pfade, anstatt lediglich eine isolierte historische Verlaufskurve abzubilden.
Steckbrief: CPCV auf einen Blick
| Kategorie: | Machine Learning & NLP / Algorithmischer Handel & Backtesting |
| Begründer: | Marcos López de Prado (2018, „Advances in Financial Machine Learning“) |
| Mathematische Basis: | Kombinatorik, Purging (Label-Overlap Removal), Embargoing (Autokorrelations-Puffer) |
| Primäre Input-Parameter: | Anzahl der Gruppen (N), Test-Gruppen (k), Vorhersagehorizont, Embargo-Spanne |
| Schlüsseloutput: | Probability of Backtest Overfitting (PBO) und Verteilung historischer Sharpe Ratios |
| Hauptnutzen: | Vollständige Eliminierung von Look-Ahead-Bias und Generierung diverser Testpfade |
Methodische Funktionsweise: Information Leaks und Kombinatorik
Herkömmliche Kreuzvalidierungsverfahren aus der Informatik setzen voraus, dass Beobachtungen unabhängig und identisch verteilt sind (IID). Bei Finanzdaten trifft diese Annahme niemals zu. Kurse und Renditen weisen ausgeprägte serielle Korrelationen auf. Werden Labels über variable Halteperioden definiert, etwa durch die Triple-Barrier-Methode, greift die Information eines Trainingslabels zeitlich in die Testperiode über. Das Modell lernt somit aus der Zukunft und erzeugt Scheinerfolge.
Purging und Embargoing: Bereinigung des Informationsflusses
Um dieses Lecken von Trainingsinformationen in das Testfenster mathematisch auszuschließen, wendet CPCV zwei Filter an:
- Purging: Entfernt alle Trainingsbeobachtungen, deren Label-Auswertungszeitraum sich mit dem Beginn oder Verlauf des Testintervalls zeitlich überschneidet.
- Embargoing: Platziert unmittelbar nach dem Ende des Testfensters eine zeitliche Sperrfrist. Da Marktreaktionen und Autokorrelationen nach dem Testzeitraum fortwirken, verhindert das Embargo, dass nachfolgende Trainingsdaten noch Resteigenschaften des vorangegangenen Testregimes enthalten.
Das Kriterium für das Purging definiert, dass eine Trainingsbeobachtung i verworfen werden muss, sobald ihr Intervall das Testfenster schneidet:
In diesem Ausdruck markiert ti,0 den Startzeitpunkt und ti,1 den Endzeitpunkt des Labels für die Beobachtung i.
Kombinatorische Aufteilung und Pfadberechnung
Klassische Backtests und Walk-Forward-Analysen testen stets nur einen einzigen historischen Verlaufspfad. CPCV teilt die Gesamtstichprobe stattdessen in N chronologische Abschnitte auf und wählt für jeden Validierungsschritt jeweils k Abschnitte als Testdaten aus. Die übrigen Abschnitte bilden nach Anwendung von Purging und Embargoing die Trainingsmenge. Die Anzahl aller eindeutigen Kombinationen und die daraus resultierende Zahl vollständiger Backtest-Pfade berechnen sich kombinatorisch:
Wählt ein Quant-Entwickler beispielsweise N = 6 Gruppen und testet jeweils k = 2 Gruppen gleichzeitig, entstehen 15 verschiedene Trainingsläufe und fünf vollständig verkettete, historische Out-of-Sample-Pfade. Statt einer einzelnen Equity-Kurve erhält der Analyst eine empirische Verteilung der Strategieleistung.
Interaktiver Cross-Validation-Simulator
Interaktiver Simulator: Combinatorial Splits, Purging und Embargo
Untersuche die Generierung leckagefreier Trainings- und Testpfade nach Marcos López de Prado: Verändere die Gruppenanzahl N, die Testblock-Kombination k sowie das Embargo-Zeitfenster. Der Canvas visualisiert live alle kombinatorischen Folds sowie die automatische Beseitigung überlappender Datenkontaminationen.
Modell-Validierung: Pfad-Kombinatorik & Leckage-Prävention
Praxis-Intuition: Warum Standard-Kreuzvalidierung im Trading betrügt
Die Spickzettel-Analogie: Wenn Prüfungsfragen vorab bekannt sind
Betrachte den Unterschied zwischen klassischer Kreuzvalidierung (Standard k-Fold) und Combinatorial Purged Cross-Validation wie die Vorbereitung auf eine Universitätsprüfung:
- Das Spicken durch überlappende Fragen (Klassisches k-Fold mit Data Leakage): Ein Student erhält für seine Klausurvorbereitung 500 Übungsaufgaben. Da viele Aufgaben auf denselben Sachverhalten aufbauen, enthalten die Fragen 101 bis 105 exakt dieselben Fallbeispiele wie die Fragen 106 bis 110. Wird der Datensatz nun willkürlich in Trainings- und Testblöcke zerschnitten, wandert Frage 105 in das Trainingsset und Frage 106 in den Test. Der Student besteht die Prüfung scheinbar mit Bestnote: Er hat den Inhalt jedoch nicht verstanden, sondern lediglich die Antwort aus dem vorherigen Trainingsbeispiel auswendig gelernt (Information Leakage).
- Der unbestechliche Prüfer (CPCV mit Purging & Embargo): Ein strenger Dozent trennt die Themengebiete radikal. Sobald eine Frage im Testset behandelt wird, schneidet er alle vorangegangenen Aufgaben mit thematischer Überschneidung aus dem Trainingskatalog heraus (Purging). Zusätzlich verhängt er für die darauffolgenden Kapitel eine Sperrfrist (Embargo), damit kein Nachhall-Effekt das Ergebnis verfälscht. Erst wenn das Modell diese leckagefreie Prüfung über viele unterschiedliche Aufgabenkombinationen hinweg besteht, ist das Alpha statistisch echt.
Das Leckage-Dilemma: Warum Finanzdaten keine Bilddateien sind
Klassische k-Fold Cross-Validation wurde für Bilderkennung oder tabellarische Daten entwickelt, bei denen Beobachtungen unabhängig und identisch verteilt sind (IID). Finanzzeitreihen verletzen diese Grundannahme fundamental:
-
Label-Überlappung durch Triple-Barrier: Werden Kurslabels über Halteperioden von beispielsweise fünf Tagen gebildet, teilen sich benachbarte Beobachtungen denselben Kurspfad. Befindet sich der Testblock unmittelbar neben dem Trainingsblock, kennt das Modell die Zukunft des Trades bereits aus dem Training.
- Autoregressives Gedächtnis (Serielle Korrelation): Volatilität clustert und Markttrends klingen über Tage hinweg nach. Ohne Embargo sickern Informationen über die Zeitreihenkorrelation in den Testzeitraum ein.
Der Ausweg durch CPCV:
Marcos López de Prado löst dieses Kernproblem zweifach: Purging schneidet überlappende Labels vor dem Testblock rigoros ab, während das Embargo eine Schutzzone nach dem Testblock errichtet. Durch das kombinatorische Vertauschen von N Gruppen über k Testblöcke entstehen zudem $\binom{N}{k}$ vollwertige Backtest-Pfade, wodurch Analysten eine echte Verteilung historischer Sharpe Ratios statt einer einzelnen Zufallszahl erhalten.
Python-Implementierung: Combinatorial Purged Cross-Validation nach López de Prado
Die folgende Referenz-Implementierung in reinem Pandas, NumPy und Itertools teilt Zeitreihen in N Abschnitte, generiert alle kombinatorischen Test-Pfade (N über k) und eliminiert Datenkontaminationen an den Schnittstellen über adaptives Purging und Embargo:
import itertools
import numpy as np
import pandas as pd
class CombinatorialPurgedKFold:
"""
Combinatorial Purged Cross-Validation (CPCV) nach Marcos López de Prado.
Generiert kombinatorische Trainings- und Test-Splits mit striktem Purging
und Embargo gegen Data Leakage und serielle Autokorrelation.
"""
def __init__(self, n_splits: int = 5, n_test_splits: int = 2, embargo_pct: float = 0.02):
assert n_splits > n_test_splits, "n_splits muss groesser als n_test_splits sein."
self.n_splits = n_splits
self.n_test_splits = n_test_splits
self.embargo_pct = embargo_pct
def split(self, x_data: pd.DataFrame, label_end_times: pd.Series):
"""
Erzeugt Generator-Pfade fuer Training und Test.
label_end_times: Zeitstempel des Trade-Endes (z. B. Triple-Barrier-Ende t1).
"""
n_samples = len(x_data)
indices = np.arange(n_samples)
embargo_len = int(n_samples * self.embargo_pct)
# 1. Datensatz in N gleich grosse Zeitbloecke zerlegen
chunk_size = n_samples // self.n_splits
chunks = [list(range(i * chunk_size, (i + 1) * chunk_size)) for i in range(self.n_splits - 1)]
chunks.append(list(range((self.n_splits - 1) * chunk_size, n_samples)))
# 2. Alle Kombinationen von k Testbloecken berechnen
combos = list(itertools.combinations(range(self.n_splits), self.n_test_splits))
for combo in combos:
test_idx = []
for c in combo:
test_idx.extend(chunks[c])
test_idx = np.array(sorted(test_idx))
# Testzeitraeume (Start- und Endzeitpunkte) bestimmen
test_starts = [chunks[c][0] for c in combo]
test_ends = [chunks[c][-1] for c in combo]
# 3. Training initialisieren und Purging / Embargo anwenden
train_mask = np.ones(n_samples, dtype=bool)
train_mask[test_idx] = False
for t_start, t_end in zip(test_starts, test_ends):
test_start_time = x_data.index[t_start]
test_end_time = x_data.index[t_end]
# Purging: Trainingslabels vor t_start verwerfen, falls ihr Ende in den Test ragt
purged_mask = (x_data.index < test_start_time) & (label_end_times >= test_start_time)
train_mask[purged_mask] = False
# Embargo: Schutzzone direkt nach dem Testfenster sperren
embargo_limit = min(n_samples, t_end + 1 + embargo_len)
train_mask[t_end + 1:embargo_limit] = False
train_idx = indices[train_mask]
yield train_idx, test_idx
Hinweis für Quant-Pipelines: Der Parameter label_end_times muss exakt den Zeitstempel des Barrier-Events (obere Barriere, Stop-Loss oder vertikale Zeitbarriere) enthalten. Nur so kann Purging diejenigen Trades im Trainingsdatensatz exakt identifizieren, deren Halteperiode in den Testzeitraum hineinragt.
Einsatz am Kapitalmarkt: Auditierung und PBO-Berechnung
In der institutionellen Modellprüfung gilt CPCV als Goldstandard für Machine-Learning-Strategien:
- Berechnung der Probability of Backtest Overfitting (PBO): Da CPCV Dutzende historische Pfade konstruiert, lässt sich berechnen, wie hoch die Wahrscheinlichkeit ist, dass die beste In-Sample-Konfiguration im Out-of-Sample-Bereich unterdurchschnittlich abschneidet. Liegt die PBO über 0,50, beruht das Modell auf Overfitting.
- Robuste Stresstests für neuronale Netze: Komplexe Deep-Learning-Architekturen wie LSTM oder Transformer neigen bei Finanzzeitreihen zu starker Überanpassung. CPCV deckt auf, ob die gefundene Signalstruktur stabil über verschiedene Marktregimes hinweg generalisiert.
- Verbindung zu statistischen Kennzahlen: Die Verteilung der resultierenden Out-of-Sample-Ergebnisse liefert die direkten Input-Parameter für weiterführende Metriken wie die Deflated Sharpe Ratio (DSR) und die Minimum Track Record Length (MinTR).
Methodische Grenzen und Rechenaufwand
Trotz ihrer mathematischen Eleganz stellt CPCV hohe Anforderungen an die Infrastruktur:
- Extremer Rechenaufwand: Während ein normaler Backtest ein Modell einmal trainiert, erfordert CPCV bei komplexen Parametergittern Hunderte vollständige Trainingsläufe. Bei tiefen neuronalen Netzen steigen die Anforderungen an GPU-Cluster drastisch.
- Verlust an Trainingsdaten: Durch das rigorose Purging überlappender Beobachtungen schrumpft das effektive Trainingsvolumen. Bei Datensätzen mit langfristigen Zeithorizonten verbleiben unter Umständen zu wenige Datenpunkte für datenhungrige Machine-Learning-Verfahren.
- Komplexität der Parameterwahl: Die Festlegung von N, k und der Embargo-Dauer erfordert tiefes mathematisches Verständnis für die Autokorrelationsstruktur der untersuchten Märkte.
Häufig gestellte Fragen zu CPCV
Die Walk-Forward-Analyse testet streng chronologisch von der Vergangenheit in die Zukunft und erzeugt genau einen historischen Ergebnisverlauf. CPCV nutzt kombinatorische Splits der Gesamthistorie und erzeugt eine Vielzahl gleichwertiger Backtest-Pfade, wodurch eine statistisch valide Verteilung von Renditen und Sharpe Ratios ermittelt werden kann.
Labels im Finanzbereich erstrecken sich meist über Tage oder Wochen in die Zukunft. Ohne Purging würden Trainingsbeobachtungen genutzt, deren Vorhersagezeitraum in das Testintervall hineinragt. Das System würde mit zukünftigen Testergebnissen trainiert werden, was die historische Performance künstlich aufbläht.
Purging entfernt überlappende Datenpunkte vor und während des Testfensters. Embargoing setzt hingegen nach dem Testfenster an und blockiert eine definierte Zeitspanne, um zu verhindern, dass serielle Korrelationen aus dem Testbereich die nachfolgenden Trainingsdaten verzerren.
Bei sehr kleinen Datensätzen mit wenigen Beobachtungen oder Strategien mit extrem langen Haltedauern kann das Purging so viele Datenpunkte entfernen, dass die verbleibende Trainingsmenge nicht mehr ausreicht. Zudem ist der Einsatz bei einfachen linearen Modellen ohne Machine-Learning-Komponente oft unverhältnismäßig rechenintensiv.