Lab · segmentation de régime
Segmentation de régime par Markov caché de la microstructure crypto
Un HMM gaussien sur des features (logret, vol, trend), avec le nombre d'états K sélectionné par BIC, produisant des régimes persistants et interprétables pour le risque et le sizing.
Les mathématiques
Un modèle de Markov caché factorise une séquence d'observations de longueur T x1:T à travers une chaîne de Markov latente z1:T à K états. La densité jointe est
Pour des features continues, nous laissons chaque émission être gaussienne : . Les paramètres θ = (π, A, {μk, Σk}) sont estimés par Baum–Welch (EM appliqué aux HMM). L'étape E est la récursion forward-backward
Le postérieur lissé γt(k) ∝ αt(k) βt(k) est ce que nous livrons aux règles de sizing en aval. C'est une probabilité, non un label dur, et son entropie par ligne est un score naturel de confiance de régime.
Choisir K avec le BIC
Avec des features en d dimensions, un HMM gaussien à K états avec covariances complètes a p = K − 1 + K(K−1) + Kd + Kd(d+1)/2 paramètres libres. Le critère d'information bayésien
arbitre entre l'ajustement en échantillon et la complexité au taux log n. Nous balayons K = 2, 3, 4,…, choisissons K* = arg minK BIC(K). Sur LTC/USDT 30 minutes (n = 270 171 barres ; d = 3 features) le balayage est sans ambiguïté : le BIC chute de 1,633M à K = 2 à 1,366M à K = 3 puis à 1,251M à K = 4. K = 4 l'emporte sur chaque actif que nous avons essayé. Le même graphique cross-asset de BIC apparaît ci-dessous.
Persistance et temps de séjour
La matrice de transition A a des probabilités de boucle propre pkk. Le nombre attendu de barres passées dans le régime k avant que la chaîne ne transite est la moyenne géométrique
Ajusté sur LTC 30m, nous mesurons des probabilités de séjour (0,987, 0,970, 0,969, 0,981), c'est-à-dire des temps de séjour τ ≈ (76, 34, 32, 52) barres, ce qui sur une horloge de 30 minutes signifie que les régimes durent de l'ordre de 16–38 heures. Ce ne sont pas des artefacts d'une segmentation clignotante ; ils sont macroscopiquement stables.
Exemple détaillé
Vecteur de features par barre xt = (logrett, volt, trendt), où logret est le log-rendement de la barre, vol est un écart-type réalisé glissant, et trend est une pente lissée. Ajuster K = 4 sur LTC 30m produit quatre régimes dont les moyennes standardisées sont nettement séparées :
- R1, drift-down (32 % des barres) : z de vol négatif, trend proche de zéro. Le régime de fond par défaut.
- R2, trend-up (24 %) : trend moyen ≈ +0,58 σ. Drift positif soutenu, vol modérée.
- R3, trend-down (25 %) : trend moyen ≈ −0,60 σ. Miroir de R2.
- R4, haute vol (20 %) : vol moyenne ≈ +1,48 σ, trend proche de zéro. Le régime de dispersion.
La démo interactive ci-dessous ajuste un modèle de mélange gaussien en direct pour K ∈ {2, …, 6} sur une série de prix synthétique et trace BIC(K), le minimum est surligné. La bande en dessous colore le chemin de prix par l'état inféré au K choisi.
Demo: Gaussian-mixture BIC sweep & regime strip
Synthetic log-returns with three planted regimes. EM-fit a K-component mixture for K ∈ {2,…,6}; pick K by BIC; colour the price by MAP regime.
BIC selects K* = 2 on this synthetic series (planted K = 3). The mixture conflates the persistence structure of an HMM into pure distributional separation, so on shorter samples it can prefer K = 2 or K = 4, the production HMM uses the full transition matrix and is better calibrated. Reseed to explore that variance.
Figures
Pourquoi cela compte pour les stratégies systématiques
La plupart des évaluations de stratégie moyennent la performance sur un unique échantillon mixte et reportent un seul Sharpe. Conditionner sur zt partitionne cet échantillon par régime et expose la structure que la moyenne cache : une stratégie qui est à +1,5 de Sharpe en trend-up et −0,8 de Sharpe en haute vol n'est pas le même objet qu'une stratégie qui est à +0,3 dans chaque régime, même si les deux ont le même Sharpe agrégé. Le HMM nous donne la partition dont nous avons besoin pour faire ces affirmations quantitativement, et, parce que nous utilisons le postérieur lissé, pour pondérer les barres par la probabilité d'appartenance au régime plutôt que de seuiller sur un label dur.
Le même postérieur alimente le sizer de position : ajustez l'exposition par P(zt ∈ favorable | x1:t) calculé dans le passage causal forward (filtrage, non lissage, pour usage en direct). Quand la chaîne est confiante nous nous positionnons davantage ; quand l'entropie bondit près d'une transition nous réduisons le risque. La persistance que nous mesurons (τ ≈ 16–38 h) est l'échelle de temps qui rend ce type de sizing conditionnel économiquement viable sur des données de 30 minutes.
Reproductibilité
DaruFinance / strategy-regime
Python · implémentation de référence open-source
Invocation minimale
import numpy as np
from strategy_regime import fit_hmm, bic_sweep, posterior
# X: T x d feature matrix (logret, vol, trend) per bar
sweep = bic_sweep(X, K_grid=[2, 3, 4, 5, 6])
K_star = min(sweep, key=lambda r: r["bic"])["K"]
model = fit_hmm(X, n_states=K_star, n_iter=200, seed=0)
gamma = posterior(model, X) # T x K smoothed P(z_t | x_{1:T})
states = gamma.argmax(axis=1) # MAP regime per bar
dwell = 1.0 / (1.0 - np.diag(model.transmat_)) # expected dwell per regime
Références
- [1]Hamilton, J. D. (1989). A new approach to the economic analysis of nonstationary time series and the business cycle. Econometrica 57(2), 357–384.
- [2]Rabiner, L. R. (1989). A tutorial on hidden Markov models and selected applications in speech recognition. Proceedings of the IEEE 77(2), 257–286.
- [3]Schwarz, G. (1978). Estimating the dimension of a model. Annals of Statistics 6(2), 461–464.

