Glossary of ARCH models

Bollerslev wrote the article Glossary to ARCH (2010) which lists several families of ARCH models. You can find a technical report version of the paper here:

https://pdfs.semanticscholar.org/ea8e/a53721fbc28efec73e509259b00a9193ba12.pdf.

I reproduce here the first paragraph of his paper:

Rob Engle’s seminal Nobel Prize winning 1982 Econometrica article on the AutoRegressive Conditional Heteroskedastic (ARCH) class of models spurred a virtual “arms race” into the development of new and better procedures for modeling and forecasting timevarying financial market volatility. Some of the most influential of these early papers were collected in Engle (1995). Numerous surveys of the burgeoning ARCH literature also exist; e.g., Andersen and Bollerslev (1998), Andersen, Bollerslev, Christoffersen and Diebold (2006a), Bauwens, Laurent and Rombouts (2006), Bera and Higgins (1993), Bollerslev, Chou and Kroner (1992), Bollerslev, Engle and Nelson (1994), Degiannakis and Xekalaki (2004), Diebold (2004), Diebold and Lopez (1995), Engle (2001, 2004), Engle and Patton (2001), Pagan (1996), Palm (1996), and Shephard (1996). Moreover, ARCH models have now become standard textbook material in econometrics and finance as exemplified by, e.g., Alexander (2001, 2008), Brooks (2002), Campbell, Lo and MacKinlay (1997), Chan (2002), Christoffersen (2003), Enders (2004), Franses and van Dijk (2000), Gourieroux and Jasiak (2001), Hamilton (1994), Mills (1993), Poon (2005), Singleton (2006), Stock and Watson (2007), Tsay (2002), and Taylor (2004). So, why another survey type chapter?

Installing packages and creating functions

#install.packages("fGarch")
#install.packages("rugarch")
library("fGarch")
## Loading required package: timeDate
## Loading required package: timeSeries
## Loading required package: fBasics
library("rugarch")
## Loading required package: parallel
## 
## Attaching package: 'rugarch'
## The following object is masked from 'package:stats':
## 
##     sigma
library(tidyquant)
## Loading required package: lubridate
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
## Loading required package: PerformanceAnalytics
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following object is masked from 'package:timeSeries':
## 
##     time<-
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Attaching package: 'PerformanceAnalytics'
## The following objects are masked from 'package:timeDate':
## 
##     kurtosis, skewness
## The following object is masked from 'package:graphics':
## 
##     legend
## Loading required package: quantmod
## Loading required package: TTR
## 
## Attaching package: 'TTR'
## The following object is masked from 'package:fBasics':
## 
##     volatility
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
## ══ Need to Learn tidyquant? ════════════════════════════════════════════════════
## Business Science offers a 1-hour course - Learning Lab #9: Performance Analysis & Portfolio Optimization with tidyquant!
## </> Learn more at: https://university.business-science.io/p/learning-labs-pro </>
library(ggplot2)
options(stringsAsFactors = FALSE)

plot.sigt = function(y,sigt,model){
  limy = range(abs(y),-abs(y))
  par(mfrow=c(1,1))
  plot(abs(y),xlab="Days",ylab="Log-returns (-/+)",main="",type="h",axes=FALSE,ylim=limy)
  lines(-abs(y),type="h")
  axis(2);box();axis(1,at=ind,lab=date)
  lines(sigt,col=2)
  lines(-sigt,col=2)
  title(model)
}  

Using Petrobras data as illustration

# Getting PBR data from August 10th 2000 to February 25th 2021.
getSymbols("PBR",from='2000-08-10',to='2021-02-26',warnings=FALSE,auto.assign=TRUE)    
## 'getSymbols' currently uses auto.assign=TRUE by default, but will
## use auto.assign=FALSE in 0.5-0. You will still be able to use
## 'loadSymbols' to automatically load data. getOption("getSymbols.env")
## and getOption("getSymbols.auto.assign") will still be checked for
## alternate defaults.
## 
## This message is shown once per session and may be disabled by setting 
## options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
## [1] "PBR"
n   = nrow(PBR)
pbr = as.numeric(PBR[,6])
y   = diff(log(pbr))
ind = trunc(seq(1,n,length=5))
date = c("Aug/10/00","Sep/30/05","Nov/17/10","Jan/07/16","Feb/25/18")

