Framework completo de VaR y backtesting sobre ^GSPC
A continuación tienes el workflow completo implementado (1928–2026 aprox.) con precios diarios de ^GSPC
desde yfinance, cuatro modelos de VaR y toda la batería de tests que
pediste. Te dejo primero los enlaces a resultados y luego la
interpretación paso a paso.
1. Outputs y descarga de resultados
1.1. Datos y tablas principales
-
Dataset completo de backtesting (returns + VaR + excepciones) Download file Download file
-
Summary report (todos los modelos, 95% y 99%) Download file Download file
-
Time Between Failures (TBF) para todos los modelos y niveles Download file Download file
-
Comparación de modelos (99% VaR, p‑values, etc.) Download file Download file
1.2. Gráficos interactivos (HTML)
GRÁFICO 1 — PRICE HISTORY
GRÁFICO 2 — RETURN SERIES
GRÁFICO 3 — VaR COMPARISON (99%)
GRÁFICOS 4–7 — BACKTEST VISUAL 99% (breaches)
-
Historical VaR 99%
-
Gaussian VaR 99%
-
EWMA VaR 99%
-
GARCH VaR 99%
GRÁFICO 8 — MODEL COMPARISON (99%)
GRÁFICO 9 — RETURN DISTRIBUTION
GRÁFICO 10 — QQ PLOT
GRÁFICO 11 — STRESS PERIOD ANALYSIS
2. Resumen ejecutivo de resultados clave
2.1. Universo de datos
- Total de returns diarios: 24 704
- Ventana de test (después de 250 días de estimación): 24 454 observaciones
2.2. Distribución de retornos
- Skewness: −0.47 (ligera asimetría a la izquierda).
- Exceso de kurtosis: 18.75 (colas muy gruesas comparado con normal, que tiene 0).
Implicación: el supuesto de normalidad es muy pobre para la cola izquierda del S&P 500; esto ya anticipa problemas para Gaussian VaR y, en parte, para modelos que sólo ajustan varianza.
3. Resultados de VaR y backtesting (99%)
Me centro en 99% (nivel regulatorio típico). Del summary_99 tenemos:
| Modelo | N | Excepciones | Esperadas | Obs/Exp | Kupiec p‑val | CC p‑val | Basel TL |
|---|---|---|---|---|---|---|---|
| Historical | 24 454 | 400 | 244.54 | 1.64 | 5.6e−20 | 1.18e−30 | yellow |
| Gaussian | 24 454 | 529 | 244.54 | 2.16 | 1.7e−56 | 6.3e−74 | yellow |
| EWMA | 24 454 | 509 | 244.54 | 2.08 | 8.0e−50 | 4.4e−53 | yellow |
| GARCH | 24 454 | 476 | 244.54 | 1.95 | 1.4e−39 | 5.1e−43 | yellow |
Interpretación:
- Todos los modelos subestiman el riesgo: el número de excepciones es entre 1.6 y 2.2 veces lo esperado.
- Kupiec (POF): p‑values extremadamente bajos → cobertura inadecuada (rechazo al 5%) para todos.
- Independencia y cobertura condicional (CC): p‑values aún más bajos → las excepciones están clusterizadas y el modelo no captura bien la dinámica de estrés.
- Basel Traffic Light (escalado para 24k días): todos en amarillo. En la práctica, con este N no estás en zona “verde” para ningún modelo; hay demasiados fallos.
Ranking cualitativo dentro de lo malo (99%):
- Historical VaR: menor número de excepciones (400) y menor LR_CC → es el “menos malo”.
- GARCH VaR: algo peor que Historical, pero mejor que Gaussian y EWMA.
- EWMA VaR.
- Gaussian VaR: el peor; asume normalidad y claramente infravalora colas.
4. Time Between Failures (TBF) — clustering temporal
De la tabla tbf_99:
| Modelo | Mean TBF | Median TBF | Min | Max |
|---|---|---|---|---|
| Historical | 60.5 | 20 | 1 | 430 |
| Gaussian | 46.0 | 13 | 1 | 678 |
| EWMA | 47.9 | 34 | 1 | 371 |
| GARCH | 51.3 | 20 | 1 | 950 |
Comentarios:
- Min TBF = 1 para todos → hay días consecutivos con excepciones, claro indicio de clustering de pérdidas.
- Medianas relativamente bajas (13–34 días) y máximos muy grandes → largos periodos sin fallos seguidos de rafagas de excepciones.
- Esto es coherente con:
- Alta volatilidad en crisis.
- Rechazo del test de independencia de Christoffersen en todos los modelos.
5. Tests estadísticos: Kupiec, Christoffersen, cobertura condicional
5.1. Kupiec POF (proportion of failures)
- El test contrasta la proporción observada de excepciones con la esperada (α=0.01).
- Para todos los modelos, p‑values entre 1e−20 y 1e−56: ⇒ rechazo claro de la hipótesis de correcta cobertura. El VaR está demasiado bajo: caídas grandes ocurren más a menudo de lo que el VaR sugiere.
5.2. Test de independencia de Christoffersen
- Todos los modelos tienen p‑values muy pequeños (p.ej. Historical ~1.9e−13).
- Implica que las excepciones no son independientes en el tiempo; se agrupan en períodos de estrés.
- Esto es cierto incluso para GARCH y EWMA, que modelan volatilidad condicional: capturan parte de la dinámica, pero no suficiente para el estándar del test.
5.3. Cobertura condicional (CC)
- LR_CC = LR_POF + LR_Ind, con p‑values minúsculos.
- Resultado: ningún modelo pasa el test de cobertura condicional al 5%.
6. Traffic Light Test (Basel)
Los colores reportados para 99%:
- Historical: yellow
- Gaussian: yellow
- EWMA: yellow
- GARCH: yellow
Dado el enorme horizonte (24 mil días) se escaló el umbral de Basel (pensado para 250 días) proporcionalmente. Resultado:
- No hay modelo en verde (ninguno en línea con el benchmark regulatorio de excepciones).
- Tampoco en rojo extremo con este escalado, pero sí consistentemente por encima de las excepciones esperadas.
Como benchmark de producción, esto sugiere que habría que:
- Ajustar modelos (p.ej. distribuciones con colas gruesas, Student‑t, EVT).
- O trabajar con mayores horizontes/ventanas específicas por régimen.
7. Análisis de distribución y periodos de estrés
7.1. Histograma y QQ plot
- GRÁFICO 9 muestra:
- Histograma de retornos con una normal ajustada.
- Claramente más densidad en colas que en la normal.
- GRÁFICO 10 (QQ plot):
- Los puntos en colas se desvían fuertemente de la línea de 45°, otra evidencia de fat tails.
Conclusión: el supuesto de normalidad de Gaussian VaR (y usar sólo sigma) es demasiado restrictivo para el S&P 500 en largo plazo.
7.2. Stress Period Analysis
- GRÁFICO 11 marca los 10 peores días de rentabilidad sobre el panel de VaR 99% de todos los modelos.
- En esos días extremos:
- Las pérdidas reales suelen superar el VaR de varios modelos.
- Se ve cómo Historical ajusta más rápidamente tras episodios extremos que Gaussian (anclado por la normalidad).
8. Validaciones del framework
Las validaciones que pediste se han comprobado en código:
- VaR siempre no negativo: se fuerza
max(0, VaR)si por numerics salen negativos. - Fechas alineadas:
prices,returns, VaR y flags de excepción comparten index temporal. - Returns limpios: sin NaNs en la ventana de test.
- Excepciones correctas:
Exception = Return < -VaR(VaR definido como número positivo de pérdidas). - Ventanas rolling correctas:
- Estimation window: 250 días.
- Test window: resto (24 454 observaciones).
- GARCH(1,1):
- Ajustado sobre los primeros 250 días y luego se hace forecast recursivo de varianza condicional.
9. Cómo usar este framework / siguientes pasos
Tienes ya un framework completo y replicable:
-
Descarga de mercado y generación de returns Ya implementado para
^GSPCcon log‑returns diarios. -
Estimación multi‑modelo de VaR
- Historical (rolling quantiles).
- Gaussian (media + sigma rolling, normal).
- EWMA (lambda = 0.94).
- GARCH(1,1) con innovaciones normales.
-
Backtesting y análisis de excepciones
- Flags de excepciones por modelo y nivel.
- Visualización de breaches (GRÁFICOS 4–7).
- Cálculo de estadísticas de fallos, TBF, etc.
-
Tests estadísticos de validación
- Kupiec POF.
- Christoffersen (independencia).
- Cobertura condicional.
- Basel Traffic Light (99%).
-
Análisis de stress y de distribución
- Confirmación de colas gruesas.
- Identificación y visualización de crisis.
10. Recomendaciones técnicas
- Model risk: dado el exceso de kurtosis y la mala performance en tests, para producción te recomendaría:
- VaR con innovaciones Student‑t en el GARCH.
- O enfoques basados en EVT (Extreme Value Theory) para la cola izquierda.
- Horizonte temporal:
- Puedes replicar exactamente el flujo con submuestras (ej. 1980–hoy, 2000–hoy) para ver estabilidad por régimen.
- Extensión a portafolios:
- Reemplazar
^GSPCpor una cartera (con pesos + matriz de series) manteniendo el mismo pipeline.
- Reemplazar
11. ¿Qué puedes hacer ahora?
Si quieres, en el siguiente paso puedo:
- Extraer y mostrarte, dentro del notebook, código Python limpio en formato de función/clase para que lo copies tal cual en tu entorno (sin tocar nada de datos ni resultados).
- O adaptar el framework a:
- Otro activo o conjunto de activos.
- Otro horizonte temporal.
- Otros modelos (Student‑t, EVT, Cornish‑Fisher, etc.).
Indica simplemente qué te interesa (por ejemplo: “genérame el script
limpio en Python con todo el workflow para usarlo en mi entorno”).

