10 — Classical Models

Exponential Smoothing#

ClassicalStatistical 1 min read
◆ The PatternWeighted averages that fade the past

Exponential smoothing (ETS) assigns exponentially decreasing weights to past observations. Simple smoothing handles level-only series. Holt’s adds trend. Holt-Winters adds seasonality. The ETS framework (Error, Trend, Seasonality) covers 30 model variants.

SES:   𝑓̂t+1 = αyt + (1−α)𝑓̂t
α (0–1) balances responsiveness with stability. Close to 1 = reactive to recent data. Close to 0 = smooth, slow to adapt.
// Interactive — exponential smoothing
Alpha (α)0.30
Pattern bridge: Exponential smoothing with α is exactly how Exponential Moving Averages (EMA) work in technical analysis. The same α parameter appears in momentum optimizers.
Worked example

After a level shift, simple exponential smoothing needs 10.3 steps to cover 90% of the jump with α = 0.2, 3.3 with 0.5 and 1.4 with 0.8 — smoothness against speed. A trend of 1 per period damped by φ = 0.9 adds at most 9 more in total, while an undamped trend adds 24 in 24 periods.

Where it misleads
  • Simple smoothing forecasts a flat line, so on trending or seasonal data it lags behind; that is what Holt’s and Holt–Winters’ extensions are for.
  • Over long horizons a damped trend usually forecasts better than a straight one (Gardner & McKenzie 1985), because trends rarely continue unchanged.
  • α fitted to minimise one-step error may be wrong for the horizon you actually forecast.
In code
steps_to_90 = {a: round(np.log(0.1) / np.log(1 - a), 1) for a in (0.2, 0.5, 0.8)}   # after a level shift
b, phi = 1.0, 0.9                                  # trend per period, damping
damped_total = b * phi / (1 - phi)                 # where a damped trend's extra growth levels off
straight_24 = b * 24                               # an undamped trend 24 periods ahead
Python, in your browser — edit the code and run it again

Assumes import numpy as np and import pandas as pd. Each snippet simulates or makes up its own series, as the comments say.

The same idea with a library
# Python — Holt-Winters
from statsmodels.tsa.holtwinters import ExponentialSmoothing

model = ExponentialSmoothing(
    series, trend='add', seasonal='mul',
    seasonal_periods=12
).fit()
forecast = model.forecast(steps=12)
Sources
  • C. C. Holt, “Forecasting Seasonals and Trends by Exponentially Weighted Moving Averages”, International Journal of Forecasting 20(1), 2004 (1957 report reprinted)
  • P. R. Winters, “Forecasting Sales by Exponentially Weighted Moving Averages”, Management Science 6(3), 1960
  • E. S. Gardner Jr. & E. McKenzie, “Forecasting Trends in Time Series”, Management Science 31(10), 1985

Last reviewed October 2026 · How this site checks its content · Report a mistake

Check yourself

1. Simple exponential smoothing with α close to 1 behaves like…

Show answer

B. α is the weight on the newest observation. Near 1, older values hardly count; near 0, the forecast barely moves.

2. What do simple exponential smoothing forecasts for 1, 2, … 10 steps ahead look like?

Show answer

A. SES has only a level. Holt’s method adds a trend, and Holt–Winters adds seasonality.

3. What does the Holt–Winters method add to simple exponential smoothing?

Show answer

A. The ETS framework (error, trend, season) puts all of these into one family of state-space models.

Linked from 1
← Previous
SARIMA
Open in the full reader, with the topic sidebar