library(forecast)
library(astsa)
library(fGarch)
library(tseries)
library(xts)
library(TSA)
library(car)
library(quantmod)
Tema VIII-a: Modelos no lineales: ARCH y GARCH.
1 librerías
2 Ejemplos simulados
2.1 ARCH(1)
set.seed(123456)
= garchSpec(model = list(gamma=0.01,alpha = c(0.8), beta = 0))
spec <-garchSim(spec, n = 1000)
y1ts.plot(y1)
acf2(y1)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF 0 0.04 -0.01 -0.01 -0.02 -0.01 0 -0.01 0 -0.04 0.08 0.02 -0.02
PACF 0 0.04 -0.01 -0.02 -0.02 -0.01 0 -0.01 0 -0.04 0.08 0.02 -0.03
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
ACF 0.02 0.03 -0.02 0 -0.02 -0.05 0.02 0.01 -0.02 -0.03 0.03 0.03
PACF 0.02 0.03 -0.02 0 -0.02 -0.05 0.02 0.02 -0.03 -0.04 0.04 0.03
[,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37]
ACF 0.03 -0.01 0.04 -0.04 -0.01 -0.05 0.03 0.00 -0.04 -0.02 0.01 0.05
PACF 0.01 -0.01 0.04 -0.04 0.00 -0.04 0.03 0.01 -0.04 -0.03 0.01 0.05
[,38] [,39] [,40] [,41] [,42]
ACF -0.01 -0.02 0.02 0.01 0.01
PACF -0.01 -0.04 0.02 0.01 0.01
ts.plot(y1^2)
acf2(y1^2)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF 0.57 0.38 0.24 0.11 0.10 0.06 0.04 0.03 0.02 0.03 0.04 0.03 0.05
PACF 0.57 0.08 0.00 -0.07 0.08 -0.02 0.00 0.00 0.01 0.03 0.02 -0.01 0.04
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
ACF 0.05 0.07 0.02 0.00 -0.02 -0.02 -0.04 -0.04 -0.05 -0.05 -0.04 -0.05
PACF 0.01 0.04 -0.07 -0.01 -0.02 0.03 -0.05 0.00 -0.03 0.01 -0.02 -0.01
[,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37]
ACF -0.04 -0.05 -0.05 -0.05 -0.04 -0.05 -0.01 0.00 0.02 0.01 -0.01 -0.03
PACF -0.02 -0.02 -0.01 -0.01 -0.01 -0.01 0.04 0.02 0.01 -0.01 -0.02 -0.02
[,38] [,39] [,40] [,41] [,42]
ACF -0.03 -0.03 -0.06 -0.06 -0.05
PACF 0.00 -0.01 -0.04 -0.01 0.01
2.2 ARCH(2)
= garchSpec(model = list(alpha = c(0.2, 0.4), beta = 0))
spec <-garchSim(spec, n = 1000)
y1ts.plot(y1)
acf2(y1)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF 0.02 -0.1 0.04 0.02 0 0.05 -0.02 -0.01 0.04 -0.07 -0.05 0.03 0.00
PACF 0.02 -0.1 0.04 0.01 0 0.05 -0.03 0.00 0.04 -0.08 -0.04 0.02 -0.01
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
ACF -0.02 0.01 0.04 -0.03 -0.03 -0.05 -0.04 -0.02 0.05 0 -0.04 0.03
PACF -0.01 0.01 0.04 -0.03 -0.03 -0.06 -0.05 -0.04 0.04 0 -0.03 0.04
[,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37]
ACF -0.04 -0.03 0.04 0.03 0 0.04 -0.04 -0.03 0.05 0.01 -0.01 0.05
PACF -0.04 -0.02 0.02 0.03 0 0.03 -0.04 -0.01 0.03 0.01 0.01 0.03
[,38] [,39] [,40] [,41] [,42]
ACF 0.03 -0.03 0.03 0.06 0.02
PACF 0.02 -0.02 0.02 0.06 0.03
ts.plot(y1^2)
acf2(y1^2)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF 0.47 0.57 0.34 0.31 0.24 0.18 0.15 0.09 0.12 0.11 0.10 0.11 0.05
PACF 0.47 0.45 -0.02 -0.04 0.04 -0.02 0.00 -0.02 0.06 0.06 -0.02 0.03 -0.05
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
ACF 0.04 0.02 0.00 0.02 -0.01 0.00 -0.01 0.00 -0.01 -0.01 -0.04 -0.04
PACF -0.06 0.02 -0.01 0.03 -0.02 -0.02 0.01 0.01 -0.02 -0.01 -0.04 -0.01
[,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37]
ACF -0.04 -0.05 -0.04 -0.04 0.00 -0.01 0.03 -0.02 0.01 -0.02 -0.01 -0.02
PACF 0.01 -0.01 0.01 0.00 0.04 0.00 0.03 -0.05 0.00 -0.01 -0.01 0.01
[,38] [,39] [,40] [,41] [,42]
ACF -0.05 -0.03 -0.05 -0.03 -0.05
PACF -0.05 -0.01 0.01 0.01 -0.04
2.3 GARCH(1,1)
= garchSpec(model = list(alpha = 0.2, beta = 0.4))
spec <-garchSim(spec, n = 2000)
y1ts.plot(y1)
acf2(y1)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF -0.02 0.01 0 0 0 0 -0.03 0.02 0.04 0 0 0.02 0.01
PACF -0.02 0.00 0 0 0 0 -0.03 0.02 0.04 0 0 0.02 0.01
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
ACF 0 0.02 -0.04 0.00 0.00 -0.02 -0.04 -0.02 -0.03 0 0.01 -0.02
PACF 0 0.02 -0.04 -0.01 -0.01 -0.02 -0.05 -0.03 -0.03 0 0.01 -0.01
[,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37]
ACF -0.02 -0.01 0.01 0.07 0.04 -0.05 0.02 -0.01 -0.01 -0.02 0.02 -0.01
PACF -0.02 -0.02 0.02 0.08 0.05 -0.04 0.02 -0.01 -0.01 -0.02 0.03 -0.01
[,38] [,39] [,40] [,41] [,42] [,43] [,44] [,45] [,46] [,47] [,48] [,49]
ACF 0.00 0.01 0.02 0.00 0.01 0.00 0 -0.01 0.00 0.03 0.01 -0.01
PACF -0.02 0.01 0.02 -0.01 0.00 0.01 0 -0.01 0.01 0.03 0.02 -0.01
[,50] [,51] [,52] [,53] [,54] [,55]
ACF 0 -0.01 0.03 -0.03 0.01 -0.01
PACF 0 -0.01 0.03 -0.03 0.01 -0.01
ts.plot(y1^2)
acf2(y1^2)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF 0.26 0.11 0.03 0.04 0.02 0.02 0.01 0.02 0.04 -0.03 -0.03 -0.01 -0.02
PACF 0.26 0.04 -0.01 0.04 0.00 0.01 0.00 0.01 0.03 -0.06 -0.01 0.00 -0.02
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
ACF -0.01 -0.03 -0.03 -0.03 0.02 0.01 0.03 0.05 0.03 0.02 -0.01 0
PACF 0.00 -0.03 -0.02 -0.02 0.04 0.01 0.02 0.04 0.00 0.01 -0.02 0
[,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37]
ACF 0.01 0.04 0.04 0.06 0.06 0.07 0.01 0.01 0.00 0.01 0.02 0.02
PACF 0.01 0.03 0.02 0.04 0.03 0.04 -0.03 0.00 -0.01 0.01 0.01 0.01
[,38] [,39] [,40] [,41] [,42] [,43] [,44] [,45] [,46] [,47] [,48] [,49]
ACF -0.04 -0.04 -0.03 0.00 0.00 -0.02 -0.01 0.00 0 -0.02 0.01 0.04
PACF -0.06 -0.02 -0.01 0.01 0.01 -0.02 0.01 0.01 0 -0.02 0.02 0.03
[,50] [,51] [,52] [,53] [,54] [,55]
ACF 0.00 0.00 0.01 0.02 0.04 0.01
PACF -0.03 -0.01 0.01 0.01 0.03 -0.01
3 Ejemplo: promedio diario industrial Dow Jone
getSymbols("^DJI",from = "2016/12/31",
to = "2018/12/31",
periodicity = "daily")
[1] "DJI"
<- DJI$DJI.Close y
3.1 Retornos
<- diff(log(y))[-1]
r colnames(r)<-"r"
ts.plot(y)
ts.plot(r)
acf2(y)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF 0.99 0.98 0.97 0.97 0.96 0.95 0.94 0.93 0.93 0.92 0.91 0.91 0.90
PACF 0.99 -0.02 0.04 -0.04 0.01 0.01 0.03 -0.04 0.07 -0.02 0.00 -0.02 0.02
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
ACF 0.89 0.89 0.88 0.88 0.87 0.87 0.86 0.85 0.85 0.84 0.83 0.83
PACF 0.02 0.10 0.02 -0.02 -0.06 -0.04 0.01 0.04 -0.05 -0.04 -0.03 0.09
[,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33]
ACF 0.82 0.81 0.81 0.80 0.79 0.79 0.78 0.78
PACF -0.03 -0.02 0.01 0.01 -0.02 -0.01 0.06 -0.02
acf2(r)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF 0.02 -0.07 0.05 -0.03 -0.02 -0.03 0.04 -0.11 0.01 0.01 0.00 -0.02 -0.04
PACF 0.02 -0.08 0.05 -0.04 -0.01 -0.04 0.04 -0.12 0.03 -0.02 0.02 -0.03 -0.03
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
ACF -0.12 -0.01 0.04 0.09 0.05 -0.04 -0.05 0.05 0.10 0.02 -0.14 0.02
PACF -0.14 0.01 0.01 0.11 0.03 -0.03 -0.07 0.06 0.07 0.04 -0.15 0.04
[,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33]
ACF 0.06 -0.01 0.03 0.03 0.01 -0.14 0.05 0.08
PACF 0.04 0.02 -0.01 0.04 0.03 -0.10 0.04 0.07
- Los retornos tienen colas pesadas y son asimétricos.
hist(r,breaks=25,freq=FALSE)
curve(dnorm(x,mean(r,na.rm = T),sd(r,na.rm = TRUE)),add=T,col=2)
3.2 auto.arima
- Empezamos con un modelo ARMA.
<- auto.arima(r)
auto_arima summary(auto_arima)
Series: r
ARIMA(1,0,1) with zero mean
Coefficients:
ar1 ma1
-0.8620 0.9465
s.e. 0.0412 0.0250
sigma^2 = 7.115e-05: log likelihood = 1679.09
AIC=-3352.18 AICc=-3352.14 BIC=-3339.54
Training set error measures:
ME RMSE MAE MPE MAPE MASE
Training set 0.0002870584 0.008418193 0.005530544 97.79074 159.9398 0.7157715
ACF1
Training set -0.03871362
checkresiduals(auto_arima)
Ljung-Box test
data: Residuals from ARIMA(1,0,1) with zero mean
Q* = 6.1604, df = 8, p-value = 0.6293
Model df: 2. Total lags used: 10
<-auto_arima$res
residualsacf2(residuals)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF -0.04 -0.02 0.01 0 -0.04 -0.01 0.02 -0.09 0.00 0.01 -0.01 -0.01 -0.04
PACF -0.04 -0.02 0.00 0 -0.04 -0.01 0.02 -0.09 -0.01 0.01 -0.01 -0.01 -0.05
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
ACF -0.11 -0.01 0.05 0.07 0.05 -0.05 -0.04 0.05 0.10 0.01 -0.13 0.02
PACF -0.12 -0.02 0.03 0.08 0.06 -0.05 -0.05 0.04 0.09 0.03 -0.13 0.00
[,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33]
ACF 0.06 -0.01 0.04 0.02 0.02 -0.14 0.06 0.07
PACF 0.07 -0.01 0.02 0.02 0.06 -0.11 0.03 0.06
acf2(residuals^2)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF 0.28 0.19 0.24 0.18 0.08 0.14 0.08 0.05 0.07 0.09 0.08 0.11 0.08
PACF 0.28 0.12 0.17 0.08 -0.03 0.07 -0.01 -0.01 0.03 0.04 0.05 0.06 0.00
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
ACF 0.16 0.07 0.10 0.08 0.13 0.06 0.10 0.01 0.05 0.13 0.05 0.02
PACF 0.11 -0.04 0.04 -0.01 0.08 -0.01 0.04 -0.08 0.02 0.10 -0.04 -0.02
[,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33]
ACF 0.04 0.02 0.06 0.15 0.04 0.08 0.16 0.06
PACF -0.03 -0.01 0.04 0.13 -0.07 0.06 0.07 -0.03
Hay autocorrelación de los residuales al cuadrado.
Indicación de que hay variabilidad condicional.
3.3 ARMA(1,1)+ARCH(1)
<- garchFit(r~arma(1,1)+garch(1,0), data=r,trace=F)
arma.arch1 round(arma.arch1@fit$matcoef, 4)
Estimate Std. Error t value Pr(>|t|)
mu 0.0008 0.0006 1.2336 0.2173
ar1 -0.8282 0.0505 -16.3953 0.0000
ma1 0.9204 0.0365 25.2337 0.0000
omega 0.0000 0.0000 11.8647 0.0000
alpha1 0.3820 0.0874 4.3736 0.0000
plot(arma.arch1,which=10)
plot(arma.arch1,which=11)
- Note que todavía existe autocorrelación de los residuales al cuadrado.
3.4 ARMA(1,1)+GARCH(1,1)
<- garchFit(r~arma(1,1)+garch(1,1), data=r,trace=F)
arma.garch11 round(arma.garch11@fit$matcoef, 4)
Estimate Std. Error t value Pr(>|t|)
mu 0.0015 0.0007 2.2800 0.0226
ar1 -0.5869 0.5305 -1.1062 0.2686
ma1 0.5889 0.5449 1.0808 0.2798
omega 0.0000 0.0000 2.2750 0.0229
alpha1 0.1598 0.0400 3.9919 0.0001
beta1 0.8281 0.0431 19.2312 0.0000
plot(arma.garch11,which=10)
plot(arma.garch11,which=11)
:::
plot(arma.garch11,which=13)
- Note que no existe autocorrelación de los residuales al cuadrado, pero los residuales no son normales.
- El modelo está bien, pero hay coeficientes no significativos.
- Procedemos a eliminarlos.
3.5 GARCH(1,1)
<- garchFit(r~garch(1,1), data=r,trace=F)
garch11 round(garch11@fit$matcoef, 4)
Estimate Std. Error t value Pr(>|t|)
mu 0.0010 0.0003 3.6563 0.0003
omega 0.0000 0.0000 2.2971 0.0216
alpha1 0.1594 0.0397 4.0151 0.0001
beta1 0.8285 0.0426 19.4699 0.0000
- Comparando los criterios de información, el modelo reducido es mejor.
@fit$ics garch11
AIC BIC SIC HQIC
-7.151073 -7.117356 -7.151200 -7.137843
@fit$ics arma.garch11
AIC BIC SIC HQIC
-7.143874 -7.093298 -7.144157 -7.124028
plot(garch11, which = 10)
plot(garch11, which = 11)
plot(arma.garch11,which=13)
- El modelo GARCH(1,1) va ganando, pero la normalidad no se cumple.
4 Ejemplo: CREF stock- 26/08/2004-15-08-2006
data(CREF)
plot(CREF)
=diff(log(CREF))*100
r.crefplot(r.cref); abline(h=0)
acf2(r.cref)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF 0.05 -0.07 0.04 -0.03 0.00 -0.05 -0.05 -0.05 -0.09 0.01 0.02 -0.06 0.03
PACF 0.05 -0.07 0.05 -0.04 0.01 -0.06 -0.04 -0.06 -0.08 0.01 0.01 -0.07 0.03
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
ACF 0.09 -0.05 0.07 0.05 -0.01 -0.01 0.02 0.03 -0.02 0.01 -0.06 0.00
PACF 0.07 -0.06 0.07 0.02 -0.01 -0.01 0.03 0.02 0.00 0.04 -0.08 0.03
[,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33]
ACF 0 -0.01 0.01 -0.09 -0.02 0.02 0.02 0.03
PACF 0 -0.02 0.01 -0.08 -0.03 0.01 0.02 0.01
4.0.1 Los retornos al cuadrado
plot(r.cref^2)
acf2(r.cref^2)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
ACF 0.01 0.05 0.1 0.1 0.02 0.06 0.04 0.14 0.05 0.20 0.05 0.14 0.12 0.00
PACF 0.01 0.05 0.1 0.1 0.01 0.04 0.02 0.12 0.04 0.19 0.02 0.10 0.08 -0.04
[,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26]
ACF -0.04 0.03 0.02 0.10 0.05 0.11 0.02 0.08 0.10 0.04 0 0.06
PACF -0.09 -0.04 -0.01 0.06 0.03 0.05 -0.03 0.01 0.06 0.03 0 0.02
[,27] [,28] [,29] [,30] [,31] [,32] [,33]
ACF -0.03 -0.01 -0.02 0.07 0.03 0.01 0.02
PACF -0.04 -0.06 -0.06 0.00 0.00 -0.03 -0.01
<- garchFit(~garch(1,1), data=r.cref,trace=FALSE)
garch11 @fit$matcoef garch11
Estimate Std. Error t value Pr(>|t|)
mu 0.06282849 0.02742543 2.290884 0.02197010
omega 0.01769834 0.01040813 1.700434 0.08904931
alpha1 0.04906053 0.01937981 2.531528 0.01135667
beta1 0.90841914 0.03686718 24.640320 0.00000000
<- garchFit(~garch(1,0), data=r.cref,trace=FALSE)
garch10
@fit$ics garch11
AIC BIC SIC HQIC
1.935193 1.968909 1.935066 1.948423
@fit$ics garch10
AIC BIC SIC HQIC
1.970613 1.995900 1.970541 1.980536
4.0.2 Diagnósticos de GARCH11
plot(garch11,which=9)
plot(garch11,which=10)
plot(garch11,which=11)
4.0.3 Diagnósticos de GARCH10
plot(garch10,which=9)
plot(garch10,which=10)
plot(garch10,which=11)