Add walk-forward validation with optimizer, OOS evaluation and visualizer
This commit is contained in:
107
BACKTESTING.md
107
BACKTESTING.md
@@ -273,6 +273,113 @@ Win Rate: 45%
|
||||
Profit Factor: 1.1
|
||||
```
|
||||
|
||||
## 🔁 Walk-Forward Validation (Out-of-Sample)
|
||||
|
||||
### 📌 ¿Qué es Walk-Forward Validation?
|
||||
|
||||
El *walk-forward validation* es una técnica avanzada de validación que simula cómo se comportaría una estrategia en condiciones reales:
|
||||
|
||||
- Los parámetros se **optimizan solo en datos pasados (TRAIN)**
|
||||
- La estrategia se **ejecuta en datos futuros no vistos (TEST)**
|
||||
- El proceso se repite de forma deslizante a lo largo del tiempo
|
||||
|
||||
Esto evita:
|
||||
- Look-ahead bias
|
||||
- Overfitting clásico
|
||||
- Optimismo artificial en backtests
|
||||
|
||||
Es el estándar en *quant research* profesional.
|
||||
|
||||
---
|
||||
|
||||
### 🧠 Metodología aplicada en este proyecto
|
||||
|
||||
Para cada ventana temporal:
|
||||
|
||||
1. **TRAIN**
|
||||
- Periodo fijo de entrenamiento
|
||||
- Optimización por grid search
|
||||
- Selección de parámetros según métrica objetivo (Sharpe Ratio)
|
||||
|
||||
2. **TEST (Out-of-Sample)**
|
||||
- Backtest con los mejores parámetros del TRAIN
|
||||
- Sin reoptimización
|
||||
- Métricas registradas de forma independiente
|
||||
|
||||
3. **Desplazamiento**
|
||||
- La ventana avanza en el tiempo
|
||||
- Se repite el proceso hasta agotar los datos
|
||||
|
||||
---
|
||||
|
||||
### ⏱️ Configuración utilizada
|
||||
|
||||
- **Activo:** BTC/USDT
|
||||
- **Timeframe:** 1h
|
||||
- **Ventana TRAIN:** 365 días
|
||||
- **Ventana TEST:** 90 días
|
||||
- **Step:** 90 días
|
||||
- **Capital inicial:** $10,000
|
||||
- **Comisión:** 0.1%
|
||||
- **Slippage:** 0.05%
|
||||
|
||||
**Estrategia base:**
|
||||
- Moving Average Crossover
|
||||
- Filtro de tendencia con ADX
|
||||
|
||||
---
|
||||
|
||||
### 📊 Resultados por ventana (TEST – Out-of-Sample)
|
||||
|
||||
| Window | Return % | Sharpe | Max DD % | Trades | Parámetros |
|
||||
|------|----------|--------|----------|--------|------------|
|
||||
| 1 | +38.00 | 0.75 | -11.93 | 3 | MA(15/50) + ADX 25 |
|
||||
| 2 | +3.62 | 0.10 | -23.67 | 2 | MA(15/50) + ADX 30 |
|
||||
| 3 | +8.54 | 0.22 | -10.28 | 2 | MA(15/50) + ADX 30 |
|
||||
| 4 | 0.00 | 0.00 | 0.00 | 0 | Sin trades |
|
||||
| 5 | +9.71 | 0.26 | -10.57 | 2 | MA(15/50) + ADX 30 |
|
||||
| 6 | 0.00 | 0.00 | 0.00 | 0 | Sin trades |
|
||||
| 7 | -2.25 | -0.06 | -12.42 | 2 | MA(15/50) + ADX 30 |
|
||||
| 8 | -2.27 | -0.13 | -5.46 | 2 | MA(15/30) + ADX 30 |
|
||||
|
||||
---
|
||||
|
||||
### 📈 Métricas agregadas (Out-of-Sample)
|
||||
|
||||
- **Ventanas evaluadas:** 8
|
||||
- **Retorno medio:** +6.92%
|
||||
- **Sharpe medio:** 0.14
|
||||
- **Max Drawdown medio:** -9.29%
|
||||
|
||||
---
|
||||
|
||||
### 🧩 Interpretación de resultados
|
||||
|
||||
- La estrategia **no es sobreoptimizada**
|
||||
- Existen ventanas sin operaciones → el sistema sabe **no operar**
|
||||
- Las pérdidas están **controladas**
|
||||
- No hay colapsos en mercados adversos
|
||||
- El rendimiento depende claramente del régimen de mercado
|
||||
|
||||
Este comportamiento es consistente con una estrategia:
|
||||
- Tendencial
|
||||
- Conservadora
|
||||
- Apta para mejoras vía *position sizing* y *portfolio diversification*
|
||||
|
||||
---
|
||||
|
||||
### ✅ Decisiones tomadas tras Walk-Forward
|
||||
|
||||
1. **NO modificar la lógica de entrada**
|
||||
2. **NO optimizar más los parámetros base**
|
||||
3. Mantener el filtro ADX como componente estructural
|
||||
4. Avanzar hacia mejoras de:
|
||||
- Position sizing
|
||||
- Stops dinámicos
|
||||
- Portfolio multi-asset
|
||||
|
||||
El walk-forward valida que la señal base es **estable y explotable**, aunque no espectacular por sí sola.
|
||||
|
||||
## 🔄 Próximos Pasos
|
||||
|
||||
Después del backtesting:
|
||||
|
||||
Reference in New Issue
Block a user