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, yt=φyt1+εty_t = \varphi\, y_{t-1} + \varepsilon_t, as you turn the persistence dial:

AR(1) & GARCH Explorer

The same 400 random shocks, replayed through different dynamics. Move a slider and only the process changes — never the luck.

Shock half-life
Persistence α + β
Reading

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:

rt=σtεt,σt2=ω+αrt12+βσt12r_t = \sigma_t \varepsilon_t, \qquad \sigma_t^2 = \omega + \alpha\, r_{t-1}^2 + \beta\, \sigma_{t-1}^2

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:

QuestionToolWatch out for
Is this series mean-reverting?Plot first, then ADF + KPSS togetherNear-unit roots; structural breaks masquerading as unit roots
Forecast a level (spread, volume, roll rate)ARIMA small, or regression with lagged termsRegime changes; seasonality; over-fitted orders
Forecast risk / volatilityGARCH(1,1), t-innovations for daily dataα + β ≈ 1 (integrated variance); asymmetry (bad news moves vol more — GJR/EGARCH)
Relate two trending seriesDifference both, or test cointegrationSpurious regression — always
Long-horizon scenario paths (IFRS 9, stress tests)Small structural/econometric systems, expert-adjustedFalse precision; the scenario matters more than the model

Where this connects

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.

Time Series for Finance (Jupyter notebook)
Free download — no signup required.
Download

Get new posts by email

One email per new article. No spam, no upsells, unsubscribe anytime.