Referencia técnica · Paso 3 · Calibración TP/SL
Formalización de la calibración: la escala de volatilidad característica que dimensiona la grilla, el Monte Carlo de entradas al azar que caracteriza el activo, y el ranking por Sharpe del R-múltiple por celda.
Una medida robusta de "cuánto se mueve el activo por barra", escalada al horizonte del trade con la regla de la raíz del tiempo. Se calcula sobre el IS, nunca sobre el OOS.
Precisión — scale_h ≠ σ, y es deliberado. Bajo normalidad mediana(|X|) ≈ 0.6745·σ → scale_h ≈ 0.67·σ; con colas gruesas (típico en financieros) la brecha crece → scale_h < 0.67σ. El nombre "escala" (no "sigma") evita razonar mal sobre el risk-of-ruin. Corre sobre df_development (IS) para no filtrar el OOS al TP/SL sugerido.
Cada eje de la grilla son múltiplos de scale_h — así la grilla se adapta sola a cada activo. Los multiplicadores son asimétricos por decisión de riesgo.
| Eje | Multiplicadores (× scale_h) | Cap |
|---|---|---|
| TP · 9 | 0.5 · 0.75 · 1 · 1.5 · 2 · 3 · 4 · 6 · 8 | 8× |
| SL · 8 | 0.25 · 0.5 · 0.75 · 1 · 1.5 · 2 · 3 · 4 | 4× |
9 × 8 = 72 celdas. Asimetría por risk management: el TP llega a 8× (recompensa, sin implicación de solvencia); el SL se topa en 4× — un SL > 4×scale_h ≈ 2.7σ real ≈ "no tener SL", expone a patrones tipo martingala/blow-up.
Para caracterizar el activo (no una estrategia), se entra en 1000 puntos al azar y se resuelve cada trade con la misma mecánica del target. El resultado señalizado por entrada alimenta el R-múltiple.
El R_i se computa sobre las n entradas completas (no condicional a ganar/perder). Eso es lo que permite medir dispersión y penalizar celdas cuyo edge lo sostiene una cola delgada.
La distribución de outcomes por celda produce las métricas. Solo una decide el ranking; el resto son contexto.
Por qué el expectancy ya no rankea (rediseño 2026-08-14): sesgaba hacia SL grande y hacia celdas cuyo edge dependía de una cola delgada de entradas. sharpe_cell = mean_r/std_r exige mean_r alto Y std_r bajo a la vez, penalizando esa cola de forma natural.
La recomendada es simplemente la de mayor Sharpe del R-múltiple, con un único filtro que no es de negocio.
El único guard es std_r > 0 — no hay umbral de negocio. Los criterios viejos (health_score > 0, timeout_rate < 80%, active_rate > 10%) fueron eliminados. Si ninguna fila tiene std_r válido → None (activo+horizonte sin varianza).
Además del ranking, se computa la línea base exacta del usuario y se redondea el valor final preservando la proporción.
El redondeo por cifras significativas (no decimales fijos) preserva el R:R: 0.526/0.263 → 0.53/0.26 mantiene R:R ≈ 2.0, mientras que a 1 decimal daría 0.5/0.3 = 1.67. La user_baseline marca out_of_grid si el TP/SL del usuario cae fuera del rango evaluado.
La calibración es opcional y caracteriza el activo (entradas al azar), no descubre ninguna ventaja. Ajusta el marco de TP/SL que después consumirán el target y el backtest — no dice nada sobre si las reglas funcionan.
Fuentes:
· domain/tpsl_calibration/calibrator.py — compute_scale_h, build_vol_adapted_grid, TP/SL_MULTIPLIERS, run, _pick_recommended, _round_sig
· domain/tpsl_calibration/monte_carlo.py — select_random_entries, simulate_outcomes, SimulationStats (win_rate, expectancy, sharpe_cell, R-múltiple)