par(mfrow=c(1,1))
plot(pbr,xlab="Days",ylab="Prices",axes=FALSE,type="l")
axis(2);axis(1,at=ind,lab=date);box()

par(mfrow=c(1,1))
plot(y,xlab="Days",ylab="Returns",axes=FALSE,type="l")
axis(2);axis(1,at=ind,lab=date);box()

AutoRegressive Conditional Heteroskedastic (ARCH)

For all models considered in this set of notes, we assume that \[ y_t = \sigma_t \varepsilon_t \] where \(\varepsilon_t\) are iid \(D\) (Gaussian, Student’s \(t\), GED, etc), and the time-varying variances (or standard deviations) are modeled via one of the members of the large GARCH family of volatility models. The ARCH(1), for example, assumes that \[ \sigma_t^2 = \omega + \alpha_1 \varepsilon_{t-1}^2, \] with \(\varepsilon_0^2\) either estimated or fixed. See Engle (1992).

fit.arch  = garchFit(~garch(1,0),data=y,trace=F,include.mean=FALSE)
## Warning: Using formula(x) is deprecated when x is a character vector of length > 1.
##   Consider formula(paste(x, collapse = " ")) instead.
fit.arch
## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 0), data = y, include.mean = FALSE, 
##     trace = F) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 0)
## <environment: 0x7faa21233678>
##  [data = y]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1  
## 0.00070027  0.36978713  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  0.0007003   0.0000188    37.25   <2e-16 ***
## alpha1 0.3697871   0.0271330    13.63   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  10672.32    normalized:  2.065477 
## 
## Description:
##  Mon Mar  1 15:18:22 2021 by user:
fit.arch@fit$matcoef
##           Estimate   Std. Error  t value Pr(>|t|)
## omega  0.000700266 1.879722e-05 37.25370        0
## alpha1 0.369787134 2.713305e-02 13.62866        0
plot.sigt(y,fit.arch@sigma.t,"ARCH(1)")

Generalized ARCH (GARCH)

The GARCH(1,1) model extends the ARCH(1) model: \[ \sigma_t^2 = \omega + \alpha_1 \varepsilon_{t-1}^2 + \beta_1 \sigma_{t-1}^2. \] See Bollerslev (1986).

fit.garch = garchFit(~garch(1,1),data=y,trace=F,include.mean=F)    
## Warning: Using formula(x) is deprecated when x is a character vector of length > 1.
##   Consider formula(paste(x, collapse = " ")) instead.
fit.garch
## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 1), data = y, include.mean = F, 
##     trace = F) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 1)
## <environment: 0x7faa26555968>
##  [data = y]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1       beta1  
## 0.00002255  0.10316676  0.87680587  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  2.255e-05   3.785e-06    5.957 2.56e-09 ***
## alpha1 1.032e-01   8.948e-03   11.529  < 2e-16 ***
## beta1  8.768e-01   1.061e-02   82.647  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  11151.72    normalized:  2.158258 
## 
## Description:
##  Mon Mar  1 15:18:23 2021 by user:
fit.garch@fit$matcoef
##            Estimate   Std. Error   t value     Pr(>|t|)
## omega  2.254954e-05 3.785115e-06  5.957424 2.562444e-09
## alpha1 1.031668e-01 8.948398e-03 11.529076 0.000000e+00
## beta1  8.768059e-01 1.060910e-02 82.646582 0.000000e+00
plot.sigt(y,fit.garch@sigma.t,"GARCH(1,1)")

Taylor-Schwert GARCH (TS-GARCH)

The TS-GARCH(1,1) models the time-varying standard deviation: \[ \sigma_t = \omega + \alpha_1 |\varepsilon_{t-1}|+\beta_1 \sigma_{t-1}. \] See Taylor (1986) and Schwert (1989).

