Lab

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.

K (states)3
seed=7
K* by BIC
2
BIC at K*
-3602
log L̂ at K
1820
BIC at K
-3590
n bars
500
planted K
3
BIC = −2·log L̂ + p(K)·log n, with p(K) = (K−1) + 2K. Lower is better. The argmin (highlighted amber) is the BIC-preferred mixture.
-3605-3587-3568-3550-3532K=2-3602K=3-3590K=4-3572K=5-3553K=6-3535BIC(K), lower is better-0.070.370.80cumulative log-price coloured by MAP regime (K = 3)t = 0t = 500

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

Fig. 1:BIC(K) entre dez pares cripto de 30 minutos. Em todo ativo a curva é monotonicamente decrescente até K = 4 e o ganho marginal encolhe nitidamente depois, o BIC seleciona K = 4 universalmente.
Fig. 2:Preço de LTC/USDT 30m colorido pelo regime inferido sob o HMM de K = 4. Trechos longos monocromáticos refletem as altas probabilidades de permanência (0,97–0,99) e tempos de permanência de 32–76 barras.
Fig. 3:O mesmo ajuste de K = 4 em BTC/USDT 30m. A estrutura de quatro estados se transfere entre ativos, trend-up, trend-down, drift e um regime distinto de alta vol são recuperados sem qualquer reajuste.
Fig. 4:Matriz de transição estimada A em LTC 30m. A dominância diagonal, cada p_kk acima de 0,97, é o que torna os regimes úteis: estimativas de estado são estáveis o suficiente para condicionar risco em cima.
Fig. 5:Verificação em dados sintéticos com três regimes conhecidos. O EM recupera a sequência de estados plantada com ≥98% de acurácia por barra; o BIC corretamente identifica K* = 3 aqui.

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. [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. [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. [3]Schwarz, G. (1978). Estimating the dimension of a model. Annals of Statistics 6(2), 461–464.