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}) + ε_t → half_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:
- Sektor-Filter: Nur Pairs innerhalb desselben GICS-Subsektors. Ökonomische Begründung muss da sein.
- Liquiditäts-Filter: Tägliches Median-Volumen > 10 Mio. USD. Keine Microcaps.
- Bonferroni-Korrektur: Signifikanzniveau auf 0,05 / Anzahl Tests anpassen. Bei 1.000 getesteten Pairs wird das Niveau zu 5 · 10⁻⁵.
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:
- Strukturbruch: M&A-Aktivität, Spin-off, neuer CEO mit anderer Strategie. Die ökonomische Beziehung zerfällt.
- Regime-Wechsel: COVID-März-2020, Energie-Schock 2022. Korrelationsstrukturen brechen kollektiv zusammen.
- Crowding: Wenn alle dieselben Pairs handeln, wird der Spread vorzeitig geschlossen und entwickelt eine andere Verteilung.
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:
- Der Hedge-Ratio aus dem In-Sample-Fenster passt im Out-of-Sample nicht mehr. Lösung: rollende Re-Estimation alle 20–40 Tage.
- Transaktionskosten und Spreads sind unterschätzt. Bei Half-Lives von 15 Tagen und 200 % Bruttoumsatz pro Trade fressen 5 bps schon spürbar Performance.
- Short-Borrow ist nicht kostenlos. In illiquiden Namen kostet das Leihen jährlich 1–5 % — und kann jederzeit zurückgerufen werden.
- 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.