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:
- Data:
- S&P500 point-in-time constituents 2000-2026.
- Daily bars OHLCV.
-
Fundamentals (for quality/value factor) con vintage snapshots.
-
In-sample: 2000-2014 (14 años).
- Out-of-sample: 2015-2026 (11 años).
-
CV durante in-sample: Combinatorial Purged CV con embargo 1 mes.
-
Cost model:
- RACIONAL Pro: 0.49% spread + 0.05% slippage = 0.54% por leg = 1.08% round-trip.
-
Aplicar en cada rebalance mensual.
-
Métricas:
- Net Sharpe (anualizado).
- Deflated Sharpe (ajuste por variantes probadas).
- Max drawdown.
- Calmar ratio (return / max DD).
- Turnover annual.
-
Win rate, avg win / avg loss.
-
Decisión go/no-go:
- Deflated Sharpe OOS > 0.8 → proceder a paper.
- Max DD OOS < 20% → proceder.
- Si Sharpe OOS < Sharpe IS / 2 → overfitting probable → parar.
Relaciones¶
- Source: sources/backtest-frameworks-and-pitfalls.
- Aplicación: analysis/recommended-strategy-for-user (Phase 0 Setup incluye backtest).
- Refuerza critiques de: analysis/nate-herk-claim-verification (30 días sin backtest rigoroso).