Saltar a contenido

Backtest methodology — frameworks y pitfalls

Cómo backtest correcto para la strategy recomendada en analysis/recommended-strategy-for-user. Cubre tooling + pitfalls críticos (López de Prado).

Frameworks Python — decisión

Framework Fortaleza Debilidad Usar cuando
VectorBT Fast (NumPy+Numba, vectorized) Python 3.5-3.6 era; friccional en 3.11+ Research, parameter sweeps
Backtrader Rica docs, Alpaca/IBKR broker integ, live trading path Más lento por event-driven Python Production path, swing strategies
Zipline-Reloaded Factor research, academic Slow en minute-level Factor research específico
QuantConnect/LEAN Managed, integrated data + live Lock-in, cost Production grade sin DIY
NautilusTrader Fastest param optimization Advanced Post-MVP cuando haya hyperopt

Recomendación para este proyecto

  • Phase 0 backtest: VectorBT para parameter sweep.
  • Phase 1 validation: Backtrader con costs reales RACIONAL para sanity check.
  • Post-MVP: NautilusTrader si se quiere optimizar hyperparámetros agresivamente.

Pitfalls críticos

1. Survivorship bias

  • Problema: usar S&P500 actual como universe ignora empresas que cayeron.
  • Error introducido: +1-4% annual return ficticio, Sharpe inflado.
  • Fix: data point-in-time. Norgate Data, CRSP, o Polygon con historical constituents.
  • Para este proyecto: crítico — la strategy se apoya en ranking del S&P500, que cambia constituyentes frecuentemente.

2. Look-ahead bias

  • Problema: feature en T usa info de T+k (ej. adjusted close post-split aplicado retro, volume EOD en decisión intraday).
  • Fix: Purged K-Fold Cross-Validation (López de Prado 2017) — remover train samples cuyos labels overlap con test.
  • Extensión moderna: Combinatorial Purged CV (CPCV) — multiple train/test splits con purge + embargo.

3. Overfitting

  • Cita devastadora (López de Prado): "After trying only 7 strategy configurations, a researcher is expected to identify at least one 2-year long backtest with an annualized Sharpe ratio of over 1, when the expected out of sample Sharpe ratio is 0."
  • Fix: Deflated Sharpe Ratio (Bailey-López de Prado) — ajuste por número de trials. Si Sharpe 1.5 en 20 variantes testeadas, el Deflated Sharpe puede ser ~0.5.
  • Best practice: pre-register la strategy antes de backtest. Definir reglas de decisión ex-ante.

4. Transaction cost underestimation

  • Problema específico de este proyecto: papers académicos asumen commission-free broker (~0.0015%). RACIONAL cobra 1-2% round-trip. Ver analysis/zarattini-strategy-racional-viability.
  • Fix:
  • Modelar costs reales del broker del user en CADA trade del backtest.
  • Aplicar slippage conservador: 1.5-2x el histórico.
  • Stress test con costs 50% mayores para margen.

5. Selection bias del researcher

  • Problema: solo publicamos/retenemos las strats que funcionaron. El cementerio de intentos fallidos sesga la inferencia.
  • Fix: pre-register en docs del proyecto antes de correr backtest. Si la strat no funciona, esa evidencia también cuenta.

López de Prado principles

"Backtesting is not a research tool. Feature importance is. Backtesting while researching is like drinking and driving."

Implicación operativa: la strategy debe derivarse de economic rationale + feature importance, no de "correr 1000 backtests hasta que uno pegue".

Para este proyecto: 1. Los factors momentum/quality/value tienen décadas de research y racional económico. ✓ 2. La combinación (composite score 0.5/0.3/0.2) debe justificarse teóricamente, no buscar el ratio mágico vía grid search. 3. Walk-forward con OOS estricto evita el "drinking while driving".

Plan de backtest específico

Para la strategy de analysis/recommended-strategy-for-user:

  1. Data:
  2. S&P500 point-in-time constituents 2000-2026.
  3. Daily bars OHLCV.
  4. Fundamentals (for quality/value factor) con vintage snapshots.

  5. In-sample: 2000-2014 (14 años).

  6. Out-of-sample: 2015-2026 (11 años).
  7. CV durante in-sample: Combinatorial Purged CV con embargo 1 mes.

  8. Cost model:

  9. RACIONAL Pro: 0.49% spread + 0.05% slippage = 0.54% por leg = 1.08% round-trip.
  10. Aplicar en cada rebalance mensual.

  11. Métricas:

  12. Net Sharpe (anualizado).
  13. Deflated Sharpe (ajuste por variantes probadas).
  14. Max drawdown.
  15. Calmar ratio (return / max DD).
  16. Turnover annual.
  17. Win rate, avg win / avg loss.

  18. Decisión go/no-go:

  19. Deflated Sharpe OOS > 0.8 → proceder a paper.
  20. Max DD OOS < 20% → proceder.
  21. Si Sharpe OOS < Sharpe IS / 2 → overfitting probable → parar.

Relaciones