Tema VIII-a: Modelos no lineales: ARCH y GARCH.

Curso: Análisis de series temporales

1 librerías

library(forecast)
library(astsa)
library(fGarch)
library(tseries)
library(xts)
library(TSA)
library(car)
library(quantmod)

2 Ejemplos simulados

2.1 ARCH(1)

set.seed(123456)
spec = garchSpec(model = list(gamma=0.01,alpha = c(0.8), beta = 0))
y1<-garchSim(spec, n = 1000)
ts.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)

spec = garchSpec(model = list(alpha = c(0.2, 0.4), beta = 0))
y1<-garchSim(spec, n = 1000)
ts.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)

spec = garchSpec(model = list(alpha = 0.2, beta = 0.4))
y1<-garchSim(spec, n = 2000)
ts.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"
y <- DJI$DJI.Close

3.1 Retornos

r <- diff(log(y))[-1]
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 <- auto.arima(r)
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
residuals<-auto_arima$res
acf2(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)

arma.arch1 <- garchFit(r~arma(1,1)+garch(1,0), data=r,trace=F)
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)

arma.garch11 <- garchFit(r~arma(1,1)+garch(1,1), data=r,trace=F)
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)

garch11 <- garchFit(r~garch(1,1), data=r,trace=F)
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.
garch11@fit$ics
      AIC       BIC       SIC      HQIC 
-7.151073 -7.117356 -7.151200 -7.137843 
arma.garch11@fit$ics
      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)

r.cref=diff(log(CREF))*100
plot(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
garch11 <- garchFit(~garch(1,1), data=r.cref,trace=FALSE)
garch11@fit$matcoef
         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
garch10 <- garchFit(~garch(1,0), data=r.cref,trace=FALSE)

garch11@fit$ics
     AIC      BIC      SIC     HQIC 
1.935193 1.968909 1.935066 1.948423 
garch10@fit$ics
     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)