Referencia técnica · Paso 8b · Backtest — métricas
Las métricas que produce el backtest a partir de la lista de trades: la curva de capital, el profit factor con cap, la expectativa, los ratios ajustados por riesgo (Sharpe, Sortino, Calmar) desde la equity diaria, y las medidas de drawdown.
La equity parte del capital inicial y salta con el P&L de cada trade en su barra de salida — plana entre trades.
Profit factor (capeado), expectativa y tasa de acierto sobre el conjunto de trades.
Si gl = 0 y hay ganancia, PF es ∞ → se reporta el cap (con flag pf_capped). Si no hay ganancia, PF = 0. El cap evita que unos pocos trades sin pérdidas produzcan un PF engañosamente enorme.
Sharpe y Sortino se calculan sobre los retornos diarios de la equity (daily bins con fence-post fix), anualizados a 252 días.
Sortino castiga solo la volatilidad a la baja: el denominador promedia min(0, r−MAR)² sobre todas las N observaciones (no solo las negativas). Con MAR=0, garantiza Sortino ≥ Sharpe cuando la media es positiva. Si no hay ningún retorno bajo MAR → None (honesto), no el sharpe×1.5 inventado del legacy.
El drawdown y el Ulcer se calculan sobre la equity barra a barra (más granular que los bins diarios de los ratios).
El Ulcer Index distingue un DD de 20% que dura 5 barras de uno que dura 50 (mismo max_dd, distinto Ulcer) — mide el "dolor" sostenido, no solo el pico. La granularidad barra-a-barra (vs diaria de Sharpe) tiene impacto bajo porque la equity es plana entre salidas.
Complementos diagnósticos del resultado.
Los motivos de salida agrupados por familia permiten leer la distribución (cuántos TP, SL, timeout) sin que las variantes de exit policy (GARCH, trailing) fragmenten el conteo.
Viene de 8a: entrada al next-open, resolución de salida, costos, sizing y bancarrota.
Fuentes:
· domain/backtester/metrics.py — compute_metrics, PF (cap), _sharpe_from_daily_returns, _sortino_from_daily_returns, _max_drawdown, _ulcer_index, _daily_bin_indices