Modelos de varianza

Promedios móviles, EWMA, EWMA calibrado y ARCH/GARCH, evaluados fuera de muestra

Autores/as

Santiago Álvarez Tostado Estrada

Francisco Uriel Ledezma Chávez

Jorge Isaac López Ávila

Juan Pablo Morán Errejón

Fecha de publicación

21 de septiembre de 2026

Fuente de datos
Yahoo Finance / BMV
Corte financiero
31 de diciembre de 2025
Moneda
Rendimientos y volatilidad en escala decimal
Periodo cubierto
27 de febrero de 2006–26 de agosto de 2026

1 Introducción

ImportantePendiente de redacción

Qué se estima, con qué información y cómo se compara.

2 Metodología

Cuatro estimadores de la misma cantidad, ordenados por cuánta estructura suponen:

\[ \text{MA}(m):\quad \hat\sigma^2_t = \frac{1}{m}\sum_{i=1}^{m} r^2_{t-i} \]

\[ \text{EWMA}:\quad \hat\sigma^2_t = \lambda\,\hat\sigma^2_{t-1} + (1-\lambda)\,r^2_{t-1} \]

\[ \text{GARCH}(p,q):\quad \sigma^2_t = \omega + \sum_{i=1}^{q}\alpha_i r^2_{t-i} + \sum_{j=1}^{p}\beta_j \sigma^2_{t-j} \]

Los cuatro estiman la varianza a partir de rendimientos al cuadrado y no de desviaciones respecto de una media móvil. A frecuencia diaria la media es indistinguible de cero —la etapa 03 lo contrasta directamente— y restar una estimación ruidosa de ella agrega varianza al estimador sin eliminar sesgo.

Toda estimación en \(t\) usa información hasta \(t-1\). Los parámetros se estiman con datos hasta el 31 de diciembre de 2025 y se evalúan sobre 2026.

3 Promedios móviles

La Figura 1 compara la respuesta de las distintas ventanas móviles.

Ver código
ma <- ma_volatility_grid(estimation$log_return)
ma_long <- do.call(rbind, lapply(colnames(ma), function(column) {
  data.frame(
    date = estimation$date,
    ventana = column,
    sigma = ma[, column],
    stringsAsFactors = FALSE
  )
}))
ma_long <- ma_long[is.finite(ma_long$sigma), ]

ggplot(ma_long, aes(date, sigma, colour = ventana)) +
  geom_line(linewidth = 0.4) +
  scale_y_continuous(labels = label_percent(accuracy = 0.1)) +
  labs(x = NULL, y = "Volatilidad diaria estimada")
Volatilidad estimada con distintas ventanas móviles.
Figura 1: Volatilidad estimada con distintas ventanas móviles.
ImportantePendiente de redacción

Selección de \(m\) con criterio de ajuste y capacidad predictiva, e interpretación de cómo cambia la estimación conforme se amplía la ventana.

4 EWMA

La Figura 2 muestra la trayectoria estimada con el factor de RiskMetrics.

Ver código
lambda_rm <- params()$variance$ewma$lambda_riskmetrics
estimation$ewma <- ewma_volatility(estimation$log_return, lambda = lambda_rm)

ggplot(estimation[is.finite(estimation$ewma), ], aes(date, ewma)) +
  geom_line(colour = RISK_PALETTE[1], linewidth = 0.4) +
  scale_y_continuous(labels = label_percent(accuracy = 0.1)) +
  labs(x = NULL, y = "Volatilidad diaria estimada")
EWMA con el factor de decaimiento de RiskMetrics.
Figura 2: EWMA con el factor de decaimiento de RiskMetrics.

5 EWMA calibrado con los datos

La Tabla 1 compara los parámetros seleccionados por cada criterio.

Ver código
fit_rmse <- ewma_fit_lambda(estimation$log_return, loss = "rmse")
fit_ll <- ewma_fit_lambda(estimation$log_return, loss = "loglik")

report_table(
  data.frame(
    criterio = c("RMSE", "Log-verosimilitud"),
    lambda = c(fit_rmse$lambda, fit_ll$lambda),
    alpha = c(fit_rmse$alpha, fit_ll$alpha)
  ),
  caption = "Factor de decaimiento seleccionado bajo cada criterio."
)
Tabla 1: Factor de decaimiento seleccionado bajo cada criterio.
Criterio Lambda Alfa
RMSE 0.995 0.005
Log-verosimilitud 0.985 0.015
ImportantePendiente de redacción

Justificación de \(\lambda\) y comparación de la velocidad de respuesta frente a los promedios móviles. Si los dos criterios discrepan, la discrepancia es informativa: el RMSE es simétrico, la verosimilitud penaliza mucho más subestimar la volatilidad que sobreestimarla.

6 ARCH / GARCH

Ver código
garch <- fit_garch(estimation$log_return)
report_table(garch$selection, caption = "Tabla de selección de órdenes.")
ImportantePendiente de redacción

Identificación del modelo, justificación del orden seleccionado e interpretación de los coeficientes: persistencia \(\alpha + \beta\), velocidad de reversión y significado de una persistencia cercana a uno.

Activar el chunk anterior cuando rugarch esté instalado (renv::restore()).

7 Evaluación fuera de muestra

Ver código
realised <- realised_volatility(evaluation$log_return)

scores <- rbind(
  score_volatility(ma_oos, realised, "MA(m*)"),
  score_volatility(ewma_oos, realised, "EWMA"),
  score_volatility(ewma_fit_oos, realised, "EWMA calibrado"),
  score_volatility(garch_oos, realised, "GARCH")
)
report_table(scores, caption = "Desempeño fuera de muestra, 2026.")
ImportantePendiente de redacción

Construir las series fuera de muestra de cada modelo y compararlas contra la volatilidad realizada. Responder de forma argumentada:

  • ¿Qué modelo captura mejor los periodos de alta volatilidad?
  • ¿Cuál reacciona más rápido a los cambios de mercado?
  • ¿Cuál es más estable en sus estimaciones?
  • ¿Cuál tiende a sobreestimar y cuál a subestimar?

8 Conclusión

ImportantePendiente de redacción

Comparación general y, desde una perspectiva financiera, qué modelo se usaría y por qué.

9 Referencias