Forum Sign in Register

Pronóstico de Volatilidad en R con rugarch: Modelos GARCH, Colas Gordas y Backtests de VaR Rodantes

Started by Support 1 week ago · 0 replies RSS

Los pronósticos de dirección del precio se llevan toda la atención, pero la magnitud que un gestor de riesgo necesita pronosticar de verdad es la volatilidad — y la volatilidad, a diferencia de la dirección, sí es genuinamente predecible. La volatilidad se agrupa: a los días turbulentos les siguen días turbulentos y a la calma le sigue calma. La familia de modelos GARCH formaliza ese agrupamiento, y el paquete rugarch es la forma estándar y curtida de ajustar estos modelos en R. En este artículo recorremos el flujo completo: especificar, ajustar, diagnosticar y pronosticar.

Por qué GARCH

Una desviación típica móvil pondera por igual los últimos N días y reacciona tarde. Un GARCH(1,1) dice, en cambio, que la varianza de hoy es una mezcla ponderada de tres ingredientes: una base de largo plazo, el shock al cuadrado de ayer (el término ARCH — las noticias) y la varianza de ayer (el término GARCH — la persistencia). Ajustado a casi cualquier mercado líquido, la persistencia sale alta: los shocks de volatilidad se disipan despacio, que es exactamente el agrupamiento que se ve en el gráfico. De ahí salen pronósticos de varianza a uno y varios pasos que se adaptan a los cambios de régimen mucho más rápido que cualquier ventana fija.

Usos que le importan a un trader: volatility targeting (escalar el tamaño de la posición de forma inversa a la volatilidad prevista), colocación de stops tipo ATR con una medida prospectiva, estimación del Value-at-Risk y filtros de régimen que apagan estrategias cuando se pronostica turbulencia.

El flujo de trabajo con rugarch

rugarch divide el trabajo en dos:
ugarchspec()
describe el modelo y
ugarchfit()
lo estima.


library(rugarch)
library(quantmod)

getSymbols("SPY", from = "2020-01-01")
r <- na.omit(diff(log(Cl(SPY)))) # retornos logaritmicos diarios

spec <- ugarchspec(
variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(0, 0), include.mean = TRUE),
distribution.model = "std" # errores t de Student: colas gordas
)

fit <- ugarchfit(spec, data = r)
show(fit) # coeficientes + diagnosticos


Tres decisiones de especificación cargan con casi todo el peso:

  • La distribución. Los retornos financieros tienen colas gordas; los errores gaussianos subestiman el riesgo de cola. Use
    "std"
    (t de Student) o
    "sstd"
    (t asimétrica) — el parámetro de forma ajustado suele caer entre 4 y 8, lejísimos de la normal.
  • La asimetría. En renta variable, las caídas elevan la volatilidad más que las subidas del mismo tamaño (efecto apalancamiento). El sGARCH simple lo ignora; cambie el modelo a
    "gjrGARCH"
    o
    "eGARCH"
    y compruebe si el término de asimetría es significativo. En divisas el efecto suele ser más débil.
  • El modelo de la media. Con datos diarios, una media constante (o ninguna) casi siempre basta. Meter un ARMA grande en la ecuación de la media añade sobre todo parámetros para sobreajustar.


Diagnostique antes de fiarse

Un ajuste GARCH solo sirve si ha absorbido el agrupamiento de volatilidad. La salida de
show(fit)
incluye tests de Ljung-Box sobre los residuos estandarizados y sus cuadrados — el test sobre los cuadrados es el que importa: si sigue rechazando, queda estructura que el modelo no capturó. Revise también
persistence(fit)
: valores muy cercanos a 1 significan que los shocks tardan meses en disiparse, y por encima de 1 el modelo es explosivo y sus pronósticos, basura.

Pronóstico y validación rodante


fc <- ugarchforecast(fit, n.ahead = 10)
sigma(fc) # volatilidad prevista, 10 dias

roll <- ugarchroll(spec, data = r, n.start = 1000,
refit.every = 25, refit.window = "moving",
VaR.alpha = 0.05)
report(roll, type = "VaR") # backtest de Kupiec/Christoffersen


ugarchroll
es la prueba honesta: reajusta el modelo sobre una ventana móvil y produce pronósticos de volatilidad y VaR genuinamente fuera de muestra; el informe comprueba después si su VaR al 5% se violó de verdad alrededor del 5% de las veces. Un modelo que pasa esto sobre varios años de datos es un modelo con el que se puede dimensionar posiciones.

Trampas habituales

  • Ajuste sobre retornos logarítmicos, no sobre precios, y cuide la escala: retornos en decimales o en porcentaje cambian la magnitud de los coeficientes, así que sea consistente.
  • GARCH pronostica la magnitud de los movimientos, no su dirección. Es un modelo de riesgo, no un modelo de alfa.
  • Reajuste con regularidad. Los parámetros derivan con los regímenes; un ajuste de hace dos años valora mal, en silencio, el riesgo de hoy.
  • Los avisos de convergencia van en serio: con muestras cortas o variantes exóticas, compruebe
    convergence(fit) == 0
    antes de usar nada aguas abajo.


En resumen

La volatilidad es la magnitud más pronosticable de las finanzas, y rugarch pone en manos del usuario de R el equipo profesional completo: distribuciones de colas gordas, variantes asimétricas, pronósticos multi-paso limpios y backtests de VaR rodantes. Ajuste un GJR-GARCH(1,1) con errores t a su mercado, verifique los diagnósticos de residuos, y tendrá una medida de riesgo prospectiva que supera a cualquier ventana móvil — para dimensionar posiciones, colocar stops y saber cuándo quedarse fuera.

Sign in to reply.