Pular para conteúdo

ML Pipeline

O coração do sistema. Implementa práticas modernas de finanças quantitativas baseadas em Lopez de Prado (Advances in Financial Machine Learning, 2018).

Visão de alto nível

flowchart LR
    Candles[Candles<br/>OHLCV] --> FE[Feature Engineering]
    FE --> Labels[Triple-Barrier<br/>Labeling]
    Labels --> CV[CPCV<br/>Cross-Validation]
    CV --> Ensemble[LGBM + XGB + CAT]
    Ensemble --> Conformal[Conformal<br/>Prediction]
    Conformal --> Meta[Meta-Label<br/>Filter]
    Meta --> Pred[Predição<br/>+ Confidence]
    Pred --> Gates[Quality Gates<br/>AUC/PF/ECE]
    Gates -->|promoted| Production[Champion<br/>em produção]

Componentes

1. Feature Engineering (app/features/)

Features estacionárias (incluídas):

  • atr_14, atr_50 — Average True Range
  • slope_ema_*, dist_from_ema_* — derivadas de EMA (não a própria EMA)
  • above_ema_20/50/200, ema_aligned — booleanos
  • vol_expansion, volatility_regime
  • session_london, session_ny, session_tokyo
  • spread_high, alignment_score
  • fda_close, fda_volume — Fractional Differentiation (Lopez de Prado cap.5)

Features excluídas explicitamente (drift adversarial severo):

  • ema_20, ema_50, ema_200 — variam com nível de preço
  • close, open, high, low — não-estacionárias

2. Triple-Barrier Labeling (app/labels/)

Em vez de "preço sobe em 1 hora?" (label binário fixo), usamos barreiras adaptativas por ATR:

# configs/model.yaml
labels:
  atr_take: 1.5    # take-profit = entry + 1.5×ATR
  atr_stop: 1.0    # stop-loss   = entry - 1.0×ATR
  adaptive_horizon: true
  horizons:
    M5:  12        # 1h em M5
    M15: 8         # 2h em M15
    H1:  8         # 8h em H1
    H4:  4         # 16h em H4

3 classes: 0=stop, 1=take, 2=timeout (NO_TRADE).

Adaptive horizon: quando ATR está alto, horizon é reduzido proporcionalmente — evita rotular trades em mercados super-voláteis.

3. CPCV — Combinatorial Purged Cross-Validation (app/models/cv.py)

Walk-Forward simples sub-amostra mal os dados em séries temporais. CPCV é a solução de Lopez de Prado (cap.12):

walk_forward:
  use_cpcv: true
  cpcv_n_splits: 6    # C(6,2) = 15 combinações de paths
  cpcv_n_test: 2      # folds de teste por combinação

Benefícios:

  • 15 paths por modelo (não 1) → distribuição de métricas, não ponto
  • cpcv_p5 (5º percentil) é o "worst case" usado em quality gate
  • Embargo + Purge evita lookahead entre train/test

4. Ensemble

Três modelos votam por blend ponderado:

Modelo Peso
LightGBM 0.50
XGBoost 0.30
CatBoost 0.20

Razões (mais detalhes em ADR-003):

  • LGBM = velocidade + low overfit
  • XGB = bom em features categóricas (regime)
  • CAT = robusto a NaN, ordinal nativo

5. Conformal Prediction (app/models/conformal.py)

ICP (Inductive Conformal Prediction) com α = 0.15 → cobertura mínima 85%.

# Em vez de "P(buy) = 0.62 → BUY"
# Geramos um conjunto de classes possíveis:
prediction_set = conformal_predict(probs, alpha=0.15)
# {0: 0.32, 1: 0.62, 2: 0.06} → set = {1}   ✅ singleton: BUY confiável
# {0: 0.38, 1: 0.41, 2: 0.21} → set = {0,1} ❌ ambíguo: NO_TRADE

Sinais com set não-singleton viram NO_TRADE — confiabilidade calibrada.

6. Meta-Labeling

Segundo modelo decide se opera, não o quê:

flowchart LR
    Primario[Modelo primário<br/>direção: BUY/SELL] --> MetaIn[Features +<br/>predição primária]
    MetaIn --> Meta[Modelo meta<br/>binário: opera ou não]
    Meta -->|sim| Sinal[Sinal emitido]
    Meta -->|não| Skip[NO_TRADE]

Reduz falsos positivos sem perder direção (cap.3 do Lopez de Prado).

7. Quality Gates (promoção) — v2.27

promotion:
  min_auc:           0.58
  min_auc_p5:        0.55    # CPCV 5º percentil
  max_ece:           0.25    # Expected Calibration Error
  min_profit_factor: 0.95    # backtest forward

Modelo só é promovido se passar todos os 4 gates.

Após v2.27: 71/72 modelos aprovados (98.6%). Os reprovados ficam em models-history/ (sticky no B2) para auto-rollback se champion atual degradar.

8. Auto-Rollback CUSUM (app/monitoring/)

Loop diário:

  1. Recalcula métricas de cada champion nos últimos 7d
  2. Se PSI > 2.0 OU PF < 0.85 → CUSUM dispara
  3. Busca anterior em models-history/ que ainda passa gates
  4. Promove anterior, marca atual como degraded
  5. Notifica Telegram

Onde cada coisa mora

Tópico Arquivo
Treino scripts/run_training.py + app/models/train_lightgbm.py
CPCV app/models/cv.py
Conformal app/models/conformal.py
Meta-label app/models/meta_label.py
Predict app/models/predict.py
Drift app/monitoring/drift_detector.py
Re-screen scripts/rescreen_champions.py
Auto-retrain scripts/auto_retrain.py