Holt–Winters Seasonal Method
Simple exponential
smoothing is wonderful for a flat, noisy series — and hopeless the moment the series
climbs or repeats. Real business data almost always does both: an airline's monthly
passenger numbers grow year on year and surge every summer; electricity demand trends upward
and spikes each winter. Forecast that with SES and you get a flat line that is perpetually too
low and blind to the season.
The Holt–Winters method fixes both. It keeps SES's cheap error-correction machinery but
tracks three evolving pieces instead of one — a level, a trend, and a seasonal pattern — each
smoothed by its own constant. It is the workhorse of practical seasonal forecasting, the default in
countless supply-chain and demand-planning systems.
Step one: Holt's linear method (level + trend)
Before the season, add a trend. Holt's method carries two quantities that both update
each period: the current level \ell_t and the current
slope b_t (how fast the level is rising per step). Two
smoothing constants, \alpha and \beta:
\ell_t = \alpha\,y_t + (1-\alpha)\,(\ell_{t-1} + b_{t-1}),
b_t = \beta\,(\ell_t - \ell_{t-1}) + (1-\beta)\,b_{t-1}.
The level update is SES, but blended against last period's forecast level
\ell_{t-1} + b_{t-1} (level carried forward by the slope) rather than a bare
level. The trend update is itself an exponential smoothing of the observed change in level
\ell_t - \ell_{t-1}. The forecast now slopes:
\hat{y}_{t+h} = \ell_t + h\,b_t,
a straight line continuing the current trend — no longer flat. That single change turns SES into a method
that can climb with the data.
Step two: add the season (Holt–Winters)
Now fold in a repeating pattern. Let the season have length m (12 for monthly
data with a yearly cycle, 4 for quarterly). Carry a set of seasonal factors
s_t, updated by a third constant \gamma. In the
additive form (the season adds a fixed amount):
\ell_t = \alpha\,(y_t - s_{t-m}) + (1-\alpha)(\ell_{t-1} + b_{t-1}),
b_t = \beta\,(\ell_t - \ell_{t-1}) + (1-\beta)\,b_{t-1},
s_t = \gamma\,(y_t - \ell_t) + (1-\gamma)\,s_{t-m},
and the forecast reattaches the appropriate season to the trending level:
\hat{y}_{t+h} = \ell_t + h\,b_t + s_{t+h-m}.
Read the logic: to update the level we first deseasonalise the observation
(y_t - s_{t-m}); the seasonal factor is itself smoothed from the leftover
y_t - \ell_t after the level is removed. Three components, three smoothing
constants (\alpha, \beta, \gamma), each an exponential smoother of its own
piece. That is the whole method.
The forecast that keeps trending and repeating
Below, the solid line to the left of the divider is a series with an upward trend and a yearly season. To
the right, the Holt–Winters forecast continues both: the level keeps climbing at slope
b_t and the seasonal bumps keep repeating on top. Contrast this with SES,
which would have forecast a flat horizontal line from the last point.
This is the payoff of tracking three components: the forecast inherits the personality of the data — its
climb and its rhythm — instead of collapsing to a constant.
Additive vs multiplicative seasonality
Two flavours of season, and choosing right matters:
-
Additive: the seasonal swing is a roughly constant amount, the same
whether the level is high or low (e.g. "+500 units every December"). The forecast adds
s_{t+h-m}.
-
Multiplicative: the seasonal swing scales with the level — the peaks grow
as the series grows (e.g. "December is always +30%"). The season enters as a factor,
\hat{y}_{t+h} = (\ell_t + h b_t)\,s_{t+h-m}, and the level uses
y_t / s_{t-m}.
A quick diagnostic: plot the series. If the seasonal peaks-to-troughs stay the same height as the level
rises, go additive; if they fan out and grow with the level, go multiplicative. The
classic airline-passengers series is the textbook multiplicative case — its summer peaks balloon as air
travel booms.
Worked example: one level-and-trend step
Take Holt's method with \alpha = 0.5,
\beta = 0.3. Yesterday you held level
\ell_{t-1} = 100 and slope b_{t-1} = 4 (the series
was rising about 4 per period). Today's observation is y_t = 110.
-
Forecast level carried forward:
\ell_{t-1} + b_{t-1} = 100 + 4 = 104.
-
Update the level:
\ell_t = 0.5\times 110 + 0.5\times 104 = 55 + 52 = 107.
-
Observed change in level:
\ell_t - \ell_{t-1} = 107 - 100 = 7.
-
Update the slope:
b_t = 0.3\times 7 + 0.7\times 4 = 2.1 + 2.8 = 4.9.
So the level rose to 107 and the estimated slope steepened slightly to 4.9 — the observation came in
above the carried-forward forecast, so the method nudged both the level and its rate of climb upward. A
three-step-ahead forecast would then be
\hat{y}_{t+3} = 107 + 3\times 4.9 = 121.7 (plus a seasonal factor, if present).
Two classic traps. First, multiplicative seasonality divides by the seasonal factor and
scales by the level — it only makes sense for strictly positive data. Apply it to a series that
crosses or sits near zero (temperatures in °C, a net balance, a demeaned series) and you get division by
near-zero, exploding factors, and nonsense. For such data use the additive form, or transform to make it
positive.
Second, an undamped linear trend extrapolates forever. A slope estimated from a recent
growth spurt, projected 24 months out, can produce absurd forecasts — nothing grows in a straight line
indefinitely. The standard remedy is a damped trend: multiply the slope's contribution
by a damping factor \phi < 1 each step, so the forecast
\ell_t + (\phi + \phi^2 + \dots + \phi^h)\,b_t flattens to a horizontal
asymptote instead of running off to infinity. Damped Holt–Winters is often the safer default for
medium-horizon business forecasting.
Holt–Winters looks like a bag of clever update rules, but it is not ad hoc. Each of these methods is the
steady-state form of a
state-space
model whose hidden state stacks the level, the slope and the seasonal factors into one
vector, evolved by the Kalman
filter. This "innovations state-space" viewpoint (the ETS framework — Error, Trend, Season)
gives every Holt–Winters variant a likelihood, so you can estimate
(\alpha, \beta, \gamma) properly, compare models by
AIC, and produce
honest prediction intervals — turning a 1950s heuristic into a rigorous, automatable forecasting engine.
It is the same story as SES: engineering shortcut first, deep theory later.