[R-SIG-Finance] How are errors terms calculated in GARCH model by rugarch package?

Xie Yijun yijun.xie at stat.ubc.ca
Thu Jun 9 00:58:41 CEST 2016

Hi,

I am fitting a GARCH(1,1) model to the data and want to look at the
innovation distribution.

###################
#generate the data
set.seed(1)
N = 5000
omega = 0.5
alpha = 0.08
beta = 0.91
X1 = rep(0,N)
X2 = rep(0,N)
sig1 = rep(0,N)
sig2 = rep(0,N)

for(i in 2:N){
sig1[i] = sqrt(omega + alpha * X1[i-1] + beta * sig1[i-1]^2)
X1[i] = sig1[i] * rnorm(1)
sig2[i] = sqrt(omega + alpha * X2[i-1] + beta * sig2[i-1]^2)
X2[i] = sig2[i] * rt(1, df = 8)
}

X1 = X1[-c(1:1000)]
#################

I first generate the data and fit it to GARCH(1,1) model with t innovation.

########################
spec = ugarchspec(mean.model=list(armaOrder=c(0,0),include.mean=F),
distribution.model="std") # GARCH(1,1) model
myfit = ugarchfit(spec, X1)
########################

Suppose the fitted model is called myfit then I can get the error
terms by

###################
z1 = myfit at fit$z ################### However, if I only extract the parameters omega, alpha, and beta estimated by the rugarch package and calculate the error terms manually as$\sigma_t^2 = \omega + \alpha X_{t-1}^2 + \beta \sigma_{t-1}^2z_t = X_t / \sigma_t$The code is: ########################### omega1 = myfit at fit$coef[1]
alpha1 = myfit at fit$coef[2] beta1 = myfit at fit$coef[3]

z2 = rep(0,(N-1000))
sighat1 = rep(0,(N-1000))
sighat1[2] = 1
sighat1[1] = 1
for(i in 2:(N - 1000)){
sighat1[i] = sqrt(omega1 + alpha1 * X1[i-1] + beta1 * sighat1[i-1]^2)
z2[i] = X1[i]/sighat1[i]
}
###########################

I got very different results between these two approaches by comparing
the Q-Q plot of z1 and z2.

###########
qqnorm(z1)
qqline(z1)
qqnorm(z2)
qqline(z2)
###########

z1 seems to be normally distributed following the data generating
process, while z2 has a heavy tail following the model specification.
I was wondering why they are so different? I arbitrarily chose 1 for for
first two terms of $\hat{\sigma}$, so does the difference come from the
initial values?

And more generally, how does rugarch package fit the GARCH model and
choose initial values? My understanding is that we need to find
parameters using either QMLE or MLE and then find error terms
iteratively using my second approach. But I am not sure how is the
initial value chosen.

Thanks!
Patrick