← Alle Insights

White's Reality Check & Hansen's SPA: Multiple-Testing-Korrektur für Strategien.

Wer 500 Strategien testet und die beste live schickt, hat statistisch fast garantiert einen Zufallstreffer erzeugt. Bonferroni ist zu hart, einzelne P-Values zu lasch. White's Reality Check und Hansen's SPA sind der saubere Kompromiss — und in Strategie-Selektion das, was den Unterschied macht.

Multiple Testing ist das wahrscheinlich am stärksten unterschätzte Problem im Quant-Trading. Wer einzelne Strategien sauber prüft, aber 1.000 davon getestet hat und nur die beste meldet, betreibt versteckten P-Hacking-Ablauf. Ich sehe das in Mandanten-Decks ständig: „diese Strategie hat einen P-Value von 0,01“ — aber sie ist die Beste aus 200 Varianten, also ist der wahre P-Value näher an 0,87.

Das Multiple-Testing-Problem konkret.

Wenn Sie unter der Null-Hypothese (keine Strategie funktioniert) 100 unabhängige Tests laufen lassen, jeweils mit α = 0,05, erwarten Sie 5 falsche Positive. Wenn Sie 1.000 Strategien testen, 50. Nehmen Sie die scheinbar beste, ist die Chance, dass sie reines Rauschen ist, dramatisch erhöht.

Family-Wise Error Rate (FWER): die Wahrscheinlichkeit, mindestens eine falsche Entdeckung zu machen. Bei 100 Tests und α = 0,05 ist FWER ≈ 1 − (1 − 0,05)^100 ≈ 99,4 %. Praktisch garantierter falscher Treffer.

Warum Bonferroni nicht reicht.

Bonferroni-Korrektur: α durch Anzahl der Tests teilen. Bei 1.000 Strategien also α = 0,00005. Sauber, einfach, aber: in der Praxis tötet Bonferroni jede realistische Strategie. Trading-Returns sind hochgradig korreliert — 100 Variationen eines Moving-Average-Crossover sind keine 100 unabhängigen Tests. Bonferroni ignoriert das und ist deshalb chronisch zu konservativ.

Konkret: zwei Strategien mit Korrelation 0,9 liefern faktisch eine Information. Bonferroni straft sie wie zwei unabhängige. Ergebnis: echte Edges fallen durchs Raster.

White's Reality Check (2000).

Halbert White hat in „A Reality Check for Data Snooping“ einen Bootstrap-Test vorgeschlagen, der die echte Korrelations-Struktur der Strategien berücksichtigt. Idee:

  1. Berechnen Sie für jede der k Strategien die durchschnittliche Outperformance gegenüber einer Benchmark.
  2. Die Test-Statistik ist die maximale Outperformance über alle Strategien.
  3. Bootstrap (mit Stationary Bootstrap, der Time-Series-Korrelation respektiert) liefert die Null-Verteilung dieser Maximum-Statistik.
  4. Der P-Value ist der Anteil der Bootstrap-Maxima, die größer sind als die beobachtete Maximum-Outperformance.

Wichtig: weil das Maximum bootstrappt wird, ist die FWER automatisch kontrolliert. Korrelation zwischen Strategien ist eingebaut — keine zusätzliche Korrektur nötig.

Hansen's Superior Predictive Ability (2005).

Peter Hansen hat einen Schwachpunkt von White's Reality Check identifiziert: er ist anfällig für „schlechte“ Strategien im Pool. Wenn Sie 999 schlechte Strategien und 1 echte mit Edge testen, ziehen die schlechten den Null-Verteilungs-Median nach unten und machen es leichter für jede einzelne, signifikant zu sein — was den Test invertiert macht.

Hansen's SPA-Test gewichtet schlechte Strategien aus der Null-Verteilung raus. Das macht den Test deutlich mächtiger (höhere Power bei gleicher Fehlerrate). In der Praxis: SPA findet echte Edges, wo Reality Check nichts sieht.