fit.tsgarch = garchFit(~garch(1,1),delta=1,data=y,trace=F,include.mean=F) 
## Warning: Using formula(x) is deprecated when x is a character vector of length > 1.
##   Consider formula(paste(x, collapse = " ")) instead.
fit.tsgarch 
## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 1), data = y, delta = 1, include.mean = F, 
##     trace = F) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 1)
## <environment: 0x7faa26799930>
##  [data = y]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1       beta1  
## 0.00075583  0.11204016  0.89000212  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  0.0007558   0.0001212    6.236 4.48e-10 ***
## alpha1 0.1120402   0.0078671   14.242  < 2e-16 ***
## beta1  0.8900021   0.0085450  104.155  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  11107.02    normalized:  2.149607 
## 
## Description:
##  Mon Mar  1 15:18:24 2021 by user:
fit.tsgarch@fit$matcoef
##            Estimate  Std. Error    t value     Pr(>|t|)
## omega  0.0007558288 0.000121196   6.236418 4.477045e-10
## alpha1 0.1120401613 0.007867134  14.241548 0.000000e+00
## beta1  0.8900021210 0.008545005 104.154663 0.000000e+00
plot.sigt(y,fit.tsgarch@sigma.t,"Taylor-Schwert-GARCH(1,1)")

Threshold GARCH (T-GARCH)

The T-GARCH(1,1) also models the time-varying standard deviation: \[ \sigma_t = \omega + \alpha_1 |\varepsilon_{t-1}|+\gamma_1|\varepsilon_{t-1}|I(\varepsilon_{t-1}<0)+\beta_1 \sigma_{t-1}. \] See Zakoian (1993).

fit.tgarch = garchFit(~garch(1,1),delta=1,leverage=T,data=y,trace=F,include.mean=F)
## Warning: Using formula(x) is deprecated when x is a character vector of length > 1.
##   Consider formula(paste(x, collapse = " ")) instead.
fit.tgarch 
## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 1), data = y, delta = 1, include.mean = F, 
##     leverage = T, trace = F) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 1)
## <environment: 0x7faa2604db98>
##  [data = y]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1      gamma1       beta1  
## 0.00072503  0.09640782  0.34587986  0.90265451  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  0.0007250   0.0001107    6.549 5.78e-11 ***
## alpha1 0.0964078   0.0075781   12.722  < 2e-16 ***
## gamma1 0.3458799   0.0464482    7.447 9.57e-14 ***
## beta1  0.9026545   0.0081170  111.206  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  11121.07    normalized:  2.152327 
## 
## Description:
##  Mon Mar  1 15:18:25 2021 by user:
fit.tgarch@fit$matcoef
##            Estimate   Std. Error    t value     Pr(>|t|)
## omega  0.0007250299 0.0001107019   6.549392 5.777179e-11
## alpha1 0.0964078218 0.0075780914  12.721913 0.000000e+00
## gamma1 0.3458798644 0.0464482074   7.446571 9.570122e-14
## beta1  0.9026545125 0.0081169915 111.205552 0.000000e+00
plot.sigt(y,fit.tgarch@sigma.t,"Threshold-GARCH(1,1)")

Glosten-Jaganathan-Runkle GARCH (GJR-GARCH)

The GJR-GARCH(1,1) model is similar to the T-GARCH(1,1), but it models time-varying variances instead: \[ \sigma_t^2 = \omega + \alpha_1 \varepsilon_{t-1}^2+\gamma_1\varepsilon_{t-1}^2I(\varepsilon_{t-1}<0)+\beta_1 \sigma_{t-1}^2. \] See Glosten, Jaganathan and Runkle (1993).

