Time Series for Finance: Stationarity, ARIMA, GARCH
The three ideas that keep financial time-series work honest: know whether your series mean-reverts, model levels and volatility as different problems, and never trust an R² on two trending series.
Financial data arrives as time series, and time series break most of the intuitions that cross-sectional statistics taught you. This module is the minimum machinery for not fooling yourself: what stationarity actually means and how to test it, what ARIMA is genuinely good for in finance (less than you’d think), and the one time-series model that earns its keep everywhere — GARCH — because volatility clustering is the most reliable stylized fact markets have.
Stationarity: the license to do statistics
A (weakly) stationary series has a stable mean, a stable variance, and autocovariances that depend only on the lag — in plain terms, the future resembles the past in distribution. Every average, regression, and confidence interval you compute implicitly assumes it. The canonical non-stationary object in finance is the random walk: prices, exchange rates, index levels. Shocks to a random walk are permanent — there is no mean to revert to — and statistics computed on it are statements about one particular path, not about a process.
Build the intuition physically. The widget replays the same 400 shocks through an AR(1) process, , as you turn the persistence dial:
Walk φ up from 0.5 to 0.85 to 0.99 to 1.00. Three things to notice. First, how late the qualitative change happens: at φ = 0.95 the series still mean-reverts, just slowly — the half-life readout is the honest summary. Second, at exactly 1.00 the character breaks: excursions stop being excursions and become the new neighborhood. Third — the deep small-sample problem — over 400 observations, φ = 0.98 and φ = 1.00 look very similar. That visual difficulty is precisely why unit-root testing is statistically hard, and why you should never let a test overrule a plot plus economic reasoning about whether the series has a mean to revert to.
The standard tests come as a complementary pair, and the professional habit is running both: ADF (null: unit root — rejection is evidence of stationarity) and KPSS (null: stationary — rejection is evidence against). ADF-rejects + KPSS-doesn’t = comfortably stationary; the reverse = comfortably not; both ambiguous = welcome to near-unit-root finance, proceed with judgment.
The fix, when you need one, is differencing: prices → returns, index levels → changes, and for strongly trending fundamentals, log-differences (growth rates). That single transformation is the “I” in ARIMA, and choosing it is 80% of the modeling decision.
ARIMA: useful, in the right narrow lane
ARIMA(p, d, q) — autoregressive terms, differencing, moving-average terms — is the classical forecasting toolkit, and honesty about its role in finance matters. For returns, it’s nearly useless by construction: if returns had strong, stable autocorrelation, trading it away would be free money, so the market keeps returns close to white noise. The efficient-markets argument is, quietly, a statement about ARMA structure.
Where ARIMA-class models genuinely earn their place is everything that isn’t a traded return: rates and spreads (mean-reverting by economic mechanism — credit spreads can only wander so far before default or refinancing pins them), volumes, deposits, and utilization (operational series with momentum and seasonality), delinquency roll rates and other credit-book aggregates, and macro inputs feeding IFRS 9 scenario models. The Box-Jenkins ritual — plot, difference to stationarity, read ACF/PACF, fit small, check residuals are white — survives because it forces you to look at the series before modeling it. Keep p and q tiny; in finance, an ARIMA(1,1,1) that you understand beats an auto-fitted (5,1,4) that memorized one regime.
GARCH: modeling the risk, not the return
Now the fact that makes finance time series special. Returns are nearly unpredictable in level — but their magnitude is strongly predictable. Big-move days cluster; calm stretches persist. Squared returns are significantly autocorrelated even when returns aren’t. Volatility clustering is visible in every asset class, every era, every frequency.
GARCH(1,1) is the minimal model of that fact:
Today’s variance = a floor, plus a reaction to yesterday’s surprise (α), plus memory of yesterday’s variance (β). Switch the widget above to GARCH mode and move the dials: α is how violently volatility responds, β is how long it remembers, and their sum is the persistence of risk. Typical daily-equity estimates sit near α ≈ 0.08, β ≈ 0.90 — persistence around 0.98, meaning a volatility shock decays with a half-life of weeks. The shaded ±2σ band in the widget is the object of interest: a forecastable risk envelope around unforecastable returns.
Three practical consequences. Risk models: a VaR that ignores clustering (unconditional volatility) is too loose in calm markets and lethally tight in stressed ones; GARCH-style conditioning is the standard fix. Fat tails, explained in part: even with normal shocks, GARCH’s mixing of variances produces unconditionally fat-tailed returns — a big chunk of the EDA post’s fat-tail gotcha is clustering in disguise (the rest needs genuinely heavy-tailed shocks — a Student-t innovation, echoing the copula module’s lesson that Gaussians underestimate extremes). Credit is downstream of volatility: Merton PDs (Module 6) take volatility as a direct input, so a GARCH view of equity volatility propagates straight into point-in-time default risk.
The notebook implements GARCH(1,1) from scratch — the likelihood is ten lines, and fitting it by maximum likelihood with scipy.optimize demystifies the whole exercise — then verifies against simulated data and shows the volatility forecast decaying toward its long-run level.
When to use what
A field guide, by the question you’re actually asking:
| Question | Tool | Watch out for |
|---|---|---|
| Is this series mean-reverting? | Plot first, then ADF + KPSS together | Near-unit roots; structural breaks masquerading as unit roots |
| Forecast a level (spread, volume, roll rate) | ARIMA small, or regression with lagged terms | Regime changes; seasonality; over-fitted orders |
| Forecast risk / volatility | GARCH(1,1), t-innovations for daily data | α + β ≈ 1 (integrated variance); asymmetry (bad news moves vol more — GJR/EGARCH) |
| Relate two trending series | Difference both, or test cointegration | Spurious regression — always |
| Long-horizon scenario paths (IFRS 9, stress tests) | Small structural/econometric systems, expert-adjusted | False precision; the scenario matters more than the model |
Where this connects
- Stationarity is the time-series formalization of Module 1’s regime-change gotcha; the walk-forward validation that respects time ordering is Module 5 of this track.
- GARCH volatility feeds Merton PDs directly, and clustering in risk is the time-series face of the correlation story in credit Module 10 — bad periods are shared, in time as in cross-section.
- Autocorrelated, drifting series are also what make production model monitoring hard — Module 6 inherits everything here.
Try it yourself
The notebook below runs the full argument on simulated and real-shaped data: random walks vs. AR(1) side by side with ADF/KPSS output, the spurious-regression experiment (watch unrelated walks produce t-stats above 10), ACF/PACF reading practice, and a from-scratch GARCH(1,1) — likelihood, MLE fit, parameter recovery on simulated data, and a decaying volatility forecast. Every model is small enough to read in one sitting.
Get new posts by email
One email per new article. No spam, no upsells, unsubscribe anytime.