← Alle Insights

Deflated Sharpe Ratio: die ehrliche Korrektur für Backtest-Overfitting.

Eine nackte Sharpe Ratio sagt nichts über Overfitting. Sie ignoriert nicht-normale Returns, sie ignoriert die Anzahl getesteter Varianten — und genau diese beiden Dinge bestimmen, ob die Zahl real ist. Die Deflated Sharpe Ratio nach Bailey/Lopez de Prado liefert die Korrektur. Bei mir gibt es seitdem nur noch DSR plus PBO im Report.

„Wir haben einen Sharpe von 2,3 erreicht.“ Standardsatz aus Strategie-Pitches. Frage zurück: aus wie vielen getesteten Varianten ist diese eine entstanden? Antwort meist: 300. Effektive Information dahinter: gering. Die Deflated Sharpe Ratio (DSR) macht diese versteckte Inflation explizit messbar.

Was die klassische Sharpe Ratio ignoriert.

Sharpe = Mittelwert / Standardabweichung, annualisiert. Drei stille Annahmen, die in der Realität alle verletzt sind:

Die DSR adressiert die ersten beiden Punkte direkt. Den dritten implizit über den Sample-Length-Term.

Die DSR-Formel.

Bailey und Lopez de Prado (2014) definieren:

DSR = Φ( (SR - SR₀) · √(T - 1) /
         √(1 - γ₃·SR + (γ₄ - 1)/4 · SR²) )

mit
SR   = beobachteter Sharpe (annualisiert)
SR₀  = Erwartungswert des Maximum-Sharpe unter Null-Hypothese
T    = Anzahl der Beobachtungen (Returns)
γ₃   = Skewness der Returns
γ₄   = Kurtosis der Returns (nicht "exzess")
Φ    = Standardnormal-CDF

SR₀ = √V[SR] · ((1 - γ) · Φ⁻¹(1 - 1/N)
              + γ · Φ⁻¹(1 - 1/(N·e)) )

mit
N    = Anzahl getesteter Strategien
γ    = Euler-Mascheroni-Konstante ≈ 0,5772
V[SR]= Varianz der Sharpes über alle getesteten Strategien

Drei Effekte sind eingebaut: negative Skewness erhöht den Korrekturterm, hohe Kurtosis ebenso, und je mehr Strategien getestet wurden, desto höher liegt SR₀ — der Hürdenwert, den der echte Sharpe schlagen muss.

Interpretation: DSR ist eine Wahrscheinlichkeit zwischen 0 und 1. DSR > 0,95 bedeutet: mit 95 % Wahrscheinlichkeit ist die echte Sharpe Ratio größer als Null, gegeben alle Korrekturen.

Python-Implementation.

# Deflated Sharpe Ratio
import numpy as np
from scipy.stats import norm, skew, kurtosis

EULER = 0.5772156649

def expected_max_sharpe(n_trials, sharpe_variance):
    # SR₀: erwarteter Max-Sharpe unter H₀
    return np.sqrt(sharpe_variance) * (
        (1 - EULER) * norm.ppf(1 - 1.0 / n_trials)
        + EULER * norm.ppf(1 - 1.0 / (n_trials * np.e))
    )

def deflated_sharpe(returns, sharpe_observed, sharpe_variance,
                    n_trials, periods=252):
    T = len(returns)
    sr = sharpe_observed / np.sqrt(periods)       # auf Perioden-Basis
    g3 = skew(returns)
    g4 = kurtosis(returns, fisher=False)          # nicht-exzess
    sr0 = expected_max_sharpe(n_trials, sharpe_variance)

    numerator   = (sr - sr0) * np.sqrt(T - 1)
    denominator = np.sqrt(1 - g3*sr + (g4 - 1)/4 * sr**2)

    return norm.cdf(numerator / denominator)

# Aufruf
# returns:           tägliche Strategie-Returns (echt, nicht annualisiert)
# sharpe_observed:   annualisierter Sharpe der Sieger-Strategie
# sharpe_variance:   Varianz der Sharpes ALLER getesteten Strategien
# n_trials:          Anzahl getesteter Strategien
dsr = deflated_sharpe(returns, sharpe_observed=1.5,
                      sharpe_variance=0.25,
                      n_trials=100)
print(f"DSR: {dsr:.4f}")

Konkretes Rechenbeispiel.

Eine Strategie mit Daily-Sharpe-Equivalent. Beispielzahlen aus einem realen Projekt:

Eingesetzt:

SR (daily)    = 1,50 / √252        = 0,0945
SR₀ (daily)   ≈ 0,094              # expected max
Numerator     = (0,0945 - 0,094) · √1259 ≈ 0,18
Denominator   = √(1 - (-0,8)·0,0945 + (7,2-1)/4 · 0,0945²) ≈ 1,04
Z             = 0,18 / 1,04        = 0,17
DSR           = Φ(0,17)            ≈ 0,57

Der nackte Sharpe von 1,50 wirkt stark — die DSR von 0,57 zeigt: gegeben 100 getestete Varianten, Skewness und Kurtosis ist die Wahrscheinlichkeit, dass die echte Sharpe positiv ist, nur etwa 57 %. Das ist Münzwurf-Niveau.

Probability of Backtest Overfitting (PBO).

Ergänzend zur DSR liefert Bailey/Lopez de Prado die PBO — die Wahrscheinlichkeit, dass die im Backtest beste Strategie out-of-sample unter dem Median liegt. Vorgehen:

  1. Teilen Sie die Daten zufällig in zwei Hälften (oft mit Combinatorial Splitting).
  2. Identifizieren Sie auf Hälfte A die beste Strategie nach Sharpe.
  3. Schauen Sie, wie diese Strategie auf Hälfte B rankt (relativ zu allen anderen).
  4. Wiederholen Sie viele Splits.
  5. PBO = Anteil der Splits, in denen die A-Beste auf B unter dem Median ist.

PBO > 0,5 = die Strategie-Selektion ist überangepasst, der Auswahlprozess produziert systematisch Verlierer in Sample B. PBO < 0,2 = robuste Selektion.

Caveats.

Was ich nicht mehr durchgehen lasse.

Backtest-Reports ohne DSR und PBO landen bei mir im Stapel „nochmal mit Korrektur“. Konkret heißt das in meiner Praxis:

Warum das die einzig ehrliche Größe ist.

Ich habe Mandanten erlebt, die Strategien mit nackten Sharpes von 2,5 bauten und nach 6 Monaten Live auf Sharpe 0,4 herunter waren. Wenn man die DSR retroaktiv berechnete, lag sie bei 0,33. Das hätte gewarnt — die Strategie war ein Selection-Bias-Produkt. Sie hatte keine ökonomische Edge, nur einen extremen In-Sample-Glücksfall unter sehr vielen Versuchen.

Die DSR ist sperrig. Sie braucht Datenpflege während des Strategie-Designs, sie fordert Disziplin beim Logging. Aber sie ist die einzige Single-Number-Metrik, die ich verteidigen kann, wenn ein Mandant mich fragt: „Ist diese Strategie real?“ Sharpe allein kann ich nicht verteidigen. DSR plus PBO schon.

Sie wollen Ihre Backtest-Reports auf DSR und PBO umstellen? Erstgespräch buchen — wir bauen das Reporting gemeinsam um.