← Alle Insights

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:

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:

  1. 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.
  2. Weniger Rauschen: Kalman gewichtet implizit ältere Beobachtungen, OLS gibt allen Punkten im Fenster gleiches Gewicht. Resultat: Kalman-β ist glatter bei vergleichbarer Reaktivität.
  3. 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:

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.