# A note on simulation in the rugarch package.

In the rugarch package there are two main ways to simulate a GARCH process:

1. The ugarchsim method which takes an already estimated object of class uGARCHfit.
2. The ugarchpath method which takes a specification of class uGARCHspec with fixed parameters.

Before proceeding to a demonstration to show how to obtain equivalence between the 2, it is important to say a few words about the initialization of the simulation which has led to some confusion. Consider the typical GARCH(1,1) process:
$\begin{gathered} {y_{t + 1}} = {\mu _{t + 1}} + {\varepsilon _{t + 1}},{\text{ }}{\varepsilon _{t + 1}} = {z_{t + 1}}\sqrt {{h_{t + 1}}}\\ {h_{t + 1}} = \omega + {\alpha _1}\varepsilon _t^2 + {\beta _1}{h_t}\\ \end{gathered}$
Now assume that we wish to simulate $$t+1$$ given estimated information upto time $$t$$. As can be seen from the equation, we require a value for $$\varepsilon_{t}^2$$. In the rugarch package, the ugarchsim method has an option (‘startMethod’) of using either the estimated object’s last known values at time $$t$$ to initialize the simulation (“sample”) or their unconditional long run values (“unconditional”). In the former case, $$\varepsilon_{t}^2$$ is based on the last value from the estimated object, whilst in the latter case $$z_{t}$$ is set to zero which means that $$\varepsilon_{t}^2$$ is also zero. In either case, it is clear that there is no distributional ‘uncertainty’ in the value of $$h_{t+1}$$. At $$t+2$$ however, we need a value for $$\varepsilon_{t+1}^2$$ which we do not have from the estimated object which stops at time $$t$$ so that we need to use simulated $$z_{t+1}$$ from the standardized distribution used in conjunction with the value of $$h_{t+1}$$ calculated in the previous step, and hence the distributional uncertainty now enters the simulation.

The following code shows how to obtain equivalence between the 2 simulation methods.

data(sp500ret)
spec1 = ugarchspec()
fit = ugarchfit(spec1, sp500ret)
sim1 = ugarchsim(fit, n.sim = 1, m.sim = 5, startMethod = 'sample', rseed = 10)
spec2 = spec1
setfixed(spec2) < - as.list(coef(fit))
sim2 = ugarchpath(spec2, presigma = as.numeric(tail(sigma(fit), 1)), preresiduals = as.numeric(tail(residuals(fit),
1)), prereturns = tail(sp500ret[, 1], 1), n.sim = 1, m.sim = 5, rseed = 10)
sigma(sim1)
##       [,1]   [,2]   [,3]   [,4]   [,5]
## T+1 0.0248 0.0248 0.0248 0.0248 0.0248
# simulated sigma
sigma(sim1) == sigma(sim2)
##     [,1] [,2] [,3] [,4] [,5]
## T+1 TRUE TRUE TRUE TRUE TRUE
# simulated returns
fitted(sim1) == fitted(sim2)
##     [,1] [,2] [,3] [,4] [,5]
## T+1 TRUE TRUE TRUE TRUE TRUE


This short note described the simulation methods used in the rugarch package and its rational based on distributional uncertainty which does not affect $$h_{t+1}$$. There is also a method called ugarchboot which can take into account parameter uncertainty (via simulation of the parameter distribution) which then leads to uncertainty in the $$h_{t+1}$$ value.