Referencia técnica · Paso 9 · Walk-forward
La primera validación: partir la serie en folds consecutivos, agregar correctamente con el PF pooleado (no el promedio de razones), y testear contra un null que preserva la estructura temporal mediante un test de permutación con corrección de Phipson-Smyth.
La serie se parte en sub-períodos consecutivos y el combo se backtestea en cada uno. Dos gates definen cuándo un fold "cuenta". Los tres números son parámetros de entrada — abajo van sus valores por defecto, ajustables por el usuario.
La agregación cross-fold suma las ganancias y pérdidas reales de todos los folds antes de calcular el ratio — nunca promedia los PF por fold.
avg/std/min/max quedan como diagnóstico secundario; la decisión usa el pooled. Sharpe y expectancy también se poolean.¿El PF real supera al de barajar el timing de la señal manteniendo su estructura? El null correcto rota la señal — preservando las rachas — en vez de redibujarla al azar.
El iid Bernoulli del legacy redibuja señales independientes → destruye el clustering real y da p-values optimistas. El circular_shift es el null correcto para series autocorrelacionadas.
El +1 trata al estadístico real como una realización más del null (no una certeza): sin él, p puede ser 0.0 exacto y propagar FDR p_adj = 0. Solo el top-N por robustness recibe el test (es caro).
Al testear varios combos, algunos "ganan" por azar. Se aplica Benjamini-Hochberg sobre los p-values del Monte Carlo.
Limitación conocida: la familia del FDR es el top-N que recibió MC, no el set completo evaluado → la multiplicidad real es mayor que la corregida. Un FDR p al límite (~0.08-0.10) es candidato, no veredicto — el gate final real sigue siendo OOS y transferencia.
Un heurístico de ranking que combina rentabilidad pooleada y consistencia entre folds. No es un p-value ni una probabilidad de confianza.
Es un score de ranking, no de significancia — la UI no debe leerlo como "0.85 → 85% de confianza". Ordena candidatos; el gate estadístico es el FDR (§4), y los gates finales son OOS y transferencia.
Qué responde: ¿el edge es consistente entre sub-períodos y sobrevive un null que preserva la estructura temporal? Qué no: comportamiento fuera de muestra (todo el WFV es in-sample) ni en otros mercados. Es la primera de varias herramientas de validación, no la definitiva.
Fuentes:
· domain/walk_forward/folds.py — calculate_folds (rolling/expanding, full_test, gap)
· domain/validation_common/pooled_metrics.py — pool_fold_metrics (Σgp/Σgl)
· domain/walk_forward/monte_carlo.py — permutation_test (circular_shift, Phipson-Smyth)
· domain/walk_forward/robustness.py — robustness_score