Model Confidence Set (Hansen, Lunde, Nason 2011).

Manchmal will man nicht die eine beste Strategie, sondern eine Menge aller Strategien, die nicht signifikant schlechter sind als die beste. Das ist der Model Confidence Set. Praktisch nützlich, wenn Sie ein Ensemble bauen wollen oder mehrere Strategien parallel laufen lassen.

Vorgehen: iterativ wird die schwächste Strategie aus dem Pool entfernt, bis keine mehr signifikant unter der besten liegt. Was übrig bleibt, ist das MCS.

Python-Implementation.

Die Bibliothek arch implementiert SPA und MCS robust. Reality Check baut man oft selbst.

# Hansen's SPA mit arch.bootstrap
import numpy as np
import pandas as pd
from arch.bootstrap import SPA

# losses: DataFrame mit shape (T, k)
# Zeilen = Tage, Spalten = Strategien
# Werte = negative Returns (kleiner = besser)
# benchmark_loss: Vektor (T,) der Benchmark-Verluste

spa = SPA(benchmark_loss, losses, reps=10000, block_size=10,
          studentize=True, bootstrap='stationary')
spa.compute()

print(f"P-value (consistent): {spa.pvalues['consistent']:.4f}")
print(f"P-value (lower):      {spa.pvalues['lower']:.4f}")
print(f"P-value (upper):      {spa.pvalues['upper']:.4f}")

# Drei P-Values:
# consistent  = Hansen's empfohlener Test
# lower       = konservativ (Bonferroni-ähnlich)
# upper       = liberal (White's Reality Check)

Praxisbeispiel: 50 Strategien aus dem Mandanten-Projekt.

Ende 2031 hatte ein Family Office 50 systematische Strategien zur Auswahl — von Trendfolge über Mean-Reversion bis zu Carry-Strukturen, getestet auf einem 10-Jahres-Universum. Naive Auswahl: Top 5 nach Sharpe, jede mit P-Value < 0,05 im Einzeltest. Hörte sich gut an.

SPA-Test mit 10.000 Bootstrap-Samples, Block-Größe 10:

Allokationsentscheidung: das MCS-Triple wurde gleichgewichtet, die zwei rausgefallenen Strategien wurden auf Watchlist. Live-Performance nach 12 Monaten lag im erwarteten SPA-Konfidenzintervall.

FWER vs. FDR.

Family-Wise Error Rate (FWER): Wahrscheinlichkeit für mindestens einen falschen Treffer. Hart.

False Discovery Rate (FDR, Benjamini-Hochberg): erwarteter Anteil falscher Treffer unter den positiven. Weicher.

Für Allokationsentscheidungen mit echtem Kapital favorisiere ich FWER (Reality Check, SPA). Für explorative Strategie-Pipelines, wo Sie mit einigen falschen Positiven leben können, ist FDR sinnvoller. Mischformen existieren — etwa Romano-Wolf-Stepwise-Procedures, die FWER liefern aber mit höherer Power.

Caveats.

Meine Praxis.

Bei Strategie-Selektion in Mandanten-Projekten ist SPA Pflicht, bevor Kapital allokiert wird. Reality Check nutze ich als zusätzlichen Sanity-Check — wenn beide übereinstimmen, ist die Entscheidung robust. MCS verwende ich, wenn der Mandant ein Ensemble fahren will. Die Korrektur ist methodisch teuer und politisch unbeliebt („Sie killen meine Top-Strategien“) — aber sie ist das ehrlichste Filter gegen Selection-Bias, das ich kenne.

Ein nüchterner Satz zum Schluss: wer 50 Strategien testet und 0 SPA-signifikante findet, hat keine Trading-Strategien — er hat eine Sammlung von Glück und Rauschen. Das ist eine teure Erkenntnis. Aber besser jetzt als nach Live-Allokation.

Sie wollen Ihre Strategie-Pipeline gegen Multiple Testing absichern? Erstgespräch buchen — wir setzen SPA und MCS in Ihrer Codebase auf.