Cómo predecir arma-garch usando el lenguaje R
Este artículo explicará los diferentes modelos de series temporales financieras univariadas y multivariadas, concretamente la media condicional, la matriz de covarianza condicional y los modelos de volatilidad.
Modelo de valor medio
Esta sección analiza el modelo de media condicional.
Modelo Iid
Comencemos con un modelo Iid simple. El modelo Iid supone que el retorno logarítmico xt es una serie temporal gaussiana de n dimensiones:
Los estimadores muestrales de la matriz de media y covarianza son, respectivamente, la media muestral.
Y la matriz de covarianza de la muestra.
Comenzamos generando datos, familiarizándonos con el proceso y asegurándonos de que el proceso de estimación dé resultados correctos (es decir, controles de cordura). Luego utilice datos reales del mercado para ajustarlos a diferentes modelos.
Generemos datos iid sintéticos y estimemos las matrices de media y covarianza:
#Generemos datos integrales de ingresos Observación para hacerlo de nuevo:
#Primero generemos todos data x
Plot (t_sweep, error_sigma_vs_tmain = "Error en la estimación de sigma", ylab = "Error".
Modelo ARMA univariado
ARMA(p, q ) El retorno logarítmico del modelo xt es
donde wt es cero, una secuencia de ruido blanco con varianza σ2. Son los parámetros del modelo I, θi y la varianza del ruido
. que el modelo ARIMA (p, d, q) es un modelo ARMA con diferencias de tiempo de orden d (p, q). Entonces, si reemplazamos el precio logarítmico con Profit, ¿Rugarch genera datos?
Utilizaremos el paquete rugarch para generar datos ARMA univariados, estimar parámetros y hacer predicciones.
Primero, debemos definir el modelo:
# Especificar. un modelo AR(1) con los coeficientes y parámetros dados # ># & gt*-* # & gt;* ? ¿Especificación del modelo ARFIMA? ?:ARFIMA(1,0,0)#>Incluir media: VERDADERO#>#>Distribución condicional#>-#>Problema:? norma # & gt incluir sesgo: ? FALSO # & gt incluir Lambda ? gt ? nivel fijo incluye estimación LB UB # >mu 1? 10na NA # >; -0.90 1?10na na #>ma 0.00 0?0 0 na na #>alfima 0.00 0?0 0 na na #>archm 0.00 0?0 0 na na #>mxreg 0.00 0? 0 0 NA NA # > Sigma 0.20 10 NA NA # > Alfa 0.00 0? ? 0 0 NA NA # > ;eta1?0.00 0?0 0 NA NA #>eta2?0.00 0?0 0 NA NA #>delta 0.00 0?0 0 NA NA #>λ0.00 0?0 0 NA NA # >vxreg 0.00 0? 0 0 NA NA # > ¿sesgado? 0.00 0 ?0 0 NA NA #>forma 0.00 0?0 0 NA NA #>glambda? 0.00 0 ?0 0 NA NA # >xi 0.00 0?0 0 NA NA fijo.pars# >$ mu # & gt[1] 0.01# ># & gt$ ar 1 # >[1] -0.9# ># > $ sigma #>[1]0.2 true_params # >Mu? ar1sigma#>? 0.01 -0.90 ?0.20
Luego, podemos generar una serie de tiempo:
#Simular una ruta apath(spec, n.sim = T)#) #Convertirla a xts Y plot Plot (synth_log_returns, main = "Retornos logarítmicos del modelo ARMA" Plot (synth_log_prices, main = "Precios logarítmicos del modelo ARMA").
Modelo ARMA
Ahora podemos estimar los parámetros (que ya conocemos):
#Especificar el modelo AR(1) ARIMASPEC(average. model = lista (orden ARMA = c (1, 0), inclusive. media = verdadero)) #Modelo de estimación# >? ¿Mu? ar1sigma#>? 0.0083 ?-0.8887 ?0.1987 #>Mu? ar1sigma#>? 0.01 -0.90 ?0.20
También podemos estudiar el impacto del tamaño de muestra t en el error de estimación de parámetros:
# loop for (T_ in T_sweep) {? estim_coeffs_vs_T<-rbind(estim_coeffs_vs_T, coef(arma_fit))? error_coeffs_vs_T<-rbind(error_coeffs_vs_t,ABS(coef(ARMA_fit)-true_params)/true_params)# Trazado de tapete de dibujo(T_sweep,estim_coeffs _ vs _ t, main = "coeficiente ARMA estimado", xlab = "T", ylab =
Matplot (t _ barrido, 100 * error _ coeffs _ vs _ t, main = "coeficiente ARMA estimado "Error relativo de Después de eso, los otros coeficientes están bien estimados.
Predicciones ARMA
Para comprobar la cordura, ahora compararemos las predicciones de Rugach:
#Especificar las especificaciones del modelo AR(1) (media. modelo = lista (orden ARMA = c (1, 0). ), inclusive. media = verdadero), fijo Pars = lista (mu = 0.005, Ar1 = -0.9, sigma = 0.1)) #Generar secuencia arfima(arma_fixed_spec, n. sim = 1000) @ ruta $ seriessim #Especificar y ajustar. la especificación del modelo (media. modelo = lista (armaorder = c (1, 0) , contiene. media = verdadero)) # Utilice el paquete "predecir" para ajustarse al modelo # > media distinta de cero ARIMA(1, 0, 0 # > # & coeficientes gt: # & gt?ar1 media # >?-0.8982 ?0.0036# >s.e? 0.0139 gt?ar1interceptσ#>-0.898181148 ?0.003574781 ?0.100222964 resultado.
¿Selección del modelo ARMA?
En los experimentos anteriores, asumimos que se conocía el orden del modelo ARMA, es decir, p = 1, q = 0. De hecho, el orden es desconocido, por lo que se deben probar diferentes combinaciones de órdenes. Cuanto mayor sea el orden, mejor será el ajuste, pero esto conducirá inevitablemente a un sobreajuste. Se han desarrollado muchos métodos para penalizar el aumento de la complejidad para evitar el sobreajuste, como AIC, BIC, SIC, HQIC, etc.
#Pruebe diferentes combinaciones#Ver ranking# & gtAR MA promedio Convergencia BIC ARFIMA# >1 ?1 ?0 1 ?0 -0.38249098 1# >2 ?1 ?1 1 ?0-0.378831571 # > ; 3 ?2 ?0 1 ?0 -0.37736340 1# >4 ?1 ?2 1 ?0 -0.37503980 1# >5 ?2 ?1 1 ?0-0.37459177 1 # >;6 ?3 ?0 1 ?0- 0.37164609 1 # >7 ?1 ?3 1 ?0-0.37143480 1 # >8 ?2 ?2 1 ?0-0.37107841 1 # >9 ?3 ?1 1 ?0 -0.36795491 1# >10 ?2 ?0 -0.36732669 1# >11 ?3 ?2 1 ?0 -0.36379209 1# >12 ?3 ?3 1 ?0 -0.36058264 1# >13 ?0 ?3 1 ?0-0.11875575 1 # >;14 0 0 1 ?0
En este caso, dado que el número de observaciones T = 1000 es lo suficientemente grande, el orden se puede detectar correctamente. Por el contrario, si intenta utilizar T = 200, el orden detectado es p = 1, q = 3.
¿Predicción ARMA?
¿Una vez estimados los parámetros del modelo ARMA? ¿I? I y θ j, el modelo se puede utilizar para predecir valores futuros. Por ejemplo, la predicción de xt basada en información pasada es
y el error de predicción será x t-x t = wt (suponiendo que se hayan estimado los parámetros) y su varianza es σ2. ¿Paquete de software? ¿Rugach? Simplifica las predicciones sobre datos fuera de la muestra;
#Coef(ARMA_fit)#> del modelo estimado (excluyendo la muestra)#> ¿Mu? ar1sigma#>? 0.007212069 -0.898745183 ?0.200400119#Forecast _ log _ retornos para toda la muestra excepto los retornos logarítmicos;2012-01-04 1277.30 # >;2012-01-05 1281.06 # >;2012-01-06 1277.81 # >;2012 -01- 09 1280.70 # > 2012-01-101292.08 # Preparar datos de entrenamiento y prueba logreturns_trn
Ahora, usamos los datos de entrenamiento (es decir, para t = 1,…,Ttrnt=1,…,Ttrn) para ajustar diferentes modelos (tenga en cuenta que se indica que los datos fuera de la muestra están excluidos? out.sample = T_tst En particular, consideraremos modelos iid, modelos ar, modelos ARMA y algunos modelos ARCH y GARCH (estudiaremos más detalladamente el modelado de varianza más adelante). ).
#Coeficiente del modelo de diámetro interior de ajuste (iid_fit)#>? sigma # & gt0.0005712982 0.0073516993 mean(log devuelve _ trn)# & gt;[1]0.0005681388 SD(log devuelve _ trn)# & gt;[1]0.007360208 # Coef(AR _ FIT) se ajusta al modelo AR(1) #>mu? ar1sigma#>? 0.0005678014 -0.0220185181 ?0.0073532716# Coeficiente de ajuste del modelo ARMA(2,2) (ARMA_fit)#>Mu? ar1? ar2? ma1? ma2 sigma#>? 0.0007223304 ?0.0268612636 ?0.9095552008 -0.0832923604 -0.9328475211 ?0.0072573570# Montaje ARMA (1,1)+ARCH (1) modelo COEF(ARCH_FIT)#>Mu? ar1? ma 1ωα1 # >? 6.321441e-04?8.720929 e-02-9.391019e-02?4.898885e-05?9.986975e-02# Ajuste de los coeficientes del modelo ARMA(0,0)+ARCH(10) (long _ ARCH _ fit)# & gt ; ? ¿Mu omega? alfa1? alfa2? alfa3? alfa4? alfa 5 #>7.490786 e-04 2.452099 e-05 6.88561e-02 7.207551e-02 1.465438 e-09938 e-01.909541e-02 3.082806 e-02 #>? alfa6? alfa7? alfa8? alfa9? alfa 10 #>;4.026539 e-02 3.050040 e-07 9.260183 e-02 1.150128 e-01.1.068426 e-06 #Montaje ARMA(.Mu?ar1?ma 1ωα1β1 #>?6.660346e-04?9.664597 e-01 - 1.000000 e+00?7.066506e-06?1.257786e-01?7.470725e-01
Utilizamos diferentes modelos para predecir rendimientos logarítmicos:
#Preparar muestras de predicción Registrar rendimientos para salida Periodo #i.i.d Pronóstico de predicción del modelo (IID_FIT, n.ahead = 1, n.roll = t_TST-1)# AR(1) ¿Modelo a pronosticar (AR_FIT, N. forward = 1, N. Roll = t_tst-1)? )Dates_out_of_sample) # ARMA(2)2) Pronóstico por modelo (ARMA_fit, n. forward = 1, n . Roll = t _ tst-1)? Dates_out_of_sample)#Utilice el modelo ARMA (1, 1) + ARCH (1) para pronosticar (arch_fit, n. forward = 1, n. Roll = t_tst-65438.
Fechas _ fuera _ de _ muestra) # ARMA (0, 0) + ARCH (10) pronóstico del modelo (largo _ ARCH _ FIT, n.ahead = 1, n . roll = T _ tst-1) fechas _ fuera _ de _ sample)# ARMA(1, 1)+GARCH (1) Predicción del modelo (garch_fit, n.ahead
Podemos calcular los errores de predicción de diferentes modelos (dentro de la muestra y fuera de la muestra) :
print(error _ var)#>?En muestra fuera de muestra# >iid 5.417266e-05?8.975710e-05# >AR(1)? 9.006139e-05# >ARMA( 2,2)? 5.265204e-05? 1.353213e-04 # >ARMA(1, 1)+ARCH(1)5.415836 e-05? ? e-05# >ARMA(1,1) + GARCH(1,1) 5.339071e-05?9.244012e-05
Podemos observar que a medida que aumenta la complejidad del modelo, aumenta el error en la muestra. tiende a disminuir (debido a mayores grados de libertad al ajustar los datos), aunque la diferencia es insignificante. Lo importante en realidad es el error fuera de muestra: podemos ver que aumentar la complejidad del modelo puede conducir a resultados deficientes. en términos de rendimientos previstos En términos de errores, parece que el modelo iid más simple es suficiente
Finalmente, mostremos algunos gráficos de errores fuera de muestra:
Gráfico. (error, main = "Diferentes modelos. "Error fuera de muestra",
Tenga en cuenta que, dado que no reajustamos el modelo, el error aumentará a medida que avance el tiempo (especialmente para el modelado ARCH) .
Comparación de ventana de desplazamiento
Primero comparemos los conceptos de predicción estática y predicción continua a través de un ejemplo simple:
#ARMA(2,2) especificaciones del modelo
Podemos observar claramente el impacto del proceso de ventana móvil en las series temporales.
Ahora podemos rehacer todos los pronósticos para todos los modelos basados en la ventana móvil:
#Rolling ForecastRoll (IID _ spec, data = logreturns, n. forward = 1, Forecast. length = t _ t # ar (1) Pronóstico móvil basado en el modelo i.i.d roll(ar_spec, data = logreturns, N. forward = 1, Pronóstico. longitud = t _ tst, # ARMA (2, 2) modelo de pronóstico continuo (ARMA _ spec, datos = registro de retornos, n. adelante = 1, pronóstico. longitud = t _ tst, # ARMA (1, 1) + ARCH (1) Pronóstico móvil Roll (ARCH_SPEC, datos = REGISTRO DEVOLUCIONES, N. adelante = 1, pronóstico. longitud = T_TST,? Roll (long_arch_spec, datos = registro de retornos, n. adelante = 1, pronóstico. longitud = t _ tst) refinar cada modelo = 50, refinar.win # ARMA (0, 0) + arco (10), Refinar.
Cada = 50, # ARMA (1, 1) + GARCH (1, 1) modelo móvil de pronóstico móvil (GARCH_SPEC, datos = retornos de registro, n.ahead = 1, pronóstico.longitud = T_tst, refit.every = 50, refit. ventana
Echemos un vistazo al error de predicción en el caso de referencia móvil:
print(rolling_error_var)#>?In-sample out-of-sample# >iid 5.417266 e -05?8.974166e-05# >AR(1)? 5.414645e-05?9.038057e-05# >ARMA(2,2)? 5.265204e-05?8.924223e-05# >ARMA(1,1) + ARCH(1)5.415836 e-05?8.991902e-05# >ARCH(10)? e-05
Y algunos gráficos:
Plot(error_logreturns, main = "Error de pronóstico continuo de diferentes modelos", legend.loc = "topleft".
Podemos ver que ahora todos los modelos se ajustan a las series temporales. Además, no encontramos diferencias significativas entre los modelos.
Finalmente podemos comparar los errores estáticos y rodantes:
. Diagrama de barras (rbind (error _ var [, "fuera de muestra"], Rolling _ error _ var [, "fuera de muestra"]) Col = c ("azul oscuro", "varilla de oro oscuro"), Leyenda = c ( "Pronóstico estático", "móvil".
Podemos ver que el pronóstico móvil es necesario en algunos casos. Por lo tanto, de hecho necesitamos mejorar el pronóstico móvil periódicamente.
Modelo de varianza<. /p>
Modelos ARCH y GARCH
El modelo ARCH(m) de retorno logarítmico residual wt es
donde zt es ruido blanco con media cero y varianza constante La secuencia, la varianza condicional σ2t se modela como
donde m es el orden del modelo, ω>0, αi≥0 son parámetros
El modelo GARCH(m, s) utiliza σ2t. on extiende el modelo ARCH:
Los parámetros ω>0, αi≥0, βj≥0 deben satisfacer la estabilidad de ∑mi = 1αI+∑SJ = 1βJ≤1.
¿Rugarch genera datos?
Primero, necesitamos definir el modelo:
#Especificar el modelo GARCH con los coeficientes y parámetros dados# >;#>*-* #>*?Especificación del modelo GARCH ? * # & gt *-* # & gt; # & gt Dinámica de varianza condicional # & gt-# > ¿Modelo GARCH? :sGARCH(1,1)#>¿Objetivo de diferencia? :FALSE #>#>Dinámica media condicional#>-# >¿Modelo medio? :ARFIMA(1,0,0)#>Incluir media:VERDADERO#>GARCH-en-media:FALSE#>#>Distribución condicional#>-#>Problema:? norma # & gt incluyen inclinación:? FALSO #>¿Incluir formas? : ?FALSO #>¿Incluir Lambda? : ?FALSO #>? Los niveles fijos incluyen LB estimado UB#>mu 0,005 1?10na NA#>ar1? -0.900 1 ?10na na #>mxreg 0.0000?0 0 na na #>alfima 0.000 0?0 0 na na #>archm 0.000 0?0 0 na na #>mxreg 0.000 0?0 0 na NA # > omega 0.001 1 ? 10na NA # > alfa1 0.300 1? 10na NA # > beta1 0.650 1? 10na NA # > gamma 0.000 0?0 0? NA #>delta 0,000 0?0 0 NA NA #>λ0,000 0?0 0 NA NA #>vxreg 0,000 0?0 0 NA NA #> ; 0.000 0 ?0 0 NA NA #>forma 0.000?0 0 NA NA #>glambda? 0.000 0 ?0 0 NA NA # >xi 0.000?0 0 NA NA # >$ mu # & gt[1] 0.005# ># & gt$ ar 1 # >[1] -0.9# ># & gt $omega # >[1] 0.001# ># & gt$ alfa 1 # >[1] 0.3# ># & gt$ beta 1 # >[1]0.65 true_params # >mu ar1? ¿Omega alfa1? beta1#>? 0.005 -0.900 ?0.001 ?0.300 ?0.650
Luego, podemos generar la serie de tiempo de producción:
# Simular una ruta hpath(garch_spec, n . sim = T)# & gt ; Num [1: 2000, 1] 0.167-0.217 # Trazar retornos logarítmicos {plot (syntesis_log_returns, main = retornos logarítmicos del modelo", lwd = 1.5. Line(synth_volatility
Generalizado desde Regresión heterocedasticidad condicional (GeneralizedAutoregressiveConditionalHeteroskedasticity )
Ahora podemos estimar los parámetros:
#Especificar el modelo GARCH ugarspec (media.
modelo = lista (orden ARMA = c (1, 0) #Coeficientes estimados del modelo (GARCH_fit)# >mu?ar 1ωα1β1 # >?0.0036510100 -0.8902333595 ?0.0008811434 ?0.2810460728 ?0.6717486402 # >mu ar1?omega alfa 1? >? 0.005 -0.900 ?0.300 17486402
También podemos estudiar el tamaño de la muestra t pair Impacto de los errores de estimación de parámetros:
# loop for (T_ in T_sweep) {? garch_fit? _ coeffs _ vs _ T & lt- rbind(error_coeffs_vs_T,ABS((coef(GARCH_fit)-true _ params)/true _ params))? t, coef(GARCH _ FIT)) # Trazado de tapete de dibujo(T _ barrido, 100 * error _ coeffs_vs_t, main = "Error relativo de los coeficientes GARCH estimados", xlab = "T", ylab =
El verdadero ω es casi cero, por lo que el error es muy inestable en cuanto a los otros coeficientes, y ARMA es la misma situación, la estimación de μ es realmente pobre (el error relativo supera el 50%), mientras que la estimación de otros coeficientes parece ser igual a cero. será bueno después de T = 800 muestras
Comparación de resultados de GARCH
Como comprobación de cordura, ¿ahora compararemos los resultados de dos paquetes fGarch?
#? Especifique ARMA con valores de parámetros específicos (0, 0) - GARCH (1, 1) como proceso de generación de datos garch_spec #Generar ruta de datos de longitud 1000 (GARCH_fixed_SPEC, n. SIM = 1000) @-ugar fit(SPEC = GARCH_SPEC, data = x) #Usar el paquete "fGarch" se ajusta al modelo GARCH fit(fórmula = ~ GARCH(654333Mu? ¿Omega alfa1? beta1 # >0.09749904 0.01395109 0.13510445 0.73938595 # >Mu? ¿Omega alfa1? beta1 # >0.09750394 0.01392648 0.13527024 0.7391658 #Desviación estándar print(head(fgarch _ fi # >;[1]0.3513549 0.3254788 0.3037747 0.2869034 0.2735266 9 4 print(head(rugar # & gt; [1] 0.3538569 0.3275037 0.3053974 0.2881853 0.2745264 0.2716555 p >
De hecho, ambos paquetes dan los mismos resultados
¿Previsión GARCH con el paquete rugarch?
Una vez estimados los parámetros del modelo GARCH, utilice este modelo para predecir el futuro. Por ejemplo, una predicción de un paso basada en información pasada es ω/(1-∑Mi = 1αI-∑SJ = 1βJ). ¿Simplifica la predicción de datos fuera de la muestra?
#Modelo de estimación, excluyendo GARCH _ fit coef(GARCH _ fit)# & gt; Mu? ar 1ωα1β1 # >? $ sigma para[1,] #Gráfico de retorno logarítmico(cbind("fitted "?= equipado(garch_fit), main = "Pronóstico de ingresos de logaritmo sintético", legend.loc = "arriba a la izquierda ").
# plot(cbind("Volatilidad ajustada")?= sigma(garch_fit), main = "Volatilidad prevista de los rendimientos logarítmicos sintéticos", legend.loc = "topleft").
Diferentes métodos
Carguemos primero el S&P500:
#Cargar encabezado de datos del índice S&P 500 (precio del índice SP500)# & gt? SP500 # >2008-01-021447.16 # >2008-01-03 1447.16 # >2008-01-04 1411.63 # >2008-01-07 1416.18 # >2008-01-081390.19 # >2008-01- 09 438+ 03 #Preparar datos de entrenamiento y prueba x _ trn