← Alle Insights

Bias-Korrektur in Backtests: Survivorship, Look-Ahead, Selection systematisch eliminieren.

Ein Backtest sagt nur dann etwas Brauchbares aus, wenn er die vier großen Bias-Quellen kennt und korrigiert. Tut er es nicht, ist er Marketing — kein Test. Hier die Checkliste, mit der ich jeden Backtest abklopfe, bevor er produktiv geht.

Wenn ich einen Backtest sehe, der Sharpe 2.5 und 8 Prozent Max-Drawdown zeigt, ist meine erste Frage nicht „wie", sondern „welche Bias-Quellen wurden korrigiert?". Die ehrliche Antwort ist häufig: keine. Was zur Folge hat, dass die Performance live um 50 bis 80 Prozent einbricht — nicht wegen Slippage, sondern weil der Backtest auf einer geschönten Realität trainiert wurde.

Bias 1: Survivorship.

Sie testen eine Strategie auf den S&P-500-Aktien von heute. Problem: das sind die Überlebenden. Lehman Brothers, Enron, WorldCom, Wirecard — alles Firmen, die mal im Index waren, heute aber nicht mehr. Ihr Backtest sieht sie nie und unterstellt damit implizit, dass jede Strategie die Pleite­ kandidaten gemieden hätte.

Der Effekt: typischerweise 2 bis 4 Prozent zu hohe Jahres­performance. Bei Long-only-Equity-Strategien kann der Effekt noch größer sein, bei Long-Short kleiner.

Korrektur: nutzen Sie Datenquellen mit historischer Index-Mitgliedschaft. Kommerziell: Norgate, CRSP, Bloomberg PIT. Open-Source ist die Lage düster — Yahoo Finance liefert keine Delisting-Daten. Für Aktien-Universen ohne Norgate-Budget mische ich pragmatisch: ich nutze einen festen, breiten Universum-Snapshot (z. B. Russell 3000 vor 10 Jahren) plus manuelle Liste aller Delistings im Test-Zeitraum.

Bias 2: Look-Ahead.

Sie verwenden in Ihrer Backtest-Entscheidung am Tag t Informationen, die zum Zeitpunkt t real noch nicht verfügbar waren. Klassische Fallen:

Korrektur: T+1-Regel als Standard — jede Information, die zum Tagesende t publiziert wird, wird frühestens am nächsten Handelstag genutzt. Für Earnings: explizite Announcement-Time (vor oder nach Börsenschluss?) berücksichtigen. Für Fundamentaldaten: Point-in-Time-Datenbanken, die den damaligen Stand abbilden, nicht den heutigen.

Bias 3: Selection.

Selection-Bias ist subtiler als Survivorship. Sie wählen ein Universum, das schon gut performt hat — z. B. „die 100 größten Tech-Aktien" als Backtest-Set. Das Universum selbst ist das Ergebnis einer historischen Selektion, die Sie zum damaligen Zeitpunkt nicht hätten machen können.

Korrektur: Point-in-Time-Universen. Wenn Sie heute eine „Top-100-Tech"-Strategie testen, dann muss „Top 100 Tech" zu jedem historischen Datum mit den damaligen Marktcaps neu bestimmt werden — nicht mit den heutigen. Das schließt Firmen ein, die damals groß waren und heute klein sind (oder weg).

Bias 4: Data-Snooping.

Sie testen 1000 Strategie-Varianten auf demselben Datensatz und behalten die beste. Mit Wahrscheinlichkeit nahe 1 ist die „Beste" reines Glück — selbst wenn keine einzelne Strategie echten Edge hätte. Lopez de Prado nennt das „Backtest Overfitting", und es ist der häufigste Grund, warum Strategien live versagen.

Korrektur: drei Schichten.

Konkrete Checkliste, die ich vor jedem Live-Gang abhake.

[ ] Universum enthält historische Delistings / Bankruptcies
[ ] Index-Mitgliedschaft zum jeweiligen Datum, nicht heutige
[ ] Fundamentaldaten mit Announcement-Date, nicht Quartalsende
[ ] Preisdaten mit Split-/Dividenden-PIT-Adjustierung
[ ] Order-Execution mit realistischer T+0-Latenz
[ ] Slippage- und Kommissions-Modell explizit
[ ] OOS-Daten beim Design nicht angefasst
[ ] Walk-Forward über mindestens 5 Fenster
[ ] WFE > 0.5 in der Mehrzahl der Fenster
[ ] Sharpe um Hypothesen-Anzahl deflationiert
[ ] Parameter-Stabilität dokumentiert
[ ] Sensitivitätsanalyse (±20 % auf jeden Parameter)

Wenn auch nur ein Punkt nicht erfüllt ist, geht die Strategie nicht live. Punkt.

Code-Sketch: Look-Ahead-Check.

# Einfacher Look-Ahead-Detector: Permutations-Test
import numpy as np

def lookahead_check(signals, returns, n_perms=1000):
    """
    Permutiert die Signale zeitlich (Shuffle) — sollten Signal und Returns
    unabhängig sein, ist das Original-Sharpe nicht signifikant höher.
    Verdacht: das ist meist nicht der Fall, weil Returns autokorreliert sind.
    Echter Test: Signale um 1 Tag in die Zukunft schieben.
    """
    real_sr = np.mean(signals * returns) / np.std(signals * returns)
    shifted = signals.shift(-1).dropna()
    fwd_sr  = np.mean(shifted * returns.loc[shifted.index]) / np.std(shifted * returns.loc[shifted.index])
    if fwd_sr > real_sr * 1.2:
        print(f"WARN: Sharpe steigt bei Look-Ahead um {(fwd_sr/real_sr-1)*100:.1f}%")
        print("Vermutung: Signale enthalten bereits zukünftige Information.")
    return real_sr, fwd_sr

Wenn Sie das Signal um einen Tag in die Zukunft schieben und die Performance steigt deutlich, ist das Signal vermutlich nicht das Problem — die Look-Ahead-Komponente steckt im Feature-Engineering.

Meine Praxis.

Ich dokumentiere für jede Strategie, die ich für Mandanten umsetze, alle vier Bias-Quellen explizit: wie wurde Survivorship behandelt, welche Look-Ahead-Risiken bestehen, wie wurde das Universum zeitlich konsistent gehalten, wie viele Hypothesen wurden getestet. Das ist Aufwand, aber es ist der einzige Weg, sich nach einem schlechten Live-Quartal nicht selbst zu belügen.

Das Schöne: wenn die Bias-Korrekturen sauber sind und die Strategie trotzdem profitable Walk-Forward- Ergebnisse liefert, dann haben Sie sehr wahrscheinlich echten Edge. Das ist selten. Aber wenn es passiert, ist es belastbar.

Sie wollen einen Backtest, der bei einem ernsthaften Audit nicht zerfällt? Erstgespräch buchen — wir gehen die Checkliste gemeinsam durch.