Modelado medio
Enlace original: /?p=20015?
Este artículo explicará diferentes modelos de series temporales financieras univariadas y multivariadas, especialmente la media condicional y la matriz de covarianza condicional y la volatilidad.
Modelo de media
Esta sección presentará el modelo de media condicional.
modelo iid
Comenzamos con un modelo iid simple. El modelo iid supone que el retorno logarítmico xt es una serie temporal gaussiana N-dimensional:
Las estimaciones muestrales de la matriz de media y covarianza son la media muestral
y la matriz de covarianza muestral
respectivamente. p>Primero generamos los datos, nos familiarizamos con el proceso y nos aseguramos de que el proceso de estimación proporcione resultados correctos (es decir, verificación de cordura). Luego utilice datos reales del mercado y ajuste diferentes modelos.
Generemos datos iid sintéticos y estimemos las matrices de media y covarianza:
# Generar datos de retorno sintéticos X lt; - rmvnorm(n = T, media = mu, sigma = Sigma; )# Estimación de muestra (media de muestra y matriz de covarianza de muestra) mu_sm lt; - colMeans(X)Sigma _scm lt; - cov(X)# Error norm(mu_sm - mu, "2")#gt; Sigma_scm - Sigma, "F")#gt; [1] 70.79
Ahora, hagámoslo nuevamente para diferentes observaciones T:
# Primero generamos todos los datos X lt;- rmvnorm(n = T_max, media = mu, sigma = Sigma)# Ahora itere sobre el subconjunto de muestra para (T_ en T_sweep) { ?# Estimación de muestra ?mu_sm lt;- colMeans(X_) ?Sigma_scm lt;- cov( X_) ?# Calcular error?error_mu_vs_T lt; - c(error_mu_vs_T, norm(mu_sm - mu, "2")) ?# Trazar plot(T_sweep, error_mu_vs_T, main = "mu error de estimación",
plot( T_sweep, error_Sigma_vs_T main = "Error en la estimación de Sigma", ylab = "Error"
Modelo ARMA univariado
Registro del modelo ARMA (p, q) en rendimiento xt es
p>
donde wt es una secuencia de ruido blanco con media cero y varianza σ2. Los parámetros del modelo son los coeficientes ?i, θi y la varianza del ruido σ2. (p, d, q) es un modelo ARMA (p, q) con diferencias temporales de orden d. Por lo tanto, si usamos xt en lugar de log price, el modelo de retorno logarítmico anterior es en realidad un ARIMA (p, 1, q). ), porque una vez que se diferencian los precios de los registros, obtenemos los rendimientos de los registros.
¿Generará rugarch los datos?
Utilizaremos el paquete rugarch para generar los datos ARMA univariados, estimación. los parámetros y hacer predicciones.
Primero, necesitamos definir el modelo:
# Especifique el modelo AR(1) con los coeficientes y parámetros dados #gt #gt; ----------------------*#gt; * ?Especificaciones del modelo ARFIMA?*#gt *------- -----------------------*#gt; Media condicional dinámica#gt; ---------------------#gt; ¿Modelo medio?: ARFIMA(1, 0, 0)#gt; Incluir media: VERDADERO #gt; Distribución#gt; ------------------------------------#gt; Distribución: ? norma #gt; Incluye sesgo: ?FALSE #gt; Incluye forma ??FALSE #gt; Incluye Lambda ?Incluye Lambda ??FALSE#gt; Nivel fijo Incluye estimación LB UB#gt; 0 ?0 0 NA NA#gt; mxreg 0,00 0 ?0 NA #gt; 0,00 0 ?0 NA NA#gt; sigma 0,20 1 ? 1 0 NA NA#gt; NA NA#gt; eta1 ?0,00 0 ?0 NA NA#gt; eta2 ?0 NA#gt; eta2 ?0 NA NA#gt; 0 NA NA#gt; vxreg 0,00 0 ?0 NA#gt; 0 NA NA#gt; ghlambda ?0,00 0 ?0 0 NA NA#gt; gt; [1] -0.9#gt; #gt; $sigma#gt; [1] 0.2true_params#gt; mu ?sim = T)# Convertir a xts y plotplot (synth_log_returns, main = "Registro de retornos del modelo ARMA " plot(synth_log_prices, main = "Registro de precios del modelo ARMA"
Modelo ARMA
Ahora podemos estimar los parámetros (ya los conocíamos):
# Especificar A
R(1) modelo arfimaspec(mean.model = list( armaOrder = c(1, 0), include.mean = TRUE))# Modelo estimado #gt; mu ?ar1 sigma #gt; #gt; mu ? ar1 sigma #gt; ? 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:
# rbind in T_sweep) { ?rbind(estim_coeffs_vs_T, coef(arma_fit)?- rbind(error_coeffs_vs_T, abs(coef(arma_fit) - true_params)/true_params) # plot matplot(T_sweep, estim_coeffs_vs_T, main = "Coeficientes ARMA estimados", xlab = " T", ylab = "values",
matplot(T_sweep, 100*error_coeffs_vs_T, main = "Error relativo de los coeficientes estimados de ARMA", xlab = "T", ylab = "error()",
Primero, el µ verdadero es casi cero, por lo que el error relativo puede parecer inestable después de T = 800 muestras
predicciones ARMA
Para una verificación de cordura. ahora compararemos los resultados de los dos paquetes Forecast y rugarch:# Especifique un modelo AR(1) con los coeficientes y parámetros dados spec(mean. model = list(armaOrder = c(1, 0 ), include.mean = TRUE), fix.pars = list(mu = 0.005, ar1 = -0.9, sigma = 0.1))# Generar una secuencia de longitud 1000 arfima(arma_fixed_spec, n.sim = 1000)@path$seriesSim # Utilice el paquete de software rugarch para especificar y ajustar el modelo spec(mean.model = list(armaOrder = c(1, 0), include.mean = TRUE))# Utilice el paquete de software " Forecast "Fit model #gt; (1, 0, 0), la media no es cero #gt; #gt; #gt; ?0,0017#gt; 2 se estima en 0,01004: ? log probabilidad=881,6#gt; AIC=-1757,2 ?AICc=-1757,17 ?BIC=-1742,47# Comparar coeficientes del modelo #gt; ?ar1 interceptar sigma #gt; 964#gt; ar1 sigma#gt;
¿Selección del modelo ARMA?
En los experimentos anteriores asumimos conocer el orden del modelo ARMA, es decir, p = 1 y q = 0. Cuanto mayor sea el orden, mejor será el ajuste, pero esto conducirá inevitablemente a un sobreajuste. Para evitar el sobreajuste se han desarrollado muchos métodos para penalizar el aumento de complejidad, como AIC, BIC, SIC, HQIC, etc.
# Pruebe diferentes combinaciones# Ver clasificación#gt; AR MA Media ARFIMA BIC convergente#gt; 1#gt; 3 ? 2 ?0 1 ?0 -0,37736340 1#gt; 0 1 ?0 -0.37164609 1#gt; 7 ?1 ?3 1 ?0 -0.37143480 1#gt; gt; ?0 -0.11875575 1#gt; 14 ?0 ?2 1 ?0 ?0.02957266 1#gt; 15 ?0 ?1 1 ?0 ?0.39326050 1#gt; Elija el mejor armaOrder#gt; AR MA #gt; ?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 intentas usar T = 200, la detección de orden es p = 1 y q = 3.
¿Predicción ARMA?
Una vez estimados los parámetros del modelo ARMA ?^i y θ^j, el modelo se puede utilizar para predecir valores futuros. Por ejemplo, predecir el valor de xt basándose en información pasada es
, el error de predicción es xt-x ^ t = wt (suponiendo que los parámetros se hayan estimado) y la varianza es σ2.
El paquete "rugarch" puede predecir fácilmente datos fuera de muestra:
# Modelo estimado (excluyendo datos fuera de muestra) coef(arma_fit)#gt; mu ?ar1 sigma #gt; 0.898745183 ?0.200400119# Throughout forecast_log_returns <-xts(arma_fore@forecast$seriesFor[1, ], dates_out_of_sample)# Restore logarithmic prices prev_log_price <- head(tail(synth_log_prices, out_of_sample 1), out_of_sample)# Logarithmic returns plot(cbind(" fitted " ?= equipado(arma_fit), # log_price_plot(cbind("forecast" = Forecast_log_prices, main="log_price_forecast", genda.loc="topleft")
Modelo VARMA multivariable
El modelo VARMA(p, q) devuelto con respecto al logaritmo de xt es
donde wt es una secuencia de ruido blanco con media cero y matriz de covarianza Σw y los parámetros del modelo son los coeficientes de vector/matriz ?0 , Φi , Θj y matriz de covarianza de ruido Σw
Comparación
Comencemos cargando SP500:
# Load SP500 data head(SP500_index_prices)#gt; SP500#gt; 2012-01-03 1277,06#gt; 2012-01-06 1277,81#gt; .70#gt; 2012 -01-10 1292.08# Preparar datos de entrenamiento y prueba logreturns_trn lt; - logreturns[1: T_trn] logreturns_tst lt; - logreturns[-c(1: T_trn)]# plot{ plot(logreturns, ?addEventLines(xts("entrenamiento) "
Ahora, usamos los datos de entrenamiento (es decir, para t = 1, ..., Ttrnt = 1, ..., Ttrn) para ajustar diferentes modelos (nota, marcando ?out.sample = T_tst, se excluyen los datos fuera de la muestra). Consideraremos en particular los modelos iid, los modelos AR, los modelos ARMA y algunos modelos ARCH y GARCH (los modelos de varianza se analizarán en detalle más adelante).
# i.i.d. coef de ajuste del modelo(iid_fit)#gt; 360 208 # Ajuste del modelo AR(1) coef(ar _fit)#gt; mu ? ar1 sigma #gt; ?0.0005678014 -0.0220185181 ? ?0.0007223304 ?0.0268612636 ?0.9095552008 -0.0832923604 -0.9328475211 ?0.0072573570# Montaje del modelo ARMA(1,1) ARCH(1) coef(arch_fit)# mu mu ? ar1 ? ma1 omega alfa1 # gt ? e-04 ?8.720929e-02 -9.391019e-02 ?4.898885e-05 ?9.986975e-02# Ajuste ARMA(0,0) ARCH(10) modelo coef(long_arch_fit)# gt ; ? alfa3 alfa4 alfa5 #gt; 7.490786e-04 2.452099e-02 3.082806e-02 6? alfa7? alfa8? alfa9? #gt; 4.026539e-02 3.050040e-07 9.260183e-02 1.150128e-01 1.068426e-06# Ajuste ARMA(1,1) GARCH(1,1) modelo coef(garch_fit)#gt; omega alfa1 beta1 #gt;