Lab · segmentação de regime
Segmentação de regime via Markov Oculto da microestrutura cripto
Um HMM Gaussiano sobre features (logret, vol, trend), com o número de estados K selecionado por BIC, produzindo regimes persistentes e interpretáveis para risco e sizing.
A matemática
Um modelo de Markov oculto fatora uma sequência de observações de tamanho T x1:T através de uma cadeia de Markov latente z1:T com K estados. A densidade conjunta é
Para features contínuas, deixamos cada emissão ser Gaussiana: . Os parâmetros θ = (π, A, {μk, Σk}) são estimados por Baum–Welch (EM aplicado a HMMs). O E-step é a recursão forward-backward
O posterior suavizado γt(k) ∝ αt(k) βt(k) é o que entregamos às regras de sizing a jusante. É uma probabilidade, não um rótulo rígido, e sua entropia por linha é um score natural de confiança de regime.
Escolhendo K com BIC
Com features em d dimensões, um HMM Gaussiano de K estados com covariâncias completas tem p = K − 1 + K(K−1) + Kd + Kd(d+1)/2 parâmetros livres. O Critério de Informação Bayesiano
equilibra ajuste in-sample contra complexidade na taxa log n. Varremos K = 2, 3, 4,…, escolhemos K* = arg minK BIC(K). Em LTC/USDT 30 minutos (n = 270.171 barras; d = 3 features) a varredura é inequívoca: BIC cai de 1,633M em K = 2 para 1,366M em K = 3 e para 1,251M em K = 4. K = 4 vence em todo ativo que tentamos. O mesmo gráfico cross-asset de BIC aparece abaixo.
Persistência e tempo de permanência
A matriz de transição A tem probabilidades de auto-loop pkk. O número esperado de barras passadas dentro do regime k antes de a cadeia transitar é a média geométrica
Ajustado em LTC 30m medimos probabilidades de permanência (0,987, 0,970, 0,969, 0,981), ou seja, tempos de permanência τ ≈ (76, 34, 32, 52) barras, o que em um relógio de 30 minutos significa que os regimes duram da ordem de 16–38 horas. Não são artefatos de uma segmentação oscilante; são macroscopicamente estáveis.
Exemplo trabalhado
Vetor de features por barra xt = (logrett, volt, trendt), onde logret é o log-retorno da barra, vol é um desvio-padrão realizado rolante, e trend é uma inclinação suavizada. Ajustando K = 4 em LTC 30m produz quatro regimes cujas médias padronizadas estão nitidamente separadas:
- R1, drift-down (32% das barras): z de vol negativo, trend próximo de zero. O regime de fundo padrão.
- R2, trend-up (24%): trend médio ≈ +0,58 σ. Drift positivo sustentado, vol moderada.
- R3, trend-down (25%): trend médio ≈ −0,60 σ. Espelho de R2.
- R4, alta vol (20%): vol média ≈ +1,48 σ, trend próximo de zero. O regime de dispersão.
O demo interativo abaixo ajusta um modelo de mistura Gaussiana ao vivo para K ∈ {2, …, 6} em uma série de preços sintética e plota BIC(K), o mínimo é destacado. A faixa abaixo colore o caminho de preço pelo estado inferido no K escolhido.
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.
Figuras
Por que isso importa para estratégias sistemáticas
A maioria das avaliações de estratégia tira a média do desempenho sobre uma única amostra mista e reporta um único Sharpe. Condicionar em zt particiona essa amostra por regime e expõe a estrutura que a média esconde: uma estratégia que é +1,5 de Sharpe em trend-up e −0,8 de Sharpe em alta vol não é o mesmo objeto que uma estratégia que é +0,3 em todo regime, mesmo que ambas tenham o mesmo Sharpe combinado. O HMM nos dá a partição que precisamos para fazer essas afirmações quantitativamente, e, porque usamos o posterior suavizado, para ponderar barras pela probabilidade de pertencimento a um regime em vez de aplicar limiar em um rótulo rígido.
O mesmo posterior alimenta o sizer de posição: escale a exposição por P(zt ∈ favorável | x1:t) computado na passagem causal forward (filtragem, não suavização, para uso ao vivo). Quando a cadeia está confiante nos posicionamos com mais peso; quando a entropia salta perto de uma transição reduzimos risco. A persistência que medimos (τ ≈ 16–38 h) é a escala temporal que torna esse tipo de sizing condicional economicamente viável em dados de 30 minutos.
Reprodutibilidade
DaruFinance / strategy-regime
Python · implementação de referência open-source
Invocação mínima
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
Referências
- [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.

