Quant Memo
Core

SARIMA and Seasonal Models

An extension of ARIMA that adds a second set of autoregressive, differencing, and moving-average terms operating at the length of a repeating season — like 12 months or 4 quarters — so a model can capture both ordinary short-lag dynamics and recurring seasonal patterns at the same time.

Prerequisites: Stationarity, Autocorrelation and Serial Correlation

Retail sales spike every December, natural gas demand rises every winter, and quarterly earnings often show predictable patterns tied to the calendar. An ordinary ARIMA model, built to capture short-lag dependence (today relates to yesterday, or last week), completely misses this kind of structure — it has no notion that "12 months ago" is special in a way that "11 months ago" isn't. SARIMA (Seasonal ARIMA) fixes this by adding a second, parallel set of AR, differencing, and MA terms that operate specifically at the seasonal lag, so the model can capture both the ordinary short-run dynamics and the recurring seasonal pattern simultaneously.

An analogy: two clocks running at once

Think of a business with two overlapping rhythms: a fast one (this week versus last week — did we get a new client, was there a promotion) and a slow one (December versus every previous December). A model that only looks at the fast rhythm will keep getting fooled every holiday season, treating a predictable seasonal spike as if it were a surprising shock. SARIMA runs two clocks side by side: an ordinary ARIMA clock ticking at lag 1, 2, 3… for short-run dynamics, and a seasonal clock ticking at lag ss, 2s2s, 3s3s… (where ss is the season length, like 12 for monthly data) for the recurring pattern — and combines both into one forecast.

The model, one piece at a time

SARIMA is written ARIMA(p,d,q)(P,D,Q)s\text{ARIMA}(p,d,q)(P,D,Q)_s. The lowercase (p,d,q)(p,d,q) are the ordinary, non-seasonal AR order, differencing order, and MA order — exactly as in plain ARIMA. The uppercase (P,D,Q)s(P,D,Q)_s are the seasonal counterparts, applied at multiples of the seasonal period ss:

ΦP(Ls)ϕp(L)(1L)d(1Ls)DXt=ΘQ(Ls)θq(L)εt.\Phi_P(L^s)\,\phi_p(L)\,(1-L)^d(1-L^s)^D X_t = \Theta_Q(L^s)\,\theta_q(L)\,\varepsilon_t .

This looks dense, but each piece has a plain-English job: ϕp(L)\phi_p(L) and θq(L)\theta_q(L) are the familiar short-lag AR and MA polynomials; ΦP(Ls)\Phi_P(L^s) and ΘQ(Ls)\Theta_Q(L^s) are the same kind of polynomials but built from lags at s,2s,3ss, 2s, 3s\ldots, capturing "how does this January relate to last January, and the January before"; (1L)d(1-L)^d is ordinary differencing (removing a regular trend), and (1Ls)D(1-L^s)^D is seasonal differencing — subtracting the value from exactly one season ago, XtXtsX_t - X_{t-s}, which removes a recurring seasonal level shift the same way ordinary differencing removes a regular trend. In plain English: SARIMA models today's value as a combination of recent past values, recent past shocks, the same-season past values, and the same-season past shocks — letting a December be explained partly by November and partly by last December, at the same time.

Worked example 1: seasonal differencing by hand

Monthly retail sales (in $ millions) run 100, 102, 98, 250 (December spike), 103, 101… repeating a similar spike each December. Ordinary first differencing, XtXt1X_t - X_{t-1}, gives a huge +147 jump into December and a huge −147 drop right back out — the seasonal spike still dominates the differenced series, which is not stationary in any useful sense. Seasonal differencing at s=12s=12, XtXt12X_t - X_{t-12}, instead compares each December to last December: if this December is 250 and last December was 248, the seasonally differenced value is just +2 — small, because the predictable seasonal spike has been subtracted out entirely, leaving only the genuine year-over-year change.

Worked example 2: a SARIMA(1,0,0)(1,0,0)₁₂ forecast

Suppose a fitted model is Xt=0.3Xt1+0.6Xt120.18Xt13+εtX_t = 0.3 X_{t-1} + 0.6 X_{t-12} - 0.18 X_{t-13} + \varepsilon_t (this specific combination is what a SARIMA(1,0,0)(1,0,0)₁₂ model expands to, since the seasonal and non-seasonal AR terms multiply together). Given Xt1=105X_{t-1}=105, Xt12=250X_{t-12}=250 (last December), and Xt13=103X_{t-13}=103 (last November), the forecast is 0.3(105)+0.6(250)0.18(103)=31.5+15018.54=162.960.3(105) + 0.6(250) - 0.18(103) = 31.5 + 150 - 18.54 = 162.96. Notice the seasonal term dominates the forecast (+150 from last December alone) — this is exactly the behavior an ordinary ARIMA model, lacking any Xt12X_{t-12} term, could never produce, since it has no way to "remember" that December is special.

non-seasonal clock (p,d,q) t-1 t-2 t-3 seasonal clock (P,D,Q)ₛ₂ t-12 t-24 t-36
SARIMA blends two clocks into one forecast: a fast clock ticking at ordinary lags 1, 2, 3, and a slow clock ticking only at multiples of the season length s — here 12, 24, 36 months back.
Dec yr1 Dec yr2 Dec yr3
The same spike recurs every 12 months — a seasonal AR/differencing term at lag 12 captures this directly, something an ordinary short-lag ARIMA model has no way to represent.

What this means in practice

SARIMA is the workhorse for forecasting anything with a calendar-driven cycle: retail and e-commerce demand, seasonal commodity demand (natural gas, agricultural futures), and quarterly-reported financial metrics. Choosing ss correctly (12 for monthly data with an annual cycle, 4 for quarterly, 5 for daily trading-week effects) and checking whether seasonal differencing is actually needed (via the same ADF/KPSS logic used for ordinary differencing, applied at the seasonal lag) both come before fitting the AR and MA orders.

SARIMA extends ARIMA with a second set of AR, differencing, and MA terms operating at the length of a recurring season, letting a single model capture both ordinary short-lag dynamics and a calendar-driven cycle — seasonal differencing subtracts the value from exactly one season ago to remove a recurring spike the way ordinary differencing removes a trend.

A common mistake is applying ordinary (non-seasonal) differencing to a strongly seasonal series and declaring it stationary once the obvious trend is gone, while the seasonal spike is still fully present and untreated — the residuals will still show strong autocorrelation at lag ss, 2s2s, etc. Always check the autocorrelation function specifically at the seasonal lags (see Ljung-Box and Portmanteau Tests) before concluding a seasonal series has been adequately modeled, not just at the first few short lags.

Related concepts

Practice in interviews

Further reading

  • Box, Jenkins & Reinsel, Time Series Analysis: Forecasting and Control, ch. 9
ShareTwitterLinkedIn