Demand BenchForecast model benchmarking

Demand planning

The right demand forecasting model, SKU by SKU

01Paste or uploadOne SKU by hand, or a CSV or Excel sheet of hundreds. 10 months minimum.
02Eleven models competeCroston, SBA, TSB, ADIDA, Holt-Winters, ARIMA, Holt, SES and three baselines — each tested on the months it never saw
03The best one winsPicked on out-of-sample accuracy, never on how well it fits the past
04Take it to ExcelForecast, range and the full working, in a formatted workbook with a chart
05Nothing is uploadedEvery calculation runs in your browser. Your demand data never goes anywhere.

Forecast workspace

Monthly demand, oldest month first.

ActualForecast P10–P90Before scenario

No benchmark yetPick a sample or paste your own monthly demand, then run the benchmark.

How it picks

Four rules, all of them checkable. Open the full working below when you want it — every model, every formula, the coverage study.

01Classified firstADI and CV² decide which models may compete for a SKU. Intermittent demand never gets a model built for smooth demand.
02Judged on months it never sawRolling-origin backtesting. A model that fits history beautifully and forecasts badly loses here.
03Compared like for likeEvery eligible model starts from the same month, so the accuracy figures belong in the same column. The fold count is shown next to each.
04The range is testedA stated P10–P90 should contain the outcome 80% of the time. Measured against held-out data it lands between 74% and 89% across six demand patterns.
Read the full methodHide the method

How the benchmark works

Enough to judge whether the number is worth using. The rules, not the recipe.

The comparison

Every model starts from the same month of history, so the accuracy figures in the table were measured on the same data.

At each forecast origin a model sees only the history available at that moment and predicts forward. Move the origin along and you get a set of honest out-of-sample errors.

What usually goes wrong elsewhere is that different models need different amounts of history to start, so each gets scored from its own earliest origin — and accuracy measured on different data ends up in the same column. Here every eligible model starts at the same origin. If including seasonal models would leave too few evaluation folds, they are excluded outright and the page says so. The fold count sits next to every model so you can check.

Classification

ADI and CV² decide which models are allowed to compete for a SKU. They never decide the winner.

Average demand interval and the variability of the non-zero order sizes place each SKU in one of four quadrants — smooth, erratic, intermittent, lumpy — on the Syntetos–Boylan–Croston (2005) scheme. Smooth and erratic series go to the continuous-demand family; intermittent and lumpy go to the intermittent estimators, and a continuous-demand model cannot win there however good its error looks.

The eleven models

Eight for regular demand, four for intermittent. All published, all named.

Regular demand: Naive · Moving average (3) · SES / ETS(A,N,N) · Holt linear trend · Holt-Winters additive · ARIMA(1,1,0) with drift · seasonal naive with drift.

Intermittent demand: Croston · SBA · TSB · ADIDA.

Smoothing constants are fitted to each SKU rather than pinned at textbook defaults, and the fitting only ever sees the training block of the fold it is in. Ranking is on out-of-sample error with a penalty for persistent bias; the score is in the table beside the error so the ordering is checkable.

The range

A P10–P90 that has been tested for coverage against held-out data, not asserted.

The spread of the rolling error is measured at each horizon from the folds that genuinely reach it, and grown beyond the last horizon the data supports — the chart marks that switch with hollow bars. Intermittent and lumpy series get a bootstrap instead of a normal curve, because their demand has a large lump at zero. The page says which method produced the numbers on screen.

Calibration. A stated 80% range is worth nothing unless it holds about 80% of the time. Across 120 synthetic histories in each of six demand families — flat, trending, seasonal, random-walk, lumpy and intermittent — fitted on 36 months and scored against the following 12, the published range contained the outcome between 74% and 89% of the time, monthly and by horizon. The test runs on every build.

What the sheet should look like

SKU in column A, one column per month after it, oldest first. Zeros are data; keep them.

One row per SKU. Column A is the SKU code — the only column that is not a number. Everything from column C onwards is one month of demand, oldest first; the header text is ignored, only the order matters. Column B is optional and covered under the sheet format.

Sheet layout
SKUSeasonOct 2023Nov 2023Dec 2023
CHEM-1181,6231,8402,003
CHEM-3503307443251
CHEM-41105140

Zeros are data. A zero means no demand that month and the classification depends on it, so leave them in rather than deleting the cell — deleting it shifts every later month back by one.

Blanks. Trailing blanks at the end of a row are ignored, so rows of different lengths are fine — a SKU launched later than the rest has a shorter run. A blank in the middle is reported with the column named rather than silently closed up, because closing it up would shift every month after it and quietly corrupt the series.

Negatives are treated as zero. If returns and credits appear as negative lines, net them off before uploading or they are dropped.

How much history. Ten months minimum, twenty-four before the backtest is worth much. A seasonal model needs two full cycles plus four evaluation folds — about 28 months for an annual cycle — or it is excluded and the page says so.

Known limitations

Where the numbers get thin, stated up front.

The seasonal entry is a baseline, not an order-searched SARIMA. The calibration study uses synthetic histories with clean structure; a real SKU with a regime change part-way through will be harder than anything in it. Intervals inherit the length of your history — with only a handful of folds the range is indicative, and the fold count is shown so you can judge it. Promotions, price changes, cannibalisation and new-product effects are not modelled; the scenario tool is where you put what you know and the history does not.

The method, and where it comes from

The classification thresholds, the intermittent-demand estimators, the error metrics and the rolling-origin design all come from published work rather than house opinion.

Demand categorization

Syntetos, Boylan & Croston (2005) derive the four-quadrant ADI/CV² scheme and the 1.32 / 0.49 cut-offs.

Journal record →

Refining the cut-offs

Kostenko & Hyndman (2006) review that scheme and propose a non-rectangular boundary between Croston and SBA.

Paper (PDF) →

SBA bias correction

Syntetos & Boylan (2001) identify Croston's bias and introduce the approximately unbiased modification.

Journal record →

TSB and obsolescence

Teunter, Syntetos & Babai model occurrence probability so forecasts update during zero-demand runs.

Paper (PDF) →

MASE

Hyndman & Koehler propose mean absolute scaled error for comparison across series.

Paper (PDF) →

Rolling-origin validation

Forecasting: Principles and Practice on time-series cross-validation without future leakage.

Methodology →

Where did it get your SKUs wrong?

A pattern it misread, a model it should have had, an export column your planning system needs. Every one of those has changed something here already.

Tell me what broke