Ejemplo práctico (parte II)

Retomamos los diferentes modelos que vimos al final de la clase pasada

# Modelo hallado
fit1 <- arima(log(AirPassengers), c(0,1,1), seasonal = list(order = c(0,1,1), period = 12))

# Alternativas
fit2 <- arima(log(AirPassengers), c(0,1,1), seasonal = list(order = c(2,1,2), period = 12))
fit3 <- arima(log(AirPassengers), c(2,1,1), seasonal = list(order = c(0,1,0), period = 12))

Lo que debería seguir a continuación es la verificación de los supuestos para cada uno de los modelos restantes (fit2 y fit3), no obstante, daremos por hecho que los supuestos son cumplidos por éstos.

Lo que sigue es comparar algunos valores importantes como el AIC, AICc, BIC, MAE o RMSE, el Log likelihood (entre otros) para determinar cuál modelo es mejor.

Volatilidad

Consideremos la siguiente serie de tiempo sobre los precios diarios del oro:

data(gold)
autoplot(gold)

Notamos un comportamiento peculiar en esta serie de tiempo, pues podemos ver “picos” atípicos al comportamiento general. Lo anterior tiene una repercusión directa en la variabilidad de los datos y en general veremos que la modelación de tipo ARIMA no será la adecuada para series que presenten comportamientos de volatilidad.

Además, observemos que

summary(gold)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   285.0   337.7   403.2   392.5   443.7   593.7      34

en la serie hay 34 datos marcados como NA's, por lo cual realizamos una imputación

# serie de tiempo sin los NA realizando la imputación na.mean()
Xt <- ts(na_mean(gold), frequency = 261, start = c(1985, 1))

Luego, como los supuestos no se cumplen o fallan debido a la volatilidad, podemos utilizar (en vez de la modelación ARIMA) el modelo de Holt-Winterse como sigue

# probamos con un modelo aditivo
HWmod <- HoltWinters(Xt, seasonal="additive")
plot(HWmod)

# Probamos con un modelo multiplicativo
HWmod <- HoltWinters(Xt, seasonal="multiplicative")
plot(HWmod)

y no vemos grandes diferencias entre dichos modelos. Luego

# Realizamos la predicción
HWpred <- predict(HWmod, 100, prediction.interval = TRUE)
plot(HWmod, HWpred)

donde vemos intervalos de confianza muy amplios dada la variación en el tiempo, pero aún así logramos ver un patrón en la predicción basado en las observaciones previas.

Otra alternativa es utilizar el modelo GARCH (modelo autoregresivo generalizado condicional heterocedástico), en el cual la varianza futura depende de la varianza histórica y ésta depende de las observaciones. Este modelo se ocupa para predecir la volatilidad a mediano y corto plazo, además de capturar las agrupaciones de volatilidad.

Así, comenzamos por visualizar los log-rendimientos:

# Log-rendimientos

rt = diff(log(Xt)) 
ggtsdisplay(rt)

en el cual vemos picos drásticos en comparación con el comportamiento general de la serie, es decir, podemos visualizar las volatilidades de los datos. Luego

# Ajuste del modelo GARCH(1,1) sobre los log-rendimientos utilizando como
# distribución condicional una norma
Gmod <- garchFit(formula = ~ garch(1,1), data = rt, cond.dist="norm", trace=FALSE)
summary(Gmod)
## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 1), data = rt, cond.dist = "norm", 
##     trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 1)
## <environment: 0x0000000021c91c98>
##  [data = rt]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##         mu       omega      alpha1       beta1  
## 2.8963e-04  7.6303e-05  1.4663e-01  8.0804e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## mu     2.896e-04   7.379e-04    0.393    0.695    
## omega  7.630e-05   1.164e-05    6.553 5.64e-11 ***
## alpha1 1.466e-01   2.062e-02    7.113 1.14e-12 ***
## beta1  8.080e-01   1.919e-02   42.112  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  2393.303    normalized:  2.161972 
## 
## Description:
##  Mon Apr 04 17:04:58 2022 by user: weeee 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value     
##  Jarque-Bera Test   R    Chi^2  49119.24  0           
##  Shapiro-Wilk Test  R    W      0.5618694 0           
##  Ljung-Box Test     R    Q(10)  59.91404  3.762606e-09
##  Ljung-Box Test     R    Q(15)  79.52255  8.538825e-11
##  Ljung-Box Test     R    Q(20)  90.2518   6.698042e-11
##  Ljung-Box Test     R^2  Q(10)  6.937937  0.7312908   
##  Ljung-Box Test     R^2  Q(15)  15.66322  0.4047806   
##  Ljung-Box Test     R^2  Q(20)  17.17775  0.6414033   
##  LM Arch Test       R    TR^2   6.584141  0.8838287   
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -4.316718 -4.298617 -4.316744 -4.309872

donde vemos varias prueba de Ljung-Box para verificar el supuesto de la normalidad. Cabe resaltar que, si nos importan los precios en la escala original, el modelo que debemos ocupar es el Holt-Winters. En cambio, si no importa tal cual los precios y nos interesa modelar volatilidades, entonces ocuparemos los modelos GARCH.

Y realizamos la predicción

predict(Gmod, n.ahead=50, plot=TRUE, nx=200)

##    meanForecast  meanError standardDeviation lowerInterval upperInterval
## 1  0.0002896306 0.02144276        0.02144276   -0.04173741    0.04231667
## 2  0.0002896306 0.02269923        0.02269923   -0.04420005    0.04477931
## 3  0.0002896306 0.02383704        0.02383704   -0.04643010    0.04700937
## 4  0.0002896306 0.02487476        0.02487476   -0.04846400    0.04904326
## 5  0.0002896306 0.02582657        0.02582657   -0.05032952    0.05090878
## 6  0.0002896306 0.02670361        0.02670361   -0.05204848    0.05262774
## 7  0.0002896306 0.02751482        0.02751482   -0.05363843    0.05421769
## 8  0.0002896306 0.02826756        0.02826756   -0.05511376    0.05569302
## 9  0.0002896306 0.02896793        0.02896793   -0.05648646    0.05706572
## 10 0.0002896306 0.02962111        0.02962111   -0.05776667    0.05834593
## 11 0.0002896306 0.03023152        0.03023152   -0.05896306    0.05954232
## 12 0.0002896306 0.03080298        0.03080298   -0.06008310    0.06066236
## 13 0.0002896306 0.03133881        0.03133881   -0.06113332    0.06171258
## 14 0.0002896306 0.03184195        0.03184195   -0.06211945    0.06269871
## 15 0.0002896306 0.03231498        0.03231498   -0.06304656    0.06362583
## 16 0.0002896306 0.03276019        0.03276019   -0.06391917    0.06449843
## 17 0.0002896306 0.03317965        0.03317965   -0.06474129    0.06532056
## 18 0.0002896306 0.03357521        0.03357521   -0.06551658    0.06609584
## 19 0.0002896306 0.03394854        0.03394854   -0.06624829    0.06682756
## 20 0.0002896306 0.03430116        0.03430116   -0.06693941    0.06751868
## 21 0.0002896306 0.03463445        0.03463445   -0.06759265    0.06817191
## 22 0.0002896306 0.03494967        0.03494967   -0.06821046    0.06878972
## 23 0.0002896306 0.03524797        0.03524797   -0.06879511    0.06937437
## 24 0.0002896306 0.03553041        0.03553041   -0.06934869    0.06992795
## 25 0.0002896306 0.03579797        0.03579797   -0.06987310    0.07045236
## 26 0.0002896306 0.03605155        0.03605155   -0.07037011    0.07094937
## 27 0.0002896306 0.03629198        0.03629198   -0.07084135    0.07142061
## 28 0.0002896306 0.03652004        0.03652004   -0.07128834    0.07186760
## 29 0.0002896306 0.03673645        0.03673645   -0.07171248    0.07229174
## 30 0.0002896306 0.03694186        0.03694186   -0.07211508    0.07269434
## 31 0.0002896306 0.03713690        0.03713690   -0.07249735    0.07307661
## 32 0.0002896306 0.03732215        0.03732215   -0.07286044    0.07343970
## 33 0.0002896306 0.03749815        0.03749815   -0.07320539    0.07378465
## 34 0.0002896306 0.03766540        0.03766540   -0.07353320    0.07411246
## 35 0.0002896306 0.03782439        0.03782439   -0.07384481    0.07442407
## 36 0.0002896306 0.03797555        0.03797555   -0.07414107    0.07472033
## 37 0.0002896306 0.03811929        0.03811929   -0.07442281    0.07500207
## 38 0.0002896306 0.03825602        0.03825602   -0.07469079    0.07527005
## 39 0.0002896306 0.03838610        0.03838610   -0.07494573    0.07552500
## 40 0.0002896306 0.03850987        0.03850987   -0.07518832    0.07576758
## 41 0.0002896306 0.03862766        0.03862766   -0.07541919    0.07599845
## 42 0.0002896306 0.03873978        0.03873978   -0.07563893    0.07621819
## 43 0.0002896306 0.03884651        0.03884651   -0.07584813    0.07642739
## 44 0.0002896306 0.03894813        0.03894813   -0.07604731    0.07662657
## 45 0.0002896306 0.03904490        0.03904490   -0.07623697    0.07681623
## 46 0.0002896306 0.03913706        0.03913706   -0.07641761    0.07699687
## 47 0.0002896306 0.03922485        0.03922485   -0.07658966    0.07716892
## 48 0.0002896306 0.03930847        0.03930847   -0.07675355    0.07733281
## 49 0.0002896306 0.03938813        0.03938813   -0.07690969    0.07748895
## 50 0.0002896306 0.03946404        0.03946404   -0.07705846    0.07763772

donde vemos grandes intervalos de confianza pues el comportamiento de las volatilidades presentan valores grandes comparados con el resto de las observaciones.

Modelos GARCH

Comenzamos por cargar los datos que contienen los precios diarios del petroleo

datos <- read.csv("PrecioDiario2.csv", header=T, dec=",", sep=";")
head(datos,5)
##      Fecha Precio Dato
## 1 01/01/99   8.30    1
## 2 04/01/99   8.63    2
## 3 05/01/99   8.51    3
## 4 06/01/99   9.21    4
## 5 07/01/99   9.46    5

notamos que los precios son sólo de los días laborales, por lo cual nuestra serie de tiempo tendrá varios valores NA. Por ello imputamos como sigue

attach(datos)
# gurdamos los valores de los precios en un vector
precio <- as.numeric(as.vector(Precio)) 

# vemos los valores faltantes
summary(precio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    7.81   25.75   49.10   55.48   85.51  132.71       5

Luego

# imputar los valores faltantes con el metodo de ma
precio <- na_ma(precio, k = 4, weighting = "exponential")

Ahora, vemos que

par(mfrow=c(1,2))
plot(precio,col="blue",type="l")

# realizamos una transformación en los datos pues los datos originales
# tienen tendencia y variabilidad creciente
plot(log(precio),col="blue",type="l")

Después, vemos los cambios en los precios de un día a otro (en logarítmo), mejor conocidos como logrendimientos:

# lo que mas interesa es modelar los rendimientos
# rendi = log(precio[t]) - log(precio[t-1])

rendi <- diff(log(precio))

# graficamos
plot(rendi, col="red",type="l")

siento este un patrón muy usual de los GARCH. También podemos identificar estos modelos por medio de las gráficas ACF y PACF

par(mfrow=c(2,1))

acf(rendi) 
pacf(rendi) 

parecen estar No correlacionados o un ruido blanco, porque los valores del acf y pacf quedan dentro de las bandas de confianza pero de acuerdo a los datos SI existe relacion de dependencia.

Vemos también las gráficas ACF y PACF de los rendimientos al cuadrado y en valor absuluto:

par(mfrow=c(2,2))

# Rendimientos al cuadrado
acf(rendi^2) 
pacf(rendi^2) 

# Rendimientos en valor absoluto
acf(abs(rendi)) 
pacf(abs(rendi)) 

donde aquí se resaltan varios valores que no quedan dentro de las bandas, así, podemos rechazar la idea de que estamos trabajando con un ruido blanco.

Nos podemos auxiliar de pruebas no paramétricas

Box.test(rendi,1)
## 
##  Box-Pierce test
## 
## data:  rendi
## X-squared = 0.40396, df = 1, p-value = 0.525
for(k in 1:5){print(Box.test(rendi,k))}
## 
##  Box-Pierce test
## 
## data:  rendi
## X-squared = 0.40396, df = 1, p-value = 0.525
## 
## 
##  Box-Pierce test
## 
## data:  rendi
## X-squared = 2.1285, df = 2, p-value = 0.345
## 
## 
##  Box-Pierce test
## 
## data:  rendi
## X-squared = 5.9072, df = 3, p-value = 0.1162
## 
## 
##  Box-Pierce test
## 
## data:  rendi
## X-squared = 6.7422, df = 4, p-value = 0.1502
## 
## 
##  Box-Pierce test
## 
## data:  rendi
## X-squared = 9.2203, df = 5, p-value = 0.1006
Box.test(rendi^2)
## 
##  Box-Pierce test
## 
## data:  rendi^2
## X-squared = 243.49, df = 1, p-value < 2.2e-16
Box.test(abs(rendi))
## 
##  Box-Pierce test
## 
## data:  abs(rendi)
## X-squared = 123.9, df = 1, p-value < 2.2e-16

donde vemos que se rechaza \(H_{0}\) para el caso de la prueba Box-Pierce para los rendimientos al cuadrado y los absolutos de los rendimientos, es decir, para estos caso, estamos rechazando la “independencia” de los datos.

Estimación

Procedemos ahora a la estimación GARCH adecuada para nuestros datos

 # probamos con un primer modelo:

mod11 <- garchFit(formula = ~garch(1,1), data= rendi)
## 
## Series Initialization:
##  ARMA Model:                arma
##  Formula Mean:              ~ arma(0, 0)
##  GARCH Model:               garch
##  Formula Variance:          ~ garch(1, 1)
##  ARMA Order:                0 0
##  Max ARMA Order:            0
##  GARCH Order:               1 1
##  Max GARCH Order:           1
##  Maximum Order:             1
##  Conditional Dist:          norm
##  h.start:                   2
##  llh.start:                 1
##  Length of Series:          4423
##  Recursion Init:            mci
##  Series Scale:              0.02437374
## 
## Parameter Initialization:
##  Initial Parameters:          $params
##  Limits of Transformations:   $U, $V
##  Which Parameters are Fixed?  $includes
##  Parameter Matrix:
##                      U           V     params includes
##     mu     -0.11068054   0.1106805 0.01106805     TRUE
##     omega   0.00000100 100.0000000 0.10000000     TRUE
##     alpha1  0.00000001   1.0000000 0.10000000     TRUE
##     gamma1 -0.99999999   1.0000000 0.10000000    FALSE
##     beta1   0.00000001   1.0000000 0.80000000     TRUE
##     delta   0.00000000   2.0000000 2.00000000    FALSE
##     skew    0.10000000  10.0000000 1.00000000    FALSE
##     shape   1.00000000  10.0000000 4.00000000    FALSE
##  Index List of Parameters to be Optimized:
##     mu  omega alpha1  beta1 
##      1      2      3      5 
##  Persistence:                  0.9 
## 
## 
## --- START OF TRACE ---
## Selected Algorithm: nlminb 
## 
## R coded nlminb Solver: 
## 
##   0:     5721.3668: 0.0110681 0.100000 0.100000 0.800000
##   1:     5694.9780: 0.0110682 0.0796603 0.0994262 0.792047
##   2:     5679.8314: 0.0110683 0.0782837 0.116448 0.805672
##   3:     5646.8857: 0.0110688 0.0383317 0.132323 0.813480
##   4:     5603.2188: 0.0110699 0.0256484 0.140189 0.854546
##   5:     5590.0450: 0.0110710 0.00128486 0.126381 0.888086
##   6:     5585.6586: 0.0110710 0.0109829 0.127208 0.890895
##   7:     5569.0823: 0.0110712 0.00802237 0.123191 0.890024
##   8:     5565.3048: 0.0110714 0.00574769 0.118857 0.891327
##   9:     5561.1130: 0.0110716 0.00709537 0.115208 0.894572
##  10:     5539.9743: 0.0110732 0.00401917 0.0886616 0.914991
##  11:     5536.6734: 0.0110735 0.00517427 0.0821614 0.924007
##  12:     5527.0635: 0.0110739 0.00420188 0.0719243 0.928382
##  13:     5525.5266: 0.0110741 0.00153572 0.0668524 0.937976
##  14:     5524.5161: 0.0110741 0.00235211 0.0667183 0.938031
##  15:     5523.8997: 0.0110741 0.00215039 0.0660579 0.937572
##  16:     5523.0034: 0.0110742 0.00281796 0.0648335 0.938469
##  17:     5521.5839: 0.0110744 0.00235976 0.0620652 0.940238
##  18:     5519.8085: 0.0110752 0.00266284 0.0571243 0.944654
##  19:     5519.6242: 0.0110791 0.00163173 0.0519955 0.948717
##  20:     5518.4026: 0.0110977 0.00251645 0.0499242 0.950483
##  21:     5518.1276: 0.0111275 0.00270825 0.0504980 0.948652
##  22:     5518.0624: 0.0111618 0.00269614 0.0496945 0.949521
##  23:     5518.0602: 0.0111618 0.00264759 0.0497081 0.949567
##  24:     5518.0596: 0.0111625 0.00267407 0.0497161 0.949595
##  25:     5518.0583: 0.0111632 0.00265383 0.0497053 0.949597
##  26:     5518.0574: 0.0111645 0.00265139 0.0496988 0.949653
##  27:     5518.0560: 0.0111675 0.00263178 0.0496701 0.949666
##  28:     5518.0437: 0.0112562 0.00263515 0.0490858 0.950155
##  29:     5517.9076: 0.0146244 0.00256159 0.0493144 0.950346
##  30:     5517.8311: 0.0179926 0.00279351 0.0496152 0.949496
##  31:     5517.8041: 0.0187758 0.00262378 0.0493431 0.949908
##  32:     5517.8021: 0.0187680 0.00260722 0.0493338 0.950003
##  33:     5517.8021: 0.0187648 0.00260776 0.0493279 0.950006
##  34:     5517.8021: 0.0187648 0.00260774 0.0493279 0.950006
## 
## Final Estimate of the Negative LLH:
##  LLH:  -10910.32    norm LLH:  -2.466724 
##           mu        omega       alpha1        beta1 
## 4.573678e-04 1.549201e-06 4.932790e-02 9.500062e-01 
## 
## R-optimhess Difference Approximated Hessian Matrix:
##                  mu         omega        alpha1         beta1
## mu     -14401917.71 -2.667237e+07  1.052315e+04      -52511.9
## omega  -26672365.88 -1.430427e+13 -2.445345e+09 -3115224100.9
## alpha1     10523.15 -2.445345e+09 -7.404195e+05     -850180.0
## beta1     -52511.90 -3.115224e+09 -8.501800e+05    -1048593.4
## attr(,"time")
## Time difference of 0.233829 secs
## 
## --- END OF TRACE ---
## 
## 
## Time to Estimate Parameters:
##  Time difference of 1.314896 secs
summary(mod11)
## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 1), data = rendi) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 1)
## <environment: 0x00000000223c65d0>
##  [data = rendi]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##         mu       omega      alpha1       beta1  
## 4.5737e-04  1.5492e-06  4.9328e-02  9.5001e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## mu     4.574e-04   2.641e-04    1.732  0.08333 .  
## omega  1.549e-06   4.508e-07    3.436  0.00059 ***
## alpha1 4.933e-02   4.489e-03   10.988  < 2e-16 ***
## beta1  9.500e-01   4.190e-03  226.709  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  10910.32    normalized:  2.466724 
## 
## Description:
##  Mon Apr 04 17:05:06 2022 by user: weeee 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value   
##  Jarque-Bera Test   R    Chi^2  2496.071  0         
##  Shapiro-Wilk Test  R    W      0.9694204 0         
##  Ljung-Box Test     R    Q(10)  22.82427  0.01141414
##  Ljung-Box Test     R    Q(15)  30.06962  0.01167292
##  Ljung-Box Test     R    Q(20)  33.92049  0.0266676 
##  Ljung-Box Test     R^2  Q(10)  6.256216  0.7932973 
##  Ljung-Box Test     R^2  Q(15)  17.7053   0.2784756 
##  Ljung-Box Test     R^2  Q(20)  24.40991  0.224945  
##  LM Arch Test       R    TR^2   15.78802  0.2011392 
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -4.931640 -4.925857 -4.931641 -4.929600

donde los parámetros de garch() suelen ser el 1 y el 2. De tal manera

# Probamos
mod11 <- garchFit(formula = ~garch(1,1), data= rendi)
mod12 <- garchFit(formula = ~garch(1,2), data= rendi)
mod21 <- garchFit(formula = ~garch(2,1), data= rendi)
mod22 <- garchFit(formula = ~garch(2,2), data= rendi)

# Usando metodos de bondad de ajuste, analisis de residuales, significancia de los parametros, elegimos el mejor modelo

summary(mod11)
summary(mod12)
summary(mod21)
summary(mod22)

y hacemos el análisis con cada modelo:

# Haremos el análisis sólo para el modelo mod11

mod <- mod11 
summary(mod)
## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 1), data = rendi) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 1)
## <environment: 0x00000000223c65d0>
##  [data = rendi]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##         mu       omega      alpha1       beta1  
## 4.5737e-04  1.5492e-06  4.9328e-02  9.5001e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## mu     4.574e-04   2.641e-04    1.732  0.08333 .  
## omega  1.549e-06   4.508e-07    3.436  0.00059 ***
## alpha1 4.933e-02   4.489e-03   10.988  < 2e-16 ***
## beta1  9.500e-01   4.190e-03  226.709  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  10910.32    normalized:  2.466724 
## 
## Description:
##  Mon Apr 04 17:05:06 2022 by user: weeee 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value   
##  Jarque-Bera Test   R    Chi^2  2496.071  0         
##  Shapiro-Wilk Test  R    W      0.9694204 0         
##  Ljung-Box Test     R    Q(10)  22.82427  0.01141414
##  Ljung-Box Test     R    Q(15)  30.06962  0.01167292
##  Ljung-Box Test     R    Q(20)  33.92049  0.0266676 
##  Ljung-Box Test     R^2  Q(10)  6.256216  0.7932973 
##  Ljung-Box Test     R^2  Q(15)  17.7053   0.2784756 
##  Ljung-Box Test     R^2  Q(20)  24.40991  0.224945  
##  LM Arch Test       R    TR^2   15.78802  0.2011392 
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -4.931640 -4.925857 -4.931641 -4.929600

donde las pruebas de Ljung-Box son sobre las observaciones originales, sobre las obsevaciones al cuadrado y sobre los valores absolutos de las observaciones. En la información anterior también podríamos ver si un parámetro no es significativo, lo cual sería el caso de un parámetro qu tenga un valor mayor a 0.05 en Pr(>|t|). Continuando

# Comprobamos si es ruido blanco gaussiano
par(mfrow=c(1,2))
res_F <- residuals(mod, standardize=F)
plot(res_F)
qqnorm(res_F) 
qqline(res_F,col="red",lwd=2)

ad.test(res_F) 
## 
##  Anderson-Darling normality test
## 
## data:  res_F
## A = 77.529, p-value < 2.2e-16

vemos que los valores extremos de la Q-Q están alejados de la recta roja. Además, de la prueba de Anderson-Darling rechazamos \(H_0\), es decir, se rechaza que los residuos tienen una distribución normal. Así, probamos otras distribuciones de los errores, por ejemplo:

# En los modelos GARCH es usual buscar otro tipo de distribucion para los errores, ya que pueden ser No simetricos, o con colas más pesadas

# Normal sesgada
mod <- garchFit(formula = ~garch(1,1), data=rendi, cond.dist="snorm")

# error generalizado
mod <- garchFit(formula = ~garch(1,1), data=rendi, cond.dist="ged")

# error generalizado sesgada
mod <- garchFit(formula = ~garch(1,1), data=rendi, cond.dist="sged")

# t-student
mod <- garchFit(formula = ~garch(1,1), data=rendi, cond.dist="std")

# t-student sesgada
mod <- garchFit(formula = ~garch(1,1), data=rendi, cond.dist="sstd")

Finalmente realizamos la predicción:

predict(mod, n.ahead = 5, trace = FALSE, mse = c("cond"),
        plot=TRUE, nx=10, crit_val=NULL, conf=NULL)

##   meanForecast  meanError standardDeviation lowerInterval upperInterval
## 1 0.0004573678 0.02432582        0.02432582   -0.04722036    0.04813509
## 2 0.0004573678 0.02434955        0.02434955   -0.04726687    0.04818161
## 3 0.0004573678 0.02437324        0.02437324   -0.04731331    0.04822804
## 4 0.0004573678 0.02439690        0.02439690   -0.04735967    0.04827441
## 5 0.0004573678 0.02442051        0.02442051   -0.04740596    0.04832069

que notamos también constante.