Seasonality and Decomposition
Splitting a time series into a slow-moving trend, a repeating seasonal pattern, and leftover noise. The first thing to do before you model or trade a series that has a calendar in it.
Prerequisites: Stationarity
Lots of real series have a calendar baked into them. Retail sales spike every December. Electricity demand rises each summer. Trading volume sags in August and around holidays. If you model such a series without accounting for the calendar, the seasonal wiggle masquerades as signal and wrecks your forecasts. Decomposition is the fix: pull the series apart into a few interpretable pieces so you can see, and remove, the part that is just the calendar repeating itself.
The three pieces
A decomposition splits an observed series into a trend (the slow drift up or down), a seasonal component (the pattern that repeats every fixed period, month, week, quarter), and a residual (everything left over, the irregular noise). The two standard ways to combine them:
Use the additive form when the size of the seasonal swing is roughly constant regardless of the level. Use the multiplicative form when the swing grows with the level, December's bump is $50 million when sales are small but $500 million when they are large. A neat trick: take logs of a multiplicative series and it becomes additive, so you can always work in the additive world if you prefer.
Split a series into trend + seasonal + residual (or their product). Removing the seasonal piece is what lets you see the real trend and turning points, everything else is the calendar repeating itself.
Worked example: quarterly seasonal indices
Three years of quarterly sales, in millions:
| Year | Q1 | Q2 | Q3 | Q4 |
|---|---|---|---|---|
| 1 | 80 | 100 | 90 | 130 |
| 2 | 90 | 110 | 100 | 140 |
| 3 | 100 | 120 | 110 | 150 |
The overall average is . A quick additive seasonal index is each quarter's average minus the grand average:
- Q1 average , index .
- Q2 average , index .
- Q3 average , index .
- Q4 average , index .
So Q4 runs $20M above a typical quarter and Q1 runs $20M below. To deseasonalize Year 3 Q4, subtract its index: . Compared with the deseasonalized Q1 (), you can now see the underlying level actually rose, a fact the raw jump exaggerated because Q4 is always high. That corrected series is what you feed into a trend model or trade on.
Choose additive vs multiplicative by eyeballing the swing: if the seasonal peaks get taller as the level rises, it is multiplicative, take logs first to turn it additive, then decompose.
Common mistakes
- Confusing seasonal with real news. A December sales record is not a breakout if December is always the best month; judge it against the deseasonalized series.
- Assuming the pattern is frozen. Seasonality drifts, shopping shifts online, energy use changes with climate. Rigid fixed factors go stale; methods like STL let the seasonal shape evolve slowly.
- Moving holidays and calendar quirks. Easter, Ramadan, Chinese New Year, and leap years slide around the calendar and smear simple month-based factors. Real pipelines add explicit holiday adjustments.
- Over-differencing. Seasonal differencing (subtracting the value one year ago) can remove seasonality but also strip out trend and inject noise if applied blindly. Decompose and inspect first.
Do not read a seasonal high as a signal. Always compare against the deseasonalized series, and remember the seasonal pattern itself can drift over the years, so refresh your factors rather than trusting numbers estimated a decade ago.
Decomposition is the setup step for most seasonal work: once the calendar is stripped out you can fit an ARMA model or an exponential-smoothing forecast to the remainder, and it pairs directly with checking Stationarity and with calendar-driven trading effects like Seasonality Effects.
Related concepts
Practice in interviews
Further reading
- Cleveland et al. (1990), STL: A Seasonal-Trend Decomposition Procedure
- Hyndman & Athanasopoulos, Forecasting: Principles and Practice (Ch. 3)
- Box, Jenkins & Reinsel, Time Series Analysis