Regime detection — bull vs bear vs transition¶
¿Cómo detectar en tiempo real si el mercado está cambiando de régimen? Crítico porque los momentum crashes ocurren en transiciones bear→bull. La recomendación: ensemble de 3-4 indicadores simples, no un solo modelo ML.
Principio¶
Ningún indicator solo es suficiente. Un sistema robusto: - Combina 3-4 signals ortogonales. - Define regímenes discretos (risk-on, risk-off, transition). - Switchea exposure por regime, no cada día.
Indicators recomendados (ortogonales)¶
1. Trend filter — SPY vs 200-day MA¶
- Bull: SPY > 200-day MA.
- Bear: SPY < 200-day MA -5%.
- Signal único más usado por simple efectividad.
2. VIX level + term structure¶
- VIX < 20: calm bull.
- VIX 20-30: elevated uncertainty.
- VIX > 30: panic / bear.
- Backwardation (VIX9D > VIX1M): panic bottom potencial — contrarian signal.
- Contango (VIX1M < VIX3M): normal, mild concern.
Cboe publica VIX9D, VIX, VIX3M, VIX6M, VIX1Y — usar la forma de la curva, no solo el nivel.
3. Breadth — advance/decline ratio¶
- Bull: breadth >1.5 (más stocks subiendo que bajando consistentemente).
- Divergence bajista: SPY sube pero breadth cae → rally frágil (ej: 2021-Q4 → 2022 bear).
- Bull-Bear ratio: >1.5 bullish, <0.5 bearish, 0.5-1.5 neutral.
4. Yield curve¶
- 10Y - 2Y inverted: históricamente predictor de recession (lag 6-18 meses).
- No cambia la posición del mes siguiente, pero ajusta expectativa de transition.
Regímenes discretos¶
Combinar los 4 signals en 4 estados:
| Régimen | Condición | Position sizing |
|---|---|---|
| Bull normal | SPY>200MA + VIX<20 + breadth>1.5 | 100% target |
| Bull elevated | SPY>200MA + VIX 20-30 + breadth>1 | 75% target |
| Transition | SPY cross ±5% of 200MA o VIX 25-35 | 50% target |
| Bear / panic | SPY<200MA-5% o VIX>35 o breadth<0.5 | 25% target o cash |
Hysteresis: para evitar flip-flopping, requiere condiciones sostenidas 3-5 días antes de cambiar regime.
Integración con Strategy Agent¶
El Strategy Agent consulta regime flag al final de su procedure:
regime = detect_regime(spy_vs_200ma, vix_level, vix_term_structure, breadth)
position_sizing_scalar = {
"bull_normal": 1.0,
"bull_elevated": 0.75,
"transition": 0.5,
"bear_panic": 0.25
}[regime]
# Apply to all positions in the signals output
Esto suma al vol targeting de analysis/momentum-crash-risk — si ambos reducen, se multiplican (más conservative).
Por qué NO ML / black box¶
Tentación: entrenar un modelo ML que detecte regime shifts. Razones para evitar en MVP:
- Overfitting: limited regime transitions en data histórica (~10-15 desde 1990). Imposible entrenar bien.
- Interpretability: si falla, no sabes por qué.
- Robustness: regla simple sobre 4 signals documentados académicamente es más robusta.
- Time: MVP tiene que estar corriendo en semanas, no meses.
Post-MVP, si el sistema funciona, explorar HMM (Hidden Markov Models) o similar.
Gaps¶
- Backtest del regime filter: ¿cuánto reduce drawdown? ¿cuánto cuesta en upside?
- Sensitivity al threshold exacto (±5% vs ±10% del 200MA, VIX 30 vs 35).
- Detección de false positives: en 2015-2016 hubo transition corto que revirtió — el sistema habría salido y re-entrado, costando fricción.
- Cómo integrar macro context (Fed decisions, earnings season) sin convertirlo en discretionary.
Relaciones¶
- Resuelve: PP-08.
- Complementa: analysis/momentum-crash-risk (vol targeting + regime detection son independientes, se multiplican).
- Usado por: concepts/agent-prompts (Strategy Agent consulta regime flag).
- Protege: analysis/recommended-strategy-for-user (añadir regime filter al composite).