library(rugarch)Week 14 Discussion
Part I
ARIMA model
An ARIMA((p,d,q)) model is used to model the conditional mean of a single time series. If the original series is (y_t), the differenced series is:
\[ z_t = (1-L)^d y_t \]
The ARIMA model can then be written as:
\[ z_t = c + \phi_1 z_{t-1} + \cdots + \phi_p z_{t-p} + \varepsilon_t + \theta_1 \varepsilon_{t-1} + \cdots + \theta_q \varepsilon_{t-q} \]
Here, (_i) terms capture autoregressive effects, while (_j) terms capture moving-average effects. In short, ARIMA predicts a variable using its own past values and past shocks.
ADL model
An ADL((p,q)) model extends the autoregressive idea by adding an external explanatory variable and its lags:
\[ y_t = \alpha + \sum_{i=1}^{p}\phi_i y_{t-i} + \sum_{j=0}^{q}\beta_j x_{t-j} + u_t \]
Compared with ARIMA, ADL is more useful when the aim is to explain how another variable, (x_t), affects (y_t) over time. It still uses lagged values of the dependent variable, but it also includes distributed lag effects from the explanatory variable.
ARCH model
ARCH shifts the focus from the conditional mean to the conditional variance. A simple mean equation is:
\[ y_t = \mu + u_t, \qquad u_t = \sigma_t z_t, \qquad z_t \sim N(0,1) \]
The ARCH((q)) variance equation is:
\[ \sigma_t^2 = \omega + \sum_{i=1}^{q}\alpha_i u_{t-i}^2 \]
This means current volatility depends on past squared shocks. Large past shocks increase the current conditional variance, which helps explain volatility clustering.
GARCH model
GARCH extends ARCH by adding lagged conditional variance terms. A general GARCH model can be written as:
\[ \sigma_t^2 = \omega + \sum_{i=1}^{q}\alpha_i u_{t-i}^2 + \sum_{j=1}^{p}\beta_j \sigma_{t-j}^2 \]
For the GARCH(1,1) model used later in this discussion, the variance equation becomes:
\[ \sigma_t^2 = \omega + \alpha_1 u_{t-1}^2 + \beta_1 \sigma_{t-1}^2 \]
Here, (_1) measures how strongly new shocks affect current volatility, while (_1) measures how much past volatility carries forward.
Connections between the models
The four models all use lagged information, but they apply it to different parts of the time series problem. ARIMA models the conditional mean of one variable using its own history. ADL also models the conditional mean, but adds another variable and its lags. ARCH and GARCH shift the focus from the mean to the conditional variance.
| Model | Main object modelled | Main source of dynamics |
|---|---|---|
| ARIMA | Conditional mean of one series | Past values and past shocks |
| ADL | Conditional mean with an external driver | Past values of (y_t) and (x_t) |
| ARCH | Conditional variance | Past squared shocks |
| GARCH | Conditional variance | Past squared shocks and past variance |
These models can also be combined. For example, a GARCH model may include an ARMA mean equation. In the empirical example below, I use a constant mean equation so that the focus stays on the GARCH variance equation.
Part II. GARCH(1,1) model example
Setup
Data choice and transformation
I use the DAX index from the built-in EuStockMarkets dataset. I first plot the index level as the original time series, then transform it into daily log returns:
\[ r_t = 100 \times \Delta \log(P_t) \]
where (P_t) is the DAX index level.
data(EuStockMarkets)
dax <- EuStockMarkets[, "DAX"]
dax_return <- diff(log(dax)) * 100Original time series
plot.ts(
dax,
main = "DAX Index Level",
xlab = "Time",
ylab = "Index level"
)The DAX index level shows a clear upward trend over time, so it is not suitable for direct GARCH modelling. I therefore use daily log returns for the GARCH model, since returns are more appropriate for modelling time-varying volatility.
Return series used for the GARCH model
plot.ts(
dax_return,
main = "DAX Daily Log Returns",
xlab = "Time",
ylab = "Log returns (%)"
)The return series fluctuates around a relatively stable mean, but the size of the fluctuations changes over time. Periods of large movements appear close together, which suggests volatility clustering and makes a GARCH model suitable.
Estimating the GARCH(1,1) model
I estimate a GARCH(1,1) model with a constant mean equation. The mean equation is:
\[ r_t = \mu + u_t, \qquad u_t = \sigma_t z_t, \qquad z_t \sim N(0,1) \]
The variance equation is:
\[ \sigma_t^2 = \omega + \alpha_1 u_{t-1}^2 + \beta_1 \sigma_{t-1}^2 \]
spec <- ugarchspec(
variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(0, 0), include.mean = TRUE),
distribution.model = "norm"
)
fit <- ugarchfit(spec = spec, data = dax_return)The model is estimated using rugarch. The key estimates are extracted from the fitted model below.
Reconciling textbook and software notation
The software output uses notation that can differ from textbook notation. In textbook form, a GARCH(1,1) model can be written as:
\[ R_t = \beta_0 + u_t, \qquad u_t \sim N(0, \sigma_t^2) \]
\[ \sigma_t^2 = \alpha_0 + \alpha_1 u_{t-1}^2 + \phi_1 \sigma_{t-1}^2 \]
In rugarch notation, the same model is reported as:
\[ r_t = \mu + u_t \]
\[ \sigma_t^2 = \omega + \alpha_1 u_{t-1}^2 + \beta_1 \sigma_{t-1}^2 \]
Therefore, (_0) in textbook notation corresponds to mu, (_0) corresponds to omega, and (_1) corresponds to beta1. The (_1) term has the same interpretation in both systems.
Estimated coefficients from the software
coefs <- coef(fit)
mu <- as.numeric(coefs["mu"])
omega <- as.numeric(coefs["omega"])
alpha1 <- as.numeric(coefs["alpha1"])
beta1 <- as.numeric(coefs["beta1"])
fmt <- function(x) sprintf("%.6f", as.numeric(x))
coef_table <- data.frame(
Coefficient = c("mu", "omega", "alpha1", "beta1"),
Estimate = c(mu, omega, alpha1, beta1),
Meaning = c(
"Constant in the mean equation",
"Constant in the variance equation",
"Effect of the previous squared shock",
"Effect of the previous conditional variance"
)
)
knitr::kable(coef_table, digits = 6, row.names = FALSE)| Coefficient | Estimate | Meaning |
|---|---|---|
| mu | 0.065353 | Constant in the mean equation |
| omega | 0.047563 | Constant in the variance equation |
| alpha1 | 0.068454 | Effect of the previous squared shock |
| beta1 | 0.887569 | Effect of the previous conditional variance |
These are the key software estimates used to update the mean and variance equations below.
Updated numerical equations
The software estimates can now be inserted into the two-equation GARCH(1,1) system. In the mean equation, mu is the estimated constant mean return. In the variance equation, omega is the variance constant, alpha1 is the coefficient on the previous squared shock, and beta1 is the coefficient on the previous conditional variance.
The updated mean equation is:
\[ r_t = 0.065353 + u_t \]
The updated variance equation is:
\[ \sigma_t^2 = 0.047563 + 0.068454u_{t-1}^2 + 0.887569\sigma_{t-1}^2 \]
Volatility persistence, long-run variance and mean reversion
For a GARCH(1,1) model, volatility persistence is measured by:
\[ \alpha_1 + \beta_1 \]
If this value is below 1, the volatility process is mean-reverting and the long-run variance is:
\[ \frac{\omega}{1-\alpha_1-\beta_1} \]
persistence <- alpha1 + beta1
long_run_variance <- if (persistence < 1) {
omega / (1 - persistence)
} else {
NA_real_
}
long_run_sd <- sqrt(long_run_variance)
persistence_table <- data.frame(
Quantity = c(
"Persistence",
"Long-run variance",
"Long-run standard deviation"
),
Value = c(
persistence,
long_run_variance,
long_run_sd
)
)
knitr::kable(persistence_table, digits = 6, row.names = FALSE)| Quantity | Value |
|---|---|
| Persistence | 0.956022 |
| Long-run variance | 1.081526 |
| Long-run standard deviation | 1.039964 |
The estimated persistence is 0.956022. Since this value is below 1, the fitted volatility process is mean-reverting. However, it is still close to 1, so volatility shocks are likely to fade slowly rather than disappear immediately. The long-run standard deviation is about 1.039964 percentage points per day because the return series is measured in percentages.
Interpretation of coefficients
The estimated mean coefficient, (= 0.065353), is the constant daily log return in the mean equation. Since this example is mainly about volatility rather than return prediction, the variance equation is more important.
The variance constant, (= 0.047563), contributes to the baseline level of conditional variance. It should be interpreted together with the ARCH and GARCH terms rather than on its own.
The ARCH term, (_1 = 0.068454), measures how strongly a previous squared shock affects current volatility. A positive value means that a large unexpected return movement increases the next period’s conditional variance.
The GARCH term, (_1 = 0.887569), measures how much past conditional variance carries forward. In this model, (_1) is much larger than (_1), so volatility persistence is driven mainly by lagged variance rather than by the immediate shock term.
The persistence value is (_1 + _1 = 0.956022). Since it is below 1, the fitted volatility process is mean-reverting and has a finite long-run variance. However, the value is still close to 1, so volatility shocks are likely to fade slowly. This supports the visual evidence of volatility clustering in the return series.
Short conclusion
Overall, ARIMA and ADL mainly model conditional mean dynamics, while ARCH and GARCH model conditional variance dynamics. In the empirical example, the DAX daily return series shows volatility clustering, so a GARCH(1,1) model is appropriate. The estimated coefficients suggest strong volatility persistence, a finite long-run variance, and slow mean reversion.