Ejercicio: Los Eventos Imposibles del S&P 500
Objetivo
- Demostrar que los retornos financieros NO siguen una distribución normal
- Aprender a detectar y estimar fat tails en datos reales
- Entender qué hacer cuando confirmamos fat tails
Contexto Teórico
La Hipótesis de Mercados Eficientes y Normalidad
Durante décadas, la teoría financiera asumió que los retornos de acciones siguen una distribución normal (o log-normal). Esta suposición es conveniente porque:
- La normal está completamente caracterizada por μ y σ
- El TLC sugiere que sumas de muchos factores → normal
- Permite fórmulas cerradas (Black-Scholes, VaR, etc.)
El Problema
Si los retornos fueran normales:
| Evento | Probabilidad | Frecuencia esperada |
|---|---|---|
| > 3σ | 0.27% | 1 vez cada ~370 días (~1.5 años) |
| > 4σ | 0.006% | 1 vez cada ~15,800 días (~63 años) |
| > 5σ | 0.00006% | 1 vez cada ~1.7 millones de días (~6,900 años) |
| > 6σ | 2×10⁻⁷% | 1 vez cada ~500 millones de días (~1.4 millones de años) |
Un evento de 6σ debería ocurrir aproximadamente una vez desde que existían los dinosaurios.
La Realidad
El Lunes Negro (19 de octubre de 1987), el S&P 500 cayó 22.6% en un solo día. Con la volatilidad histórica de ~1% diario, esto es un evento de aproximadamente 20-25 sigmas.
La probabilidad de un evento de 20σ en una distribución normal es aproximadamente $10^{-88}$. Para contexto, hay aproximadamente $10^{80}$ átomos en el universo observable.
O los modelos están mal, o presenciamos un milagro estadístico.
Metodología: Paso a Paso
PASO 1: Obtener y Preparar Datos
# Descargar datos
data = yf.download("^GSPC", start="1950-01-01")
returns = np.log(data['Close'] / data['Close'].shift(1))
PASO 2: Diagnósticos Visuales
El script genera automáticamente:
-
Histograma vs Normal (
sp500_histograma.png)- Ver si las colas reales son más pesadas
-
QQ-Plot (
sp500_qqplot.png)- Línea recta = normal
- Curvatura en extremos = fat tails
-
Diagnósticos de Fat Tails (
sp500_fattails_diagnosticos.png)- Log-log survival plot
- Estimador de Hill vs k
- Evolución de κ
- Mean excess function
PASO 3: Estimación de α (Índice de Cola)
El script calcula:
α_hill = hill_estimator(returns) # Típicamente α ≈ 3 para S&P500
Interpretación:
- α > 4: Casi normal (improbable para retornos)
- 2 < α ≤ 4: Varianza finita, kurtosis infinita ← típico de acciones
- α ≤ 2: Varianza infinita (extremo)
PASO 4: Contar Eventos Extremos
Para cada umbral (3σ, 4σ, 5σ, 6σ):
- Contar días con retorno más extremo
- Comparar con expectativa normal
- Calcular ratio de subestimación
PASO 5: Identificar Cisnes Negros
- Listar los 20-25 eventos más extremos
- Calcular cuántos sigmas representa cada uno
- Investigar qué pasó esos días
Lo Que Harás
Parte A: Ejecutar Diagnósticos
- Correr el script y examinar las gráficas generadas
- Verificar que el QQ-plot muestra curvatura
- Confirmar que el log-log plot es aproximadamente lineal
Parte B: Interpretar Resultados
Llenar esta tabla con los resultados del script:
| Diagnóstico | Valor | Interpretación |
|---|---|---|
| α̂ (Hill) | ≈ ? | ¿Varianza finita? ¿Kurtosis finita? |
| κ (Taleb) | ≈ ? | ¿El máximo domina la suma? |
| Eventos >4σ observados/esperados | ? | ¿Cuántas veces subestima Normal? |
| Test Jarque-Bera p-value | ? | ¿Rechazamos normalidad? |
Parte C: Investigar Cisnes Negros
Para los 5 eventos más extremos, investigar:
| Fecha | Retorno | Sigmas | ¿Qué pasó? |
|---|---|---|---|
| 1987-10-19 | -22.6% | ~22σ | Lunes Negro: pánico, trading automático |
| … | … | … | (investigar) |
¿Qué Hacer con estos Resultados?
Si α ≈ 3 (típico para acciones):
- Varianza es finita pero puede ser inestable
- Kurtosis es infinita → intervalos de confianza normales son incorrectos
- TLC converge muy lento → necesitarías ~10⁶ datos para normalidad
Acciones Concretas:
| Antes (asumiendo Normal) | Después (sabiendo Fat Tails) |
|---|---|
| Usar media como estimador | Usar mediana |
| IC = ±1.96σ | Usar bootstrap o cuantiles empíricos |
| VaR paramétrico | VaR histórico o EVT |
| Riesgo = σ² | Usar Expected Shortfall |
| Diversificar linealmente | Considerar correlación de colas |
Código para Adaptaciones:
# En lugar de media y desv est:
centro = np.median(returns)
dispersion = scipy.stats.median_abs_deviation(returns)
# En lugar de IC normal:
from scipy.stats import bootstrap
result = bootstrap((returns,), np.median, confidence_level=0.95)
# VaR histórico en lugar de paramétrico:
VaR_95 = -np.percentile(returns, 5)
VaR_99 = -np.percentile(returns, 1)
# Expected Shortfall:
ES_95 = -returns[returns < -VaR_95].mean()
Preguntas de Reflexión
-
¿Cuántos eventos “imposibles” encontraste? ¿Cuántos de ellos ocurrieron en tu vida?
-
Con α ≈ 3, ¿qué significa esto para la estimación de riesgo? ¿Puedes confiar en la varianza muestral?
-
¿Por qué el estimador de Hill se calcula solo con las observaciones más extremas? ¿Qué pasaría si usaras todos los datos?
-
Si trabajaras en un banco, ¿cómo explicarías a tu jefe que el VaR normal subestima el riesgo ~100x?
-
Investiga el Lunes Negro (1987). ¿Qué lo causó? ¿Podría pasar de nuevo?
Extensiones Sugeridas
-
Otros activos: Repite con Bitcoin (
BTC-USD), oro (GC=F), o TSLA- ¿Tienen α mayor o menor que el S&P 500?
-
Estimar α para diferentes períodos:
- ¿Ha cambiado α con el tiempo?
- ¿Es diferente en bull markets vs bear markets?
-
Comparar métodos de VaR:
- Calcular VaR normal, histórico, y EVT
- Hacer backtesting: ¿cuál viola menos?
-
Simular el impacto:
- Genera 10,000 años de datos con α=3 (Pareto)
- ¿Cuántos “Lunes Negros” ocurren?
Ejecutar
cd clase/05_probabilidad/ejercicios
source .venv/bin/activate
python ejercicio_sp500.py
El script generará:
- Diagnósticos de fat tails con α̂ y κ
- Tabla de eventos esperados vs observados
- Lista de los eventos más extremos con fechas
- 4 gráficas en
outputs/:sp500_histograma.pngsp500_qqplot.pngsp500_eventos_tiempo.pngsp500_fattails_diagnosticos.png