Week 14 Discussion

Author

Jincheng Xie

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

library(rugarch)

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)) * 100

Original 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.