Back to notes

March 4, 2026 · 4 min read

A Time Series Model That Missed an Obvious Seasonality Pattern

The forecast looked fine on paper until a predictable December spike wrecked it, because 'obvious' seasonality turned out to need more than one year of training data to actually see.

PostmortemForecasting

The forecast error wasn't subtle. In early December, actual demand came in 45% above what the model predicted, three days in a row, for a retail client with an obvious holiday pattern. The embarrassing part is that the pattern really was obvious — anyone who'd been at the company more than a year could have told you December spikes hard. The model just hadn't been shown enough history to know that.

The training window was the whole bug

We'd trained on fourteen months of data, which felt generous at the time. Fourteen months gives you exactly one December. One. A model can't learn a yearly seasonal pattern from a single occurrence of it — it has no way to distinguish 'this is what December does every year' from 'something unusual happened once.' We'd effectively built a model that had never really seen the thing we needed it to predict.

A model can't learn a pattern it's only been shown once. One December in the training set isn't seasonality, it's an anecdote.

The fix was unglamorous: go find three years of historical sales data, even though it meant dealing with a messier, inconsistently-tagged legacy system to get it, and retrain with enough repeated cycles that the model could actually separate signal from noise. Forecast error on the next December dropped to single digits.

  • Before trusting any time series model, check how many full cycles of the seasonality you care about are actually in the training window.
  • A model that performs well on held-out weeks within the same year can still fail completely on yearly patterns it's never seen repeat.
  • Legacy data that's annoying to retrieve is still worth retrieving if it's the only way to get multiple seasonal cycles.

This one stung because it was so easily preventable in hindsight — a five-minute conversation with anyone on the ops team would have surfaced the pattern. We'd treated it as a pure data science problem and skipped the step where you just ask the people who've lived through a few Decembers what to expect.