QTQuant Terminal
D1-07D1·intermediate·~23 min

Volatility clustering, ARCH and GARCH — forecasting the forecastable

time-seriesvolatilityarchgarchvol-clusteringvol-targetingrisk

▸ Pretest — guess, even if you don't know

Daily stock returns show almost zero autocorrelation, yet SQUARED daily returns show strong positive autocorrelation out to many lags. What does this pair of facts mean?

The one stylized fact that pays

Recall the D1-01 experiment: the ACF of daily returns is a flatline of statistical dust, but the ACF of squared returns is significantly positive for weeks. Markets have weather. Vol-quiet regimes (2017) and vol-storms (2008, March 2020) each persist. A2-02 treated volatility as one number per asset; the truth is it's a time series — and a strongly autocorrelated one, which by everything in this track means a forecastable one.

Formally: returns are (nearly) white noise, but they are not independent — the variance of tomorrow's return depends on what happened today. The models below make that dependence explicit.

ARCH: variance with a memory

Engle's 1982 idea — write today's return as rt=σtεtr_t = \sigma_t \varepsilon_t with εt\varepsilon_t standard white noise, and let the variance itself move:

σt2=ω+αrt12\sigma_t^2 = \omega + \alpha\, r_{t-1}^2

Today's variance = a floor ω\omega plus a fraction α\alpha of yesterday's squared shock. A big move yesterday (either sign — it's squared) raises today's expected variance; a quiet day lowers it. That single mechanism produces vol clustering and fat tails from perfectly normal shocks: a mixture of calm days and wild days has more extreme outcomes than one fixed-vol normal (the B1 fat-tails fact, derived rather than assumed).

Pure ARCH has short memory — one bad day is forgotten in one step unless you pile on many lags. The fix is the same trick that took AR to ARMA in D1-05: add a recursive term.

GARCH(1,1): the workhorse

Bollerslev's generalization adds yesterday's variance to the recipe:

σt2=ω+αεt12+βσt12\sigma_t^2 = \omega + \alpha\, \varepsilon_{t-1}^2 + \beta\, \sigma_{t-1}^2

Three parameters, each with a job:

The sum α+β\alpha + \beta is the persistence — the AR(1)-style decay rate of variance shocks (D1-04 intuition applies directly). For daily equity indexes it's typically 0.95–0.99: a volatility spike decays with a half-life of weeks, not days. That slow decay is the clustering.

The long-run anchor

If α+β<1\alpha + \beta < 1, variance is mean-reverting with unconditional (long-run) level:

σˉ2=ω1αβ\bar{\sigma}^2 = \frac{\omega}{1 - \alpha - \beta}

Worked example — take ω=0.00001\omega = 0.00001, α=0.08\alpha = 0.08, β=0.90\beta = 0.90. Then 1αβ=0.021 - \alpha - \beta = 0.02 and

σˉ2=0.000010.02=0.0005σˉ=0.00052.24% per day\bar{\sigma}^2 = \frac{0.00001}{0.02} = 0.0005 \quad\Rightarrow\quad \bar{\sigma} = \sqrt{0.0005} \approx 2.24\% \text{ per day}

(≈ 35% annualized — a high-vol stock.) Every GARCH forecast is a weighted tug-of-war between the latest shock and this anchor: short-horizon forecasts track recent turbulence, long-horizon forecasts glide back to σˉ\bar\sigma at rate (α+β)h(\alpha+\beta)^h.

Why this works when return forecasting doesn't — and what to do with it

Return forecasting fights the market: any exploitable pattern in direction is someone else's free money, so it gets arbitraged toward zero (D1-02). Volatility is different — knowing tomorrow will be turbulent doesn't tell you which way, so the pattern isn't directly an arbitrage and nobody trades it away. High squared-return autocorrelation survives decades of being public knowledge.

The practical payoff is position sizing, not stock picking: vol targeting. Size positions inversely to forecast vol — half the vol forecast, twice the position; double the vol forecast, half the position — so the dollar risk you carry stays roughly constant through calm and storm. It's the quant version of an old floor rule: trade smaller when the market is screaming. The full recipe, plus GARCH's pragmatic little sibling that most desks actually use, is the next lesson.

Try it

Iterate the GARCH(1,1) variance recursion by hand — the model is just a three-term loop:

▮ EXERCISE · d1-07-ex1

Implement garch_variance_path(returns, omega, alpha, beta, initial_var): an array the same length as returns where var[0] = initial_var and var[t] = omega + alpha*returns[t-1]**2 + beta*var[t-1] for t >= 1. Returns act as the shocks.

⧉ Review card
State the volatility-clustering stylized fact in one sentence.
Daily returns are nearly uncorrelated, but squared returns are strongly positively autocorrelated — the direction of returns is unpredictable while their magnitude persists in calm and stormy regimes.
⧉ Review card
Write the GARCH(1,1) variance equation and name each term's job.
var[t] = omega + alpha*shock[t-1]^2 + beta*var[t-1]. Omega: trickle toward the long-run floor. Alpha: reaction to yesterday's news (~0.05-0.10 daily equities). Beta: memory of yesterday's variance (~0.85-0.93).
⧉ Review card
What is GARCH persistence and what is its typical equity value?
alpha + beta — the decay rate of variance shocks, exactly like an AR(1) coefficient on variance. Typically 0.95-0.99 for daily equity data, so vol spikes decay with a half-life of weeks.
⧉ Review card
Unconditional GARCH variance: formula and the worked example.
omega / (1 - alpha - beta), valid when alpha + beta < 1. With omega 0.00001, alpha 0.08, beta 0.90: 0.00001/0.02 = 0.0005, so daily vol is sqrt(0.0005), about 2.24%.
⧉ Review card
Why does volatility forecasting work when return forecasting doesn't?
A predictable return direction is an arbitrage and gets traded away; predictable variance is not directional, so no trade erases it. The payoff is position sizing: vol targeting scales positions inversely to forecast vol to keep dollar risk constant.

Explain it

Write three or four sentences, from memory, explaining to a fellow developer why a GARCH variance forecast is basically an AR(1) on squared shocks — cover what plays the role of the AR coefficient, what mean it reverts to, and why the half-life logic from D1-04 carries over.

Predict before the next lesson

Next is D1-08: EWMA and practical vol — the one-parameter shortcut most trading desks actually run. Predict: if you set omega = 0 and force alpha + beta = 1 in GARCH(1,1), what happens to the unconditional variance formula — and what might that imply about the model's long-horizon forecasts?

◈ Calibration check

Could you write down the GARCH(1,1) equation from memory, compute the unconditional variance for given parameters, and explain why vol is forecastable when returns aren't?

1 = guessing · 5 = could teach it

⏻ End of lesson

Mark it read to book its 5 review cards into your deck.

Sources & further reading