← Alle Insights

Cointegration und Pairs-Strategien: stationäre Spreads finden.

Pairs-Trading ist die älteste statistische Arbitrage-Strategie — und sie funktioniert bis heute, wenn man sie sauber aufsetzt. Der Kern: zwei Assets, deren Preise individuell driften, deren Spread aber stationär bleibt. Wer das richtig testet, handelt Mean Reversion mit harter Statistik im Rücken.

Korrelation ist nicht Cointegration.

Der häufigste Anfängerfehler: Pairs werden über Korrelation ausgewählt. Zwei Aktien mit Korrelation 0,95 sehen verlockend aus — sind aber meist nicht handelbar. Korrelation misst nur, ob sich Renditen kurzfristig im Gleichschritt bewegen. Sie sagt nichts darüber, ob der Preisabstand langfristig stabil bleibt.

Cointegration ist das stärkere Konzept: zwei Zeitreihen sind cointegriert, wenn beide individuell nicht-stationär sind (random-walk-artig driften), eine Linearkombination der beiden aber stationär ist. Genau das brauchen Sie für Mean Reversion — einen Spread, der zuverlässig zu seinem Mittelwert zurückkehrt.

Klassisches Beispiel: zwei Versorger derselben Region, zwei Mineralöl-Majors, zwei Eisenbahn-Operatoren in den USA. Ihre Preise bewegen sich, weil sie demselben Risikofaktor ausgesetzt sind. Der relative Preis schwankt — und kehrt zurück, weil ökonomische Substitution ihn nicht zu weit auseinanderlaufen lässt.

Der Engle-Granger-Test in der Praxis.

Der einfachste Test auf Cointegration ist zweistufig: Erst eine OLS-Regression zwischen den beiden Preisreihen, dann ein Augmented-Dickey-Fuller-Test (ADF) auf die Residuen. Ist das Residuum stationär (p < 0,05), liegt Cointegration vor.

import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller, coint

def test_cointegration(y, x):
    """Engle-Granger-Test: gibt p-Wert und Hedge-Ratio zurück."""
    # Schritt 1: OLS-Regression y = alpha + beta * x + eps
    X = sm.add_constant(x)
    model = sm.OLS(y, X).fit()
    hedge_ratio = model.params[1]
    residuals = model.resid

    # Schritt 2: ADF-Test auf Residuen
    adf_stat, p_value, *_ = adfuller(residuals, maxlag=1, autolag=None)

    # Alternativ: direkter coint-Test aus statsmodels
    _, p_coint, _ = coint(y, x)

    return {
        'hedge_ratio': hedge_ratio,
        'p_adf_residuals': p_value,
        'p_coint': p_coint,
        'is_cointegrated': p_value < 0.05
    }

Wichtig: Das Vorzeichen der Regression spielt eine Rolle. Wer y und x vertauscht, bekommt einen anderen Hedge-Ratio. In der Praxis testen wir beide Richtungen und wählen das Pair mit dem niedrigeren p-Wert.

Spread-Konstruktion und Z-Score.

Ist Cointegration nachgewiesen, konstruieren Sie den Spread:

Spread = y - hedge_ratio · x

Dieser Spread ist Ihre Handelseinheit. Sie short ihn, wenn er weit über dem Mittel liegt, und long ihn, wenn er weit darunter liegt. Die übliche Normierung ist der Z-Score:

def build_signals(y, x, hedge_ratio, lookback=60, entry_z=2.0, exit_z=0.5):
    spread = y - hedge_ratio * x
    mu = spread.rolling(lookback).mean()
    sigma = spread.rolling(lookback).std()
    z = (spread - mu) / sigma

    pos = pd.Series(0, index=y.index)
    pos[z > entry_z] = -1   # Spread short
    pos[z < -entry_z] = 1   # Spread long
    pos[(z.abs() < exit_z)] = 0
    # Forward-fill: Position halten bis Exit-Trigger
    pos = pos.replace(0, np.nan).ffill().fillna(0)
    # Exit erzwingen
    pos[z.abs() < exit_z] = 0
    return pos, z

Die Wahl von entry_z = 2 und exit_z = 0,5 ist Konvention — entspricht etwa 2 Standardabweichungen Entry und Rückkehr auf 0,5. Aggressivere Setups entern bei 1,5, defensivere bei 2,5.

Half-Life: wie schnell kehrt der Spread zurück?

Ein stationärer Spread ist nur dann handelbar, wenn er auch in vertretbarer Zeit zum Mittelwert zurückkehrt. Die Halbwertszeit (Half-Life) der Mean Reversion sagt Ihnen, wie viele Tage es im Schnitt dauert, bis sich eine Abweichung halbiert. Geschätzt wird sie über eine AR(1)-Regression auf die Spread-Differenzen:

Δspread_t = κ · (μ − spread_{t-1}) + ε_thalf_life = ln(2) / κ

Faustregel: Half-Lives unter 5 Tagen sind oft Mikrostruktur-Rauschen, Half-Lives über 60 Tagen sind selten profitabel nach Kosten. Sweet-Spot liegt zwischen 10 und 30 Handelstagen. Wir filtern Pairs hart auf diesen Bereich, bevor sie in den Live- Universum-Pool gehen.

Universum-Screening: Pairs systematisch finden.

Bei N Assets gibt es N·(N−1)/2 mögliche Paare. Bei einem S&P-500-Universum sind das knapp 125.000 Paare. Naives Durchtesten produziert garantiert falsche Treffer — bei 5 % Signifikanzniveau erwarten Sie 6.250 statistisch signifikante Pairs allein durch Zufall.

Drei Filter, die wir vorab einsetzen:

Nach diesen Filtern bleiben aus 500 Aktien typischerweise 20–80 plausible Pairs übrig, von denen 5–15 stabile Half-Lives haben.

Risiken in der Praxis.

Pairs-Trading ist nicht risikolos — der Spread kann brechen. Drei Hauptszenarien:

Robuste Setups arbeiten mit Stop-Loss bei extremen Z-Scores (z. B. |z| > 4), mit Re-Estimation des Hedge-Ratios in rollendem Fenster und mit einem Portfolio von 10–20 unkorrelierten Pairs statt einem einzigen.

Was Sie vom Backtest zur Live-Strategie mitnehmen sollten.

Pairs-Trading sieht im Backtest fast immer gut aus — und enttäuscht oft live. Die Gründe sind selten exotisch:

  1. Der Hedge-Ratio aus dem In-Sample-Fenster passt im Out-of-Sample nicht mehr. Lösung: rollende Re-Estimation alle 20–40 Tage.
  2. Transaktionskosten und Spreads sind unterschätzt. Bei Half-Lives von 15 Tagen und 200 % Bruttoumsatz pro Trade fressen 5 bps schon spürbar Performance.
  3. Short-Borrow ist nicht kostenlos. In illiquiden Namen kostet das Leihen jährlich 1–5 % — und kann jederzeit zurückgerufen werden.
  4. Survivorship-Bias: Wer im Universum „heute existierender Aktien" testet, übersieht die übernommenen, delistierten oder fusionierten Pairs der Vergangenheit.

Wer diese Punkte adressiert, bekommt eine Strategie, die im historischen Mittel Sharpe-Ratios zwischen 0,8 und 1,5 erreicht — solide, nicht spektakulär, und mit niedriger Marktkorrelation. Genau das, wofür man Statistical Arbitrage einsetzt.

Sie wollen ein Pairs-Trading-Setup aufbauen oder ein bestehendes Modell überprüfen? Erstgespräch buchen — wir bauen das Screening, die Tests und die Live-Engine.