fit.gjrgarch = garchFit(~garch(1,1),delta=2,leverage=T,data=y,trace=F,include.mean=F)
## Warning: Using formula(x) is deprecated when x is a character vector of length > 1.
##   Consider formula(paste(x, collapse = " ")) instead.
fit.gjrgarch 
## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 1), data = y, delta = 2, include.mean = F, 
##     leverage = T, trace = F) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 1)
## <environment: 0x7faa26005a80>
##  [data = y]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1      gamma1       beta1  
## 0.00002327  0.09234234  0.20835026  0.88177597  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  2.327e-05   3.702e-06    6.286 3.26e-10 ***
## alpha1 9.234e-02   8.736e-03   10.570  < 2e-16 ***
## gamma1 2.084e-01   3.453e-02    6.033 1.61e-09 ***
## beta1  8.818e-01   1.042e-02   84.588  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  11174.01    normalized:  2.162572 
## 
## Description:
##  Mon Mar  1 15:18:26 2021 by user:
fit.gjrgarch@fit$matcoef
##            Estimate   Std. Error   t value     Pr(>|t|)
## omega  2.327038e-05 3.701966e-06  6.285952 3.258498e-10
## alpha1 9.234234e-02 8.736486e-03 10.569735 0.000000e+00
## gamma1 2.083503e-01 3.453312e-02  6.033345 1.605997e-09
## beta1  8.817760e-01 1.042432e-02 84.588322 0.000000e+00
plot.sigt(y,fit.gjrgarch@sigma.t,"GJR-GARCH(1,1)")

Asymmetric Power GARCH (AP-GARCH)

The AP-GARCH(1,1) (aka APARCH(1,1)) models \[ \sigma_t^{\delta} = \omega + \alpha_1 (|\varepsilon_{t-1}|-\gamma_1 \varepsilon_{t-1})^{\delta} + \beta_1 \sigma_{t-1}^{\delta}, \] for \(\delta>0\) and \(\gamma_1 \in (-1,1)\). Th AP-GARCH model includes several models as special cases.

See Ding, Granger and Engle (1993).

fit.aparch = garchFit(~aparch(1,1),data=y,trace=F,include.mean=F)   
## Warning: Using formula(x) is deprecated when x is a character vector of length > 1.
##   Consider formula(paste(x, collapse = " ")) instead.
fit.aparch 
## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~aparch(1, 1), data = y, include.mean = F, 
##     trace = F) 
## 
## Mean and Variance Equation:
##  data ~ aparch(1, 1)
## <environment: 0x7faa24cd1560>
##  [data = y]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1      gamma1       beta1       delta  
## 0.00016501  0.09899682  0.27133839  0.89274727  1.43605570  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  1.650e-04   2.586e-05    6.380 1.77e-10 ***
## alpha1 9.900e-02   8.596e-03   11.517  < 2e-16 ***
## gamma1 2.713e-01   4.682e-02    5.795 6.82e-09 ***
## beta1  8.927e-01   9.885e-03   90.309  < 2e-16 ***
## delta  1.436e+00   1.659e-01    8.657  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  11170.95    normalized:  2.16198 
## 
## Description:
##  Mon Mar  1 15:18:27 2021 by user:
fit.aparch@fit$matcoef
##            Estimate   Std. Error   t value     Pr(>|t|)
## omega  0.0001650064 2.586441e-05  6.379670 1.774705e-10
## alpha1 0.0989968209 8.595917e-03 11.516725 0.000000e+00
## gamma1 0.2713383903 4.681970e-02  5.795389 6.816290e-09
## beta1  0.8927472706 9.885427e-03 90.309425 0.000000e+00
## delta  1.4360557013 1.658848e-01  8.656944 0.000000e+00
plot.sigt(y,fit.aparch@sigma.t,"Asymmetric-Power-GARCH(1,1)")

Exponential GARCH model

The EGARCH(1,1) models \[ \log \sigma_t^2 = \omega + \alpha_1 \varepsilon_{t-1} + \gamma_1 |\varepsilon_{t-1}| + \beta_1 \log \sigma_{t-1}^2. \] See Nelson (1991).

fit=ugarchfit(ugarchspec(mean.model=list(armaOrder=c(0,0),include.mean=TRUE,archm=FALSE,archpow=1,arfima=FALSE,external.regressors=NULL,archex=FALSE),variance.model=list(model="eGARCH",garchOrder=c(1,1),submodel=NULL,external.regressors=NULL, variance.targeting = FALSE)),y)

fit
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : eGARCH(1,1)
## Mean Model   : ARFIMA(0,0,0)
## Distribution : norm 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error  t value Pr(>|t|)
## mu       0.00028    0.000271   1.0312  0.30242
## omega   -0.15392    0.017319  -8.8874  0.00000
## alpha1  -0.05549    0.007165  -7.7449  0.00000
## beta1    0.97741    0.002456 398.0038  0.00000
## gamma1   0.18138    0.013858  13.0883  0.00000
## 
## Robust Standard Errors:
##         Estimate  Std. Error  t value Pr(>|t|)
## mu       0.00028    0.000241   1.1624 0.245081
## omega   -0.15392    0.021538  -7.1464 0.000000
## alpha1  -0.05549    0.015588  -3.5597 0.000371
## beta1    0.97741    0.003376 289.4748 0.000000
## gamma1   0.18138    0.032601   5.5637 0.000000
## 
## LogLikelihood : 11173.14 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -4.3229
## Bayes        -4.3165
## Shibata      -4.3229
## Hannan-Quinn -4.3207
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                         statistic   p-value
## Lag[1]                      12.77 0.0003528
## Lag[2*(p+q)+(p+q)-1][2]     13.34 0.0002517
## Lag[4*(p+q)+(p+q)-1][5]     14.67 0.0005464
## d.o.f=0
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                      2.544  0.1107
## Lag[2*(p+q)+(p+q)-1][5]     3.958  0.2593
## Lag[4*(p+q)+(p+q)-1][9]     4.653  0.4822
## d.o.f=2
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[3]    0.4829 0.500 2.000  0.4871
## ARCH Lag[5]    1.6962 1.440 1.667  0.5423
## ARCH Lag[7]    1.8981 2.315 1.543  0.7389
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  1.6759
## Individual Statistics:              
## mu     0.21937
## omega  0.66809
## alpha1 0.09624
## beta1  0.67676
## gamma1 0.15870
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          1.28 1.47 1.88
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value    prob sig
## Sign Bias          0.02147 0.98287    
## Negative Sign Bias 2.03532 0.04187  **
## Positive Sign Bias 0.66007 0.50924    
## Joint Effect       7.85386 0.04913  **
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     82.42    7.099e-10
## 2    30     96.57    3.430e-09
## 3    40    109.94    1.118e-08
## 4    50    130.61    2.386e-09
## 
## 
## Elapsed time : 0.4086549
egarch.sigma.t = as.vector(sigma(fit)[,1])

plot.sigt(y,egarch.sigma.t,"EGARCH(1,1)")

Non-Gaussian GARCH models

The R function garchFit has the “cond.dist” option for the specification of conditional distributions. The alternative erro distributions are “dnorm”, “dged”, “dstd”, “dsnorm”, “dsged” and “dsstd”. Skewed ones: “dsnorm”, “dsged”, “dsstd”.

GARCH(1,1) with Student-t with degrees of freedom (shape) estimated

fit.garch.std = garchFit(~garch(1,1),cond.dist="std",data=y,trace=F,include.mean=F)
## Warning: Using formula(x) is deprecated when x is a character vector of length > 1.
##   Consider formula(paste(x, collapse = " ")) instead.
fit.garch.std
## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 1), data = y, cond.dist = "std", 
##     include.mean = F, trace = F) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 1)
## <environment: 0x7faa1ffcf078>
##  [data = y]
## 
## Conditional Distribution:
##  std 
## 
## Coefficient(s):
##      omega      alpha1       beta1       shape  
## 1.5546e-05  7.4290e-02  9.0947e-01  7.0426e+00  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  1.555e-05   3.422e-06    4.543 5.56e-06 ***
## alpha1 7.429e-02   9.281e-03    8.004 1.11e-15 ***
## beta1  9.095e-01   1.104e-02   82.376  < 2e-16 ***
## shape  7.043e+00   6.246e-01   11.275  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  11292.37    normalized:  2.185479 
## 
## Description:
##  Mon Mar  1 15:18:29 2021 by user:
fit.garch.std@fit$matcoef
##            Estimate   Std. Error   t value     Pr(>|t|)
## omega  1.554559e-05 3.422157e-06  4.542630 5.555671e-06
## alpha1 7.428964e-02 9.281450e-03  8.004099 1.110223e-15
## beta1  9.094674e-01 1.104046e-02 82.375826 0.000000e+00
## shape  7.042551e+00 6.246366e-01 11.274637 0.000000e+00
plot.sigt(y,fit.garch.std@sigma.t,"GARCH(1,1) with Student-t errors")

GARCH(1,1) with skewed Student-t with degrees of freedom (shape) and skewness estimated

fit.garch.sstd = garchFit(~garch(1,1),cond.dist="sstd",data=y,trace=F,include.mean=F)
## Warning: Using formula(x) is deprecated when x is a character vector of length > 1.
##   Consider formula(paste(x, collapse = " ")) instead.
fit.garch.sstd
## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 1), data = y, cond.dist = "sstd", 
##     include.mean = F, trace = F) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 1)
## <environment: 0x7faa25bf88a8>
##  [data = y]
## 
## Conditional Distribution:
##  sstd 
## 
## Coefficient(s):
##      omega      alpha1       beta1        skew       shape  
## 1.5154e-05  7.2989e-02  9.1130e-01  9.4067e-01  7.0107e+00  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  1.515e-05   3.345e-06    4.531 5.88e-06 ***
## alpha1 7.299e-02   9.118e-03    8.005 1.11e-15 ***
## beta1  9.113e-01   1.081e-02   84.299  < 2e-16 ***
## skew   9.407e-01   1.733e-02   54.267  < 2e-16 ***
## shape  7.011e+00   6.241e-01   11.233  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  11297.85    normalized:  2.186541 
## 
## Description:
##  Mon Mar  1 15:18:31 2021 by user:
fit.garch.sstd@fit$matcoef
##            Estimate   Std. Error   t value     Pr(>|t|)
## omega  1.515433e-05 3.344785e-06  4.530734 5.877901e-06
## alpha1 7.298927e-02 9.118017e-03  8.004950 1.110223e-15
## beta1  9.113007e-01 1.081031e-02 84.299247 0.000000e+00
## skew   9.406714e-01 1.733421e-02 54.266749 0.000000e+00
## shape  7.010659e+00 6.241307e-01 11.232677 0.000000e+00
plot.sigt(y,fit.garch.sstd@sigma.t,"GARCH(1,1) with skewed Student-t errors")

GARCH(1,1) with Student-t with degrees of freedom (shape) fixed at 7

fit.garch.std3 = garchFit(~garch(1,1),cond.dist="std",shape=7,include.shape=F,data=y,trace=F,include.mean=F)
## Warning: Using formula(x) is deprecated when x is a character vector of length > 1.
##   Consider formula(paste(x, collapse = " ")) instead.
fit.garch.std3 
## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 1), data = y, shape = 7, cond.dist = "std", 
##     include.mean = F, include.shape = F, trace = F) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 1)
## <environment: 0x7faa24548a28>
##  [data = y]
## 
## Conditional Distribution:
##  std 
## 
## Coefficient(s):
##      omega      alpha1       beta1  
## 1.5551e-05  7.4329e-02  9.0951e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  1.555e-05   3.426e-06    4.539 5.66e-06 ***
## alpha1 7.433e-02   9.282e-03    8.008 1.11e-15 ***
## beta1  9.095e-01   1.103e-02   82.443  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  11292.37    normalized:  2.185478 
## 
## Description:
##  Mon Mar  1 15:18:32 2021 by user:
fit.garch.std3@fit$matcoef
##            Estimate   Std. Error   t value     Pr(>|t|)
## omega  1.555099e-05 3.426409e-06  4.538568 5.663755e-06
## alpha1 7.432882e-02 9.281769e-03  8.008045 1.110223e-15
## beta1  9.095060e-01 1.103195e-02 82.442878 0.000000e+00
plot.sigt(y,fit.garch.std3@sigma.t,"GARCH(1,1) with Student-t errors & df=7")

GARCH(1,1) with Laplace (a GED with shape fixed at 1)

fit.garch.ged = garchFit(~garch(1,1),cond.dist="ged",shape=1,include.shape=F,data=y,trace=F,include.mean=F)
## Warning: Using formula(x) is deprecated when x is a character vector of length > 1.
##   Consider formula(paste(x, collapse = " ")) instead.
fit.garch.ged 
## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 1), data = y, shape = 1, cond.dist = "ged", 
##     include.mean = F, include.shape = F, trace = F) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 1)
## <environment: 0x7faa0c143a78>
##  [data = y]
## 
## Conditional Distribution:
##  ged 
## 
## Coefficient(s):
##      omega      alpha1       beta1  
## 2.0325e-05  9.3399e-02  9.0081e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  2.032e-05   5.167e-06    3.933 8.37e-05 ***
## alpha1 9.340e-02   1.342e-02    6.957 3.47e-12 ***
## beta1  9.008e-01   1.398e-02   64.417  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  11192.49    normalized:  2.166149 
## 
## Description:
##  Mon Mar  1 15:18:32 2021 by user:
fit.garch.ged@fit$matcoef
##            Estimate   Std. Error   t value     Pr(>|t|)
## omega  2.032529e-05 5.167275e-06  3.933465 8.373014e-05
## alpha1 9.339856e-02 1.342493e-02  6.957100 3.473444e-12
## beta1  9.008088e-01 1.398404e-02 64.416911 0.000000e+00
plot.sigt(y,fit.garch.ged@sigma.t,"GARCH(1,1) with GED errors")

Comparing the estimates of \(\sigma_t\)

sigma.t = cbind(fit.garch@sigma.t,
                fit.aparch@sigma.t,
                fit.tsgarch@sigma.t,
                fit.tgarch@sigma.t,
                fit.gjrgarch@sigma.t,
                egarch.sigma.t,
                fit.garch.std@sigma.t,
                fit.garch.std3@sigma.t,
                fit.garch.sstd@sigma.t,
                fit.garch.ged@sigma.t)

limy=range(sigma.t)

par(mfrow=c(1,1))
plot(sigma.t[,1],xlab="Days",ylab="Standard deviation",main="",type="l",ylim=limy,axes=FALSE)
axis(2);box();axis(1,at=ind,lab=date)
for (i in 2:6)
  lines(sigma.t[,i],col=i)
  legend("topright",col=1:6,lty=1,
          legend=c("GARCH","APARCH","TS-GARCH","T-GARCH","GJR-GARCH","EGARCH"))

par(mfrow=c(1,1))
plot(sigma.t[,1],xlab="Days",ylab="Standard deviation",main="",type="l",ylim=limy,axes=FALSE)
axis(2);box();axis(1,at=ind,lab=date)
lines(sigma.t[,7],col=2)
lines(sigma.t[,8],col=3)
lines(sigma.t[,9],col=4)
lines(sigma.t[,10],col=5)
legend("topright",legend=c("GARCH","GARCH t","GARCH t(3)","GARCH st","GARCH GED"),col=1:5,lty=1)

Comparing standardized errors

sigma.t = cbind(fit.garch@sigma.t,
                fit.aparch@sigma.t,
                fit.tsgarch@sigma.t,
                fit.tgarch@sigma.t,
                fit.gjrgarch@sigma.t,
                egarch.sigma.t,
                fit.garch.std@sigma.t,
                fit.garch.std3@sigma.t,
                fit.garch.sstd@sigma.t,
                fit.garch.ged@sigma.t)

names = c("GARCH","APARCH","TS-GARCH","T-GARCH","GJR-GARCH","EGARCH","GARCH t",
          "GARCH t(3)","GARCH st","GARCH GED")

for (i in 1:10){
  y1 = y/sigma.t[,i]
  shapiro.test(y1[(n-4999):n])
}

Cited references