Kalman Filter im Trading: dynamische Hedge-Ratios und Pair-Trading-Signale.
Der Kalman-Filter ist eines der mächtigsten Werkzeuge, die Sie in Ihrem Quant-Werkzeugkasten haben sollten — und gleichzeitig eines der missverstandensten. Ursprünglich aus der Raumfahrt (Apollo-Navigation), liefert er heute die Grundlage für jedes seriöse Pair-Trading-Setup, für die Schätzung dynamischer Beta-Werte und für die Glättung verrauschter Signale. Wer statt rollender OLS-Regression einen Kalman-Filter einsetzt, gewinnt fast immer.
Kalman in einer Minute.
Der Kalman-Filter ist ein rekursiver Bayesianischer Schätzer für lineare dynamische Systeme. Er kombiniert zwei Informationsquellen: ein Modell, wie sich der Zustand der Welt entwickelt (State-Equation), und Messungen, die diesen Zustand verrauscht beobachten (Measurement-Equation). Aus beiden produziert er die optimale Schätzung im Sinne minimaler Fehlervarianz.
Formell:
- State-Equation: xt = F · xt-1 + wt, mit wt ~ N(0, Q)
- Measurement-Equation: zt = H · xt + vt, mit vt ~ N(0, R)
xt ist der latente Zustand (z. B. die wahre Hedge-Ratio zwischen zwei Assets), zt die Beobachtung (z. B. der Preis-Quotient). Q und R sind die Kovarianzmatrizen des Prozess- bzw. Messrauschens — die entscheidenden Tuning-Parameter.
Jeder Schritt besteht aus zwei Phasen: Predict (Zustand mittels State-Equation fortschreiben) und Update (mit neuer Beobachtung korrigieren). Der Korrektur-Anteil wird über den Kalman-Gain bestimmt: hohes R (verrauschte Messung) → geringe Korrektur, niedriges R → starke Korrektur.
Anwendung 1: Dynamische Hedge-Ratio im Pair-Trading.
Klassisches Pair-Trading nimmt zwei kointegrierte Assets — sagen wir ETH und BTC — und schätzt per OLS-Regression eine Hedge-Ratio β: ETHt = α + β · BTCt + εt. Der Spread εt sollte mean-reverting sein. Wenn ε zu weit nach oben ausschlägt: ETH verkaufen, BTC kaufen.
Das Problem: β ist nicht konstant. Im ETH/BTC-Pair schwankt es zwischen 0.04 (Bear-Phasen) und 0.08+ (ETH-Rallyes). Ein OLS-Fit auf einem festen 90-Tage-Fenster ist immer entweder zu langsam (verpasst Regime-Shifts) oder zu reaktiv (rauscht).
Mit Kalman modellieren wir β selbst als zeitvariablen Zustand: βt = βt-1 + wt (Random Walk). Die Messung ist der beobachtete Preis-Quotient. Der Filter passt β nahtlos an — schnell genug, um Regime-Shifts mitzunehmen, glatt genug, um nicht jedem Tick zu folgen.
from pykalman import KalmanFilter
import numpy as np
# y = ETH, x = BTC
obs_mat = np.vstack([btc_prices, np.ones(len(btc_prices))]).T[:, np.newaxis]
kf = KalmanFilter(
n_dim_obs=1, n_dim_state=2,
initial_state_mean=[0, 0],
initial_state_covariance=np.ones((2, 2)),
transition_matrices=np.eye(2),
observation_matrices=obs_mat,
observation_covariance=1.0,
transition_covariance=1e-4 * np.eye(2) # entscheidender Parameter
)
state_means, state_covs = kf.filter(eth_prices.values)
hedge_ratio = state_means[:, 0]
intercept = state_means[:, 1]
spread = eth_prices - (hedge_ratio * btc_prices + intercept)
Der entscheidende Parameter ist transition_covariance: er kontrolliert, wie
schnell sich β über die Zeit verändern darf. Zu klein → β bleibt fast konstant
(verhält sich wie OLS auf langem Fenster). Zu groß → β rauscht mit dem Preis. In meiner
Praxis liegen sinnvolle Werte für Krypto-Pairs zwischen 1e-5 und 1e-3.
Anwendung 2: Spread-Signal-Glättung.
Selbst wenn die Hedge-Ratio fix ist, möchten Sie oft das Trading-Signal selbst glätten. Ein verrauschter Spread führt zu Whipsaws — Sie öffnen Positionen auf Ausreißer, die fünf Minuten später revertieren, und tragen nur die Kosten.
Ein Local-Level-Kalman auf dem Spread liefert eine geglättete Version, die schneller reagiert als jeder Moving Average gleicher Glätte. Das liegt daran, dass der Filter implizit zwischen Trend und Rauschen unterscheidet: wenn die Variation systematisch ist, geht sie ins Signal; wenn sie unsystematisch ist, wird sie weggefiltert.
Praktisch: ein 20-Tage-EMA des Spreads erzeugt zwölf Trades pro Quartal. Derselbe Spread durch einen Local-Level-Kalman geschickt erzeugt sechs Trades pro Quartal — mit höherer Hit-Rate. Die Hälfte der Whipsaws verschwindet.
Anwendung 3: Latente Faktoren in Multi-Asset-Modellen.
Komplexer und mächtiger: Kalman als State-Space-Schätzer für latente Faktoren. Sie haben ein Universum aus 20 Assets, vermuten dahinter 2–3 nicht-beobachtbare Treiber (Wachstum, Risk-On/Off, Sektor-Rotation) und wollen diese Faktoren plus Asset-Loadings simultan schätzen.
Das ist ein klassisches Dynamic Factor Model — und genau dafür gibt es das Kalman-Framework.
Die State-Equation beschreibt die Evolution der Faktoren (typischerweise AR(1)), die
Measurement-Equation verbindet Faktoren mit beobachteten Returns über Loadings. In
statsmodels.tsa.statespace lässt sich das mit überschaubarem Code aufsetzen.
In der Praxis nutze ich solche Modelle, um Faktor-Exposure von Strategien zu monitoren — nicht primär für die Strategie-Konstruktion selbst. Die latenten Faktoren tendieren dazu, in ihrer Interpretation zu „driften", was Trading-Signale unzuverlässig macht. Aber als Risk-Lens sind sie hervorragend.
Extended und Unscented Kalman: wenn linear nicht reicht.
Der klassische Kalman setzt lineare Dynamik und Gaussian Noise voraus. Beides bricht im Trading regelmäßig: Volatilitäten sind nicht-linear, Returns sind nicht normalverteilt (fat tails).
Der Extended Kalman Filter (EKF) linearisiert nicht-lineare Funktionen lokal via Jacobian. Funktioniert für moderate Nichtlinearität, kann bei starker Nichtlinearität divergieren.
Der Unscented Kalman Filter (UKF) umgeht die Linearisierung, indem er ausgewählte Sigma-Points durch die nichtlineare Funktion propagiert und daraus Mittelwert und Kovarianz schätzt. Robuster als EKF, ohne Ableitungen zu brauchen.
Meine Empfehlung: für Trading-Anwendungen bleibt der klassische Kalman in 90 % der Fälle ausreichend. EKF/UKF lohnt nur, wenn Sie explizit nichtlineare Modelle modellieren (z. B. Stochastic Volatility mit log-Vola-Zustand). Für reine Hedge-Ratio-Schätzung: linear.
Vergleich: Kalman vs. rolling OLS.
Warum nicht einfach ein 60-Tage-rolling-OLS? Drei Gründe:
- Adaptionsgeschwindigkeit: Kalman passt sich kontinuierlich an, OLS „springt", wenn ein Datenpunkt aus dem Fenster fällt. Bei Strukturbrüchen ist Kalman 5–15 Tage schneller.
- Weniger Rauschen: Kalman gewichtet implizit ältere Beobachtungen, OLS gibt allen Punkten im Fenster gleiches Gewicht. Resultat: Kalman-β ist glatter bei vergleichbarer Reaktivität.
- Unsicherheits-Schätzung: Kalman liefert direkt eine Kovarianz für jeden geschätzten Parameter. OLS liefert Standardfehler aus dem Fenster — die in Trading-Anwendungen meist ignoriert werden.
Empirisch (ETH/BTC-Pair, 5 Jahre Daten): Kalman-basiertes Pair-Trading hat in meinen Backtests einen Sharpe-Vorteil von 0.15–0.25 gegenüber rolling-OLS-Varianten, bei vergleichbaren Drawdowns. Das ist nicht spektakulär — aber es ist konsistent, und es kostet keinen zusätzlichen Compute.
Caveats und Praxis.
Kalman ist kein Allheilmittel. Drei häufige Fehler:
- Falsche Wahl von Q: zu hoch → β rauscht mit dem Markt. Zu niedrig → β bleibt starr. Kalibrieren Sie auf historischen Daten, aber prüfen Sie out-of-sample. Faustregel: Q so wählen, dass β über 6 Monate substanziell, aber nicht dramatisch variiert.
- Annahme stabiler Kointegration: Wenn das Pair gar nicht (mehr) kointegriert ist, hilft auch der beste Filter nicht. Kalman macht nichtstationäre Spreads nicht stationär.
- Look-Ahead beim Backtest: nur die gefilterte Schätzung benutzen, nie die geglättete (smoother). Letztere kennt die Zukunft.
In meiner Praxis: jeder Pair-Trading-Setup, den ich für Mandanten baue, läuft mit Kalman-Hedge-Ratio. Rolling-OLS sehe ich nur noch in Legacy-Systemen. Der Aufwand für den Wechsel ist überschaubar — der Performance-Gewinn nicht spektakulär, aber spürbar. Vor allem reduziert Kalman die Anfälligkeit gegenüber Strukturbrüchen, was im Live-Betrieb wichtiger ist als jeder Basispunkt Backtest-Sharpe.
Pair-Trading oder dynamisches Hedging mit Kalman im Setup? Erstgespräch buchen — wir bauen es passend zu Ihren Märkten.