13 — Advanced Models

GARCH#

AdvancedStatistical 1 min read
◆ The PatternModeling volatility that clusters

Financial returns exhibit volatility clustering — calm periods and turbulent periods tend to persist. GARCH(1,1) models the conditional variance as a function of past squared returns and past variance, capturing this self-exciting behaviour.

σ2t = ω + αε2t−1 + βσ2t−1
α captures the reaction to recent shocks. β captures persistence of volatility. α + β close to 1 means high persistence.
// Interactive — GARCH volatility clustering
α (reaction)0.10
β (persistence)0.85
Pattern bridge: GARCH is the quantitative foundation behind Value-at-Risk calculations and Bollinger Bands. The same volatility clustering appears in heteroscedastic data across ML problems.
Worked example

GARCH(1,1) with ω = 0.05, α = 0.10 and β = 0.85 has a long-run variance of ω/(1 − α − β) = 1, and a volatility shock halves in 13.5 days. Simulated returns are fat-tailed — kurtosis 3.58 against 3 for a normal — even though every day’s shock is normal. Clustering alone produces fat tails.

Where it misleads
  • GARCH(1,1) is hard to beat (Hansen & Lunde 2005), but it reacts to large moves after they happen; it does not foresee them.
  • Persistence close to 1 may be an artefact of structural breaks in the data.
  • Symmetric GARCH misses the leverage effect: falls raise volatility more than rises (EGARCH, GJR).
In code
rng = np.random.default_rng(7)
omega, alpha, beta, n = 0.05, 0.10, 0.85, 20_000
long_run = omega / (1 - alpha - beta)
half_life = np.log(0.5) / np.log(alpha + beta)     # days for a volatility shock to halve
r, s2 = np.zeros(n), np.full(n, long_run)
for t in range(1, n):
    s2[t] = omega + alpha * r[t - 1] ** 2 + beta * s2[t - 1]
    r[t] = np.sqrt(s2[t]) * rng.normal()
kurt = ((r - r.mean()) ** 4).mean() / r.var() ** 2   # normal = 3
Python, in your browser — edit the code and run it again

Assumes import numpy as np and import pandas as pd. Each snippet simulates or makes up its own series, as the comments say.

The same idea with a library
# Python — GARCH(1,1)
from arch import arch_model

model = arch_model(returns, vol='Garch', p=1, q=1)
result = model.fit(disp='off')
print(result.summary())
# Forecast next 5 periods of volatility
fcast = result.forecast(horizon=5)
Sources
  • R. F. Engle, “Autoregressive Conditional Heteroscedasticity with Estimates of the Variance of United Kingdom Inflation”, Econometrica 50(4), 1982
  • T. Bollerslev, “Generalized Autoregressive Conditional Heteroskedasticity”, Journal of Econometrics 31(3), 1986
  • P. R. Hansen & A. Lunde, “A Forecast Comparison of Volatility Models: Does Anything Beat a GARCH(1,1)?”, Journal of Applied Econometrics 20(7), 2005

Last reviewed October 2026 · How this site checks its content · Report a mistake

Check yourself

1. What does a GARCH model describe?

Show answer

C. GARCH captures volatility clustering: calm periods and turbulent periods each tend to persist.

2. In a GARCH(1,1), α + β is close to 1. What does that mean?

Show answer

C. α + β sets how fast a shock to variance decays back to its long-run level. Daily equity returns typically give values around 0.97–0.99.

3. Returns show no autocorrelation, but squared returns do. What does that say?

Show answer

B. This is the stylised fact GARCH was built for (Engle 1982, Bollerslev 1986).

Linked from 4
← Previous
State-Space Models
Open in the full reader, with the topic sidebar