18 · Backtesting
Una sola división train/test te da un número con suerte-o-mala-suerte. El backtesting rolling-origin (walk-forward) evalúa a través de muchos cortes para un honesto promedio ± desviación de tu error.
El backtesting rolling-origin mueve repetidamente el corte train/test hacia adelante por la serie, pronosticando la siguiente ventana cada vez usando solo el pasado. La distribución de errores por origen (promedio ± desviación) es una estimación de precisión mucho más honesta que una sola división.
Sin esto:
Una sola división puede caer en un tramo fácil (o imposible) y reportar un error engañoso; no tienes noción de la varianza y puedes sobre-confiar en un golpe de suerte.
En ML ordinario recurrirías a la validación cruzada k-fold, pero no puedes barajar una serie temporal — los folds pondrían el futuro en el entrenamiento. El equivalente para series temporales es el backtesting rolling-origin (también llamado walk-forward):
- Elige una ventana de entrenamiento inicial (el primer tramo de historia).
- Pronostica los siguientes
Hpasos (tu horizonte). - Puntúa el pronóstico contra lo que realmente pasó.
- Mueve el origen hacia adelante — extiende (o desliza) la ventana de entrenamiento para incluir esos pasos — y repite.
Terminas con un error por origen. Su promedio es tu precisión esperada y su desviación estándar te dice qué tan estable es. Una sola división te da solo el punto (1), sobre la rebanada de la serie que te tocó elegir.
La regla cardinal: en cada origen el modelo solo puede ver data estrictamente anterior al corte. Nada de espiar. Dos sabores de la ventana de entrenamiento:
- Expandible — la ventana crece en cada fold (usa toda la historia hasta ahora). Realista para el reentrenamiento en producción.
- Deslizante — una ventana de longitud fija se mueve hacia adelante (descarta data vieja). Mejor cuando el proceso deriva y la data vieja queda obsoleta.
Abajo corremos un backtest rolling-origin de ventana expandible de un pronosticador seasonal-naive a través de varios cortes, recolectamos los MAE por origen e imprimimos el promedio ± desviación.
Python (in browser)
Un backtest rolling-origin de ventana expandible: cada fold pronostica los siguientes 7 días usando solo su pasado, dando un error promedio ± desviación en vez de un número frágil.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
¿Cuál es la regla definitoria que hace válido al backtesting rolling-origin para series temporales (y que el k-fold ordinario viola)?
- El backtesting rolling-origin (walk-forward) mueve el corte hacia adelante, pronosticando la siguiente ventana cada vez usando solo el pasado.
- Reporta el promedio ± desviación de los errores por origen — una sola división oculta la varianza y puede sobre-confiar en una rebanada con suerte.
- Las ventanas expandibles crecen con toda la historia (reentrenamiento en producción); las deslizantes descartan data obsoleta (procesos que derivan).
La selección de modelos, el ajuste de hiperparámetros y el monitoreo en producción descansan todos en backtests walk-forward (TimeSeriesSplit de sklearn, sktime, Darts).
Si lo quitas: Confía en una sola división y ajustarás tu modelo a una rebanada de la historia y te sorprenderá cuando el siguiente tramo se comporte distinto.