Volatility clustering, ARCH and GARCH — forecasting the forecastable
▸ 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 with standard white noise, and let the variance itself move:
Today's variance = a floor plus a fraction 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:
Three parameters, each with a job:
- — the trickle toward the long-run variance floor.
- — the news term: how hard the forecast reacts to yesterday's squared shock. Typically ~0.05–0.10 for daily equities.
- — the memory term: how much of yesterday's variance estimate carries over. Typically ~0.85–0.93.
The sum 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 , variance is mean-reverting with unconditional (long-run) level:
Worked example — take , , . Then and
(≈ 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 at rate .
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:
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 cardState the volatility-clustering stylized fact in one sentence.
⧉ Review cardWrite the GARCH(1,1) variance equation and name each term's job.
⧉ Review cardWhat is GARCH persistence and what is its typical equity value?
⧉ Review cardUnconditional GARCH variance: formula and the worked example.
⧉ Review cardWhy does volatility forecasting work when return forecasting doesn't?
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
- paperEngle (1982), Autoregressive Conditional Heteroscedasticity with Estimates of the Variance of UK Inflation, Econometrica 50(4)
- paperBollerslev (1986), Generalized Autoregressive Conditional Heteroskedasticity, Journal of Econometrics 31(3)
- bookTsay (2010), Analysis of Financial Time Series, 3e — §3