--- id: "0088g" title: "Trading: app `backtester`" status: pendiente type: feature domain: - trading scope: app-scoped priority: alta depends: [] blocks: [] related: [] created: 2026-05-17 updated: 2026-05-17 tags: [] --- # 0088g — Trading: app `backtester` **Status:** pendiente **Created:** 2026-05-14 **Type:** feature **Parent:** 0088 **Depends:** 0088b, 0088c, 0088d, 0088e, 0088f **Blocks:** 0088h (activar live solo tras backtest verde + paper estable) ## Problema Necesitamos un backtest harness deterministico que corra una Strategy contra OHLCV historico, aplique el mismo pipeline de risk que en live, simule fills via `broker_paper`, y produzca un reporte estandarizado. Sin este harness, no hay forma de comparar estrategias ni de validar que `sharpe_backtest ≈ sharpe_live`. ## Piezas 1. App `projects/trading/apps/backtester/` (CLI + opcional web). 2. Pipeline canonico: `load_ohlcv → loop ticks → Strategy.decide → apply_risk → broker_paper → ledger → siguiente`. 3. Reporte deterministico (JSON + markdown) con: - Total return, CAGR, sharpe, sortino, max drawdown, calmar, win-rate, avg win/loss, exposure %. - Equity curve (lista timestamp, equity). - Tabla de trades con `client_order_id`. 4. CLI: - `./fn run backtester --strategy --params params.yaml --symbol BTCUSDT --interval 1h --from 2024-01-01 --to 2024-12-31`. 5. Determinismo: misma semilla, mismos datos, mismo reporte byte-a-byte. 6. `e2e_checks`: - `build`, `smoke` (corre backtest dummy 100 velas). - `determinism`: 2 corridas idem producen mismo hash de reporte. 7. Reuso obligatorio: cada paso es funcion del registry (no inline en la app). ## Aceptacion - Reporte hash-estable entre corridas con misma seed. - 2 strategies de referencia (0088e) corren contra >= 1 simbolo y producen reporte completo. - Reporte importable desde `analysis/strategy_lab` para comparar estrategias. ## No-objetivos - Optimizacion de parametros (grid search, bayesian) — saldria a sub-issue futuro. - Walk-forward / cross-validation — futuro. - UI rica de reporte — primero CLI + markdown.