← Alle Insights

Triple-Barrier-Methode: Label-Engineering für ML-Strategien.

Bevor ein ML-Modell auch nur einen Trade vorhersagen kann, müssen Sie ihm sagen, was ein „guter" Trade überhaupt ist. Die naive Antwort — „Return nach N Tagen" — ist die häufigste Ursache, warum ML-Strategien live versagen. Die Triple-Barrier-Methode ist die ehrlichere Alternative.

Wenn jemand mir eine ML-Trading-Strategie zeigt, schaue ich zuerst auf das Labeling. Nicht auf das Modell, nicht auf die Features — auf die Labels. Denn was das Modell als „1" oder „0" lernt, bestimmt, was es später handelt. Und in 80 Prozent der Fälle ist genau hier der Fehler.

Warum klassische Labels nicht funktionieren.

Die Standard-Methode: nehmen Sie den Return nach N Perioden, kodieren Sie positiv als 1 und negativ als 0. Klingt einfach, ist aber aus Trading-Sicht naiv. Drei Probleme:

Die Idee von Lopez de Prado.

Marcos Lopez de Prado hat in Advances in Financial Machine Learning (2018) eine Lösung popularisiert, die so naheliegend ist, dass man sich fragt, warum nicht alle so labeln: die Triple-Barrier-Methode. Statt eines starren Zeitfensters definieren Sie drei Barrieren, die der Preis erreichen kann:

Welche Barriere zuerst getroffen wird, bestimmt das Label:

Upper zuerst   →  +1   (Profit-Target erreicht)
Lower zuerst   →  -1   (Stop ausgelöst)
Vertical zuerst → 0   (Zeit abgelaufen, kein Signal)

Dieses Labeling spiegelt direkt wider, was ein echter Trader erleben würde. Das Modell lernt nicht mehr „nach 10 Tagen positiv ja/nein", sondern „lohnt sich ein Trade, der mit definiertem Risiko und Profit-Target eingegangen wird".

Asymmetrische Barrieren via Volatilität.

Fixe Barrieren (+2 Prozent, -1 Prozent) ignorieren, dass Volatilität sich ständig ändert. In einem ruhigen Markt ist +2 Prozent ein Jahres-Move, in einem hektischen ein Tages-Move. Die Lösung: volatilitäts­skaliert.

Ich schätze die Tages-Volatilität σt mit einem rollenden 20-Tage-EWMA der Returns und setze die Barrieren als Vielfache davon:

upper_barrier(t) = price(t) × (1 + k_upper × σ_t × √N)
lower_barrier(t) = price(t) × (1 - k_lower × σ_t × √N)

mit k_upper = 2.0  (Profit-Multiplikator)
    k_lower = 1.0  (Stop-Multiplikator)
    N       = max. Haltedauer in Tagen

k_upper / k_lower = 2 bedeutet: ich riskiere 1 σ für 2 σ Profit — ein Reward-to-Risk-Verhältnis, das viele Strategien live nicht halten. Aber genau das soll das Modell lernen: welche Setups dieses Verhältnis tatsächlich erreichen.

Implementation in Python.

Es gibt fertige Bibliotheken (mlfinlab), aber die Logik selbst zu implementieren ist nicht viel Code und macht klar, was passiert:

# Triple-Barrier-Labeling, vereinfacht
import numpy as np
import pandas as pd

def triple_barrier_labels(prices, events, sigma,
                          k_upper=2.0, k_lower=1.0, max_hold=10):
    labels = pd.Series(index=events.index, dtype=int)
    for t0 in events.index:
        p0 = prices.loc[t0]
        upper = p0 * (1 + k_upper * sigma.loc[t0])
        lower = p0 * (1 - k_lower * sigma.loc[t0])
        window = prices.loc[t0:].iloc[1:max_hold + 1]

        hit_upper = window[window >= upper].index.min()
        hit_lower = window[window <= lower].index.min()

        if pd.notna(hit_upper) and (pd.isna(hit_lower) or hit_upper < hit_lower):
            labels.loc[t0] = 1
        elif pd.notna(hit_lower) and (pd.isna(hit_upper) or hit_lower < hit_upper):
            labels.loc[t0] = -1
        else:
            labels.loc[t0] = 0
    return labels

events ist die Liste der potenziellen Einstiegszeitpunkte (z. B. CUSUM-Filter-Trigger oder einfach jeder Tag). sigma ist die rollende Volatilität. Der Rest ist Buchhaltung: welche Barriere zuerst?

Anwendung: Mean-Reversion mit RandomForest.

Ein typisches Setup, das ich für Mandanten gebaut habe: Mean-Reversion-Signale auf 5-Minuten-Bars, klassifiziert von einem RandomForest, der entscheidet, welche Signale tradeable sind.

  1. Event-Filter: CUSUM auf 1-σ-Bewegungen → ~3000 Events pro Jahr
  2. Features: RSI(14), Distanz zu Bollinger-Bands, Volumen-Z-Score, Tageszeit, Volatilitäts-Regime
  3. Triple-Barrier-Labels: k_upper = 1.5, k_lower = 1.0, max_hold = 30 Bars (~2.5 h)
  4. Modell: RandomForest, Klassifikation +1 / 0 / -1
  5. Trading-Regel: gehe long bei Predict +1, short bei Predict -1, kein Trade bei 0

Was bemerkenswert ist: das Modell lernt mit Triple-Barrier-Labels deutlich konservativer. Es predict-et in 60 Prozent der Fälle „0" (kein Trade) — was richtig ist, denn die meisten CUSUM-Events sind kein echtes Setup. Mit naivem Return-Labeling würde das Modell auf jedes Event eine Vorhersage erzwingen.

Caveat: Path-Dependent Look-Ahead-Risiko.

Triple-Barrier-Labels sind path-dependent: sie hängen vom gesamten zukünftigen Preispfad innerhalb des Fensters ab, nicht nur vom Endpunkt. Das öffnet eine subtile Falle: wenn Sie das Modell auf Features evaluieren, die auch Information aus der Zukunft enthalten (rolling means, die t+1 einschließen, EWMA-Updates ohne Lag), leakt Information ins Training.

Außerdem überlappen die Label-Fenster: das Label für t und t+1 teilen sich 9 von 10 Tagen Pfad. Das verletzt die i.i.d.-Annahme der meisten ML-Modelle. Lopez de Prado schlägt deshalb Purged K-Fold Cross-Validation vor — Trainings-Folds werden aktiv um die Test-Labels herum „gereinigt", damit kein Pfad in beiden Folds steckt.

Meine Praxis.

Ich nutze Triple-Barrier-Labels für jedes ML-Trading-Setup, ohne Ausnahme. Der Aufwand ist gering (50 Zeilen Code), der Gewinn an Modell-Qualität enorm: das Modell lernt eine handelbare Realität, keine akademische Return-Klassifikation.

Was ich Mandanten regelmäßig sage: wenn Sie ein ML-Modell mit naiven Return-Labels trainiert haben und es live verliert — das Modell ist nicht das Problem, die Labels sind es. Triple-Barrier ist kein Allheilmittel, aber es eliminiert eine der häufigsten Fehlerquellen im ML-Trading komplett.

Sie wollen ML-Signale aufsetzen, die nicht nur auf dem Papier funktionieren? Erstgespräch buchen — wir bauen das Labeling sauber von Anfang an.