Golden SkyGolden SkyGuía Técnica

Referencia técnica · Paso 8a · Backtest — motor

Simulación y costos

Cómo el motor ejecuta un trade sin trampas: entrada al open de la vela siguiente, resolución de salida, el modelo de costos con swap direccional y triple-miércoles, el sizing, la restricción de una posición a la vez y la bancarrota.

§0Notación

ibarra donde aparece la señal
entry_idxi + 1 (barra de entrada)
exit_idxbarra de salida
Hmax_holding_periods
ppdperiods_per_day (barras/día)
sizetamaño de posición

§1Entrada

La señal aparece en la barra i, pero la entrada recién ocurre en la siguiente — no se puede operar dentro de la vela que todavía se está formando.

señal en barra i  →  entrada al open de i+1  // no look-ahead
señal en la última barra → skip (no hay i+1)
una posición a la vez: se saltean las señales con entry_idx ≤ exit_idx del trade abierto

§2Salida

La política de salida (por defecto TP/SL fijos) resuelve el cierre. Si nada dispara dentro del horizonte, cierra por timeout a mercado.

_resolve_exit exit_policy (default FixedTpSl): primer toque de TP o SL
sin toque en H → timeout: salida al close de min( i + H , n−1 )  // reason = "timeout"

Las 5 políticas (fija, GARCH, trailing ×3) se resuelven acá — su mecánica en detalle está en 8c. El timeout siempre cierra a mercado — su P&L real entra en las cuentas (a diferencia del target del descubrimiento, que lo excluye).

§3Resultado del trade

El retorno porcentual según dirección, neto de costos, escalado por el tamaño de posición.

pnl_pct = exit − entryentry [long]  ·  entry − exitentry [short]
pnl_pct −= costo  (§4)
pnl = size · pnl_pct  ·  capital += pnl

§4Modelo de costos

Costo fijo (spread + comisión + slippage combinados) más el swap direccional escalado por los días de tenencia, con el triple-swap del miércoles.

_cost_for_trade normal_days = exit_idx − entry_idxppd  ·  swap_day = swap_long o swap_short (según dirección)
wed_days_extra = 2 · wed_barsppd  // triple-miércoles: 3× = 1× base + 2× extra
costo = fixed_cost_pct + swap_day · ( normal_days + wed_days_extra )

El triple-miércoles compensa el rollover del fin de semana en forex retail. Es una aproximación por conteo de barras (no por rollovers reales del broker); el error es de a lo sumo 1 rollover en el borde y sistemáticamente conservador (nunca subestima el costo). Sin wednesday_mask, el swap se cobra uniforme por día.

§5Sizing y bancarrota

El tamaño se calcula por trade con un piso de capital que corta el run si la cuenta cae demasiado.

size = compute_position_size( mode, risk_per_trade, capital_actual, stop_loss_pct, bankruptcy_floor )
si el sizing detecta capital < bankruptcy_floor → bankrupt = True, se detiene el run

Modos de sizing: fijo, tamaño mínimo, o porcentaje de riesgo. El bankruptcy_floor es una fracción del capital inicial por debajo de la cual no se toman nuevos trades (evita simular una cuenta ya arruinada).

Continúa en 8b: la equity curve, PF con cap, expectancy, Sharpe/Sortino desde la equity diaria, drawdown, Ulcer, recovery y Calmar.
Ver también 8c (exit policies en detalle: fija, GARCH, trailing ×3) y 8d (filtro de régimen: clasificación y refinamiento per-combo).

Fuentes:
· domain/backtester/engine.py — run_backtest, _resolve_exit, _cost_for_trade, _apply_regime_filter
· domain/backtester/position_sizing.py — compute_position_size, bankruptcy_floor
· domain/backtester/exit_policies/ — FixedTpSl, GARCH, trailing (×3)