Hidden Markov Models in der Praxis: Regime-Detection ohne Overfitting.
Hidden Markov Models gelten als der elegante Weg, Marktregime zu identifizieren. In jedem zweiten Quant-Buch findet sich ein HMM-Kapitel, in jedem dritten Vortrag eine S&P-500-Grafik mit drei farbigen Regime-Bändern. Was selten dazugesagt wird: in der Live-Anwendung bringen HMMs oft kaum mehr als ein simpler Volatilitäts-Filter — und sie bergen Fallen, die einen sauber aussehenden Backtest zur Fiktion machen.
HMM-Mechanik in Kürze.
Ein HMM modelliert beobachtete Daten als Ausgabe einer ungeobachteten Zustands-Folge. Drei Komponenten:
- Transition-Matrix A: P(statet = j | statet-1 = i)
- Emission-Verteilung B: P(observationt | statet)
- Initial-Verteilung π: P(state0)
Drei klassische Probleme:
- Evaluation: gegeben Modell und Daten, wie wahrscheinlich ist die Beobachtungs-Sequenz? → Forward-Algorithm.
- Decoding: gegeben Modell und Daten, was war die wahrscheinlichste Zustands-Folge? → Viterbi-Algorithm.
- Learning: gegeben nur Daten, schätze A, B, π. → Baum-Welch (EM-Variante).
Für Trading-Anwendungen sind Forward-Backward (für State-Probabilities) und Viterbi (für harte State-Zuweisung) die operativen Algorithmen. Baum-Welch läuft im Training.
Gaussian vs. Discrete Emission HMM.
Zwei Hauptvarianten für Finanzanwendungen:
Gaussian HMM: jede Zustand emittiert Returns aus einer Normalverteilung mit zustands-spezifischem Mittelwert und Varianz. Klassische Wahl für Marktreturns. Schwäche: Returns sind nicht normalverteilt — fat tails werden unterschätzt, was zu instabilen State-Zuweisungen in Krisen führt.
Discrete HMM: Observations werden diskretisiert (z. B. Returns in Buckets), Emissions sind Multinomial. Robuster gegenüber Ausreißern, verliert aber Information. Funktioniert gut, wenn Sie ohnehin diskrete Features bauen (z. B. „Volatility-Tier 1–5").
Gaussian Mixture HMM: Kompromiss — jeder Zustand emittiert aus einer Mischung von Gaussians. Fängt fat tails besser ab, hat aber mehr Parameter und neigt stärker zu Overfitting.
Anzahl Zustände wählen: BIC und AIC.
Die zentrale Frage: wie viele States? Die ehrliche Antwort: meistens 2 oder 3. Mehr ist in Trading-Daten selten statistisch gerechtfertigt.
Formal: Information-Criteria. BIC = −2·log-likelihood + k·log(n), wobei k die Parameteranzahl und n die Beobachtungszahl ist. AIC = −2·log-likelihood + 2·k. BIC bestraft Komplexität stärker → tendiert zu wenigeren States, was in Trading meist die richtige Wahl ist.
from hmmlearn.hmm import GaussianHMM
import numpy as np
returns = sp500.pct_change().dropna().values.reshape(-1, 1)
scores = {}
for n in [2, 3, 4, 5]:
model = GaussianHMM(n_components=n, covariance_type="full",
n_iter=1000, random_state=42)
model.fit(returns)
n_params = n*n + 2*n - 1 # transitions + means + vars
bic = -2 * model.score(returns) + n_params * np.log(len(returns))
scores[n] = bic
print(scores) # niedrigster BIC = bestes Modell
In meinen Tests auf S&P-Daten gewinnt fast immer n=2 oder n=3. n=5 sieht in der Log-Likelihood besser aus, wird aber von BIC für die zusätzlichen Parameter abgestraft — zu Recht, denn out-of-sample sind die zusätzlichen States nicht stabil.
Look-Ahead-Bias: der häufigste HMM-Fehler.
Der mit Abstand kritischste Punkt. Ein HMM, das auf die gesamte Historie gefittet wird, kennt die Zukunft. Wenn Sie dann „rückblickend" feststellen, dass Regime 1 ein Bull-Markt war: ja, weil das Modell die ganze Sequenz gesehen hat und die States so allokiert hat, dass es passt.
Im echten Backtest müssen Sie das Modell rollend trainieren: bei jedem Trade-Zeitpunkt t nur Daten bis t verwenden. Das ist rechenintensiv, aber unverzichtbar. Zusätzlich: Online-Decoding mit Forward-Algorithm, nicht Viterbi auf der Gesamtsequenz — letzteres baut Konsistenz in Vergangenheits-States ein, die zur Live-Zeit noch nicht bekannt war.
Praktisch: trainieren Sie das HMM einmal pro Monat oder Quartal neu auf einem expandierenden oder rolling Fenster, und decodieren Sie online über Forward-Probabilities. Alles andere ist Selbstbetrug.
hmmlearn vs. eigene Implementation.
Für 95 % der Anwendungen reicht hmmlearn. Es ist gut getestet, hat einen
stabilen API, unterstützt Gaussian, GMM und Multinomial Emissions. Eigene Implementation
lohnt nur, wenn Sie nicht-standard Emissions brauchen (z. B. multivariate Student-t,
zustandsabhängige Autoregressive-Strukturen).
Für Multi-Asset-Setups schaue ich gelegentlich auf pomegranate, das auch
Bayesian HMM mit MCMC kann — interessant, wenn Sie posterior-Unsicherheit ernst nehmen
wollen. Für den produktiven Live-Einsatz aber: hmmlearn, einfach, gut gewartet.
Anwendung: Bull/Bear/Sideways auf S&P 500.
Klassische Anwendung: drei States auf täglichen S&P-Returns. Empirisch ergibt sich typischerweise:
- State A: μ ≈ +0.08 %, σ ≈ 0.6 % — Low-Vol-Bull.
- State B: μ ≈ +0.04 %, σ ≈ 1.1 % — normaler Markt.
- State C: μ ≈ −0.10 %, σ ≈ 2.5 % — High-Vol-Stress.
Auffällig: die States sind primär volatilitäts-getrieben, weniger direktional. Der „Bear-State" ist eigentlich ein High-Vola-State, der tendenziell mit fallenden Märkten korreliert. Das ist eine wichtige Erkenntnis: wer HMM-Output als „Bull-Signal" interpretiert, baut implizit einen Vola-Filter — und der geht einfacher.
Trading-Signal aus State-Probabilities.
Statt harter State-Zuweisung via Viterbi: nutzen Sie die posterior-Wahrscheinlichkeit jedes States. Ein typisches Setup:
- P(High-Vol-State) > 0.6 → Risk-Off: Allokation halbieren.
- P(High-Vol-State) > 0.8 → Cash.
- P(Low-Vol-Bull) > 0.7 → Voll-Allokation oder leichter Leverage.
Soft-Signale glätten Übergänge und reduzieren die Anzahl der Trigger-Flips. Im Live-Betrieb ist das wertvoller als jede zusätzliche State-Granularität.
Caveat: HMM-States sind oft volatilitäts-basiert.
Wenn Sie die State-Mittelwerte vs. State-Varianzen plotten, sehen Sie: die Unterscheidung zwischen States kommt primär aus σ, nicht aus μ. Das hat zwei Konsequenzen:
- Sie könnten denselben Filter mit einem simplen rolling-Volatilitäts-Quantil bauen — mit weniger Code, weniger Parametern, mehr Robustheit.
- HMM-Signale taugen besser für Risk-Management (Allokation hoch/runter) als für Direction (long/short).
HMM vs. einfache Vola-Filter: ein ehrlicher Vergleich.
Ich habe in mehreren Projekten denselben Equity-Curve-Smoothing-Effekt mit (a) HMM und (b) einem simplen Regime-Filter „60-Tage-Vol > 252-Tage-Median + 0.5σ" verglichen. Ergebnis: in 7 von 10 Fällen war der einfache Filter gleich gut oder besser. Out-of-Sample. Bei deutlich geringerer Komplexität.
Der einzige Bereich, in dem HMMs systematisch gewinnen: wenn Sie mehrdimensionale Beobachtungen einbinden (Returns + VIX + Credit-Spreads + Term-Structure-Slope). Hier kann ein HMM Joint-Dynamiken kapturen, die ein eindimensionaler Vola-Filter verpasst. Aber das setzt voraus, dass die zusätzlichen Dimensionen sauberes, nicht-redundantes Signal tragen — was seltener der Fall ist, als man hofft.
Meine Praxis.
HMM setze ich bei Mandanten nur ein, wenn (a) einfache Regime-Filter nachweislich nicht ausreichen und (b) Mehrdimensionalität der Beobachtungen gerechtfertigt ist. Das ist in etwa einem von fünf Setups der Fall. Wo HMM ins System kommt, läuft es immer rollend trainiert, mit Forward-Probabilities als Soft-Signal, und nie als alleiniger Trade-Trigger, sondern als Allokations-Modulator.
Wer mit „HMM löst Regime-Detection" startet, baut meist Komplexität auf, die er später nicht mehr kontrolliert. Starten Sie mit dem einfachen Filter. Bauen Sie HMM nur, wenn Sie konkret zeigen können, was es zusätzlich liefert.
Sie wollen Regime-Detection in Ihrem Setup richtig — ohne Overfitting? Erstgespräch buchen — ich zeige Ihnen, was bei Ihren Daten wirklich trägt.