10. What Is a Good Forecast Error?
Teaching rewrite — the Metrics step: judging accuracy against a fair benchmark. Original wording; examples recomputed.
Introduction
Your tool reports an MAE of 36% and a bias of +1.6%. Good or bad? Common answers don’t hold up:
| Common answer | Problem |
|---|---|
| “Better than last year” | What if last year was exceptional (e.g. a pandemic year)? |
| “Better than our target” | Chicken-and-egg: how was the target set? |
| “Better than some other forecast” | Which one? |
| “It looks right — follows trend and seasonality” | Not standardised; doesn’t scale to thousands of items |
| “Industry benchmark” | Not comparable (lesson 12) |
| “Demand COV says it’s hard to forecast” | Misleading — see 10.2 |
Achievable accuracy depends on the data: national monthly phone sales are far easier than one model at one store on one day; collaborative manufacturers can be very accurate, fashion struggles. You can’t know a “good” error in advance — you must compare against a simple benchmark on the same data.
This lesson covers:
- Naïve, moving-average, and seasonal benchmarks
- Fair benchmarking rules (same lag, out-of-sample, ongoing)
- Why the coefficient of variation (COV) is a poor measure of forecastability
10.1 Benchmarks
A benchmark is a simple, free forecasting method. If your model or process can’t beat it, it isn’t adding value — and if the benchmark wins, you have just found your new model.
Naïve forecast
Always predicts the last observed value. Easy to beat — so beating it proves little. Be wary of vendors who celebrate beating the naïve forecast.
Moving average
Average of the last n periods; 3–6 periods usually works best. A much fairer contender.
Worked example: choosing a benchmark
Demand history: 100, 120, 90, 110, 130, 95, | 105, 125, 100, 115, 120, 90 (forecast the last 6 periods, one period ahead).
| Benchmark | MAE% | Bias% |
|---|---|---|
| Naïve (MA1) | 16.0% | +0.8% |
| MA3 | 9.7% | +1.5% |
| MA6 | 9.3% | +0.4% |
Use the best one (MA6 here) — otherwise you compare yourself with an artificially weak benchmark.
Seasonal benchmarks
For seasonal demand, use the same period in previous cycles:
- Seasonal naïve — last cycle’s same period (e.g. last Monday for next Monday).
- Seasonal moving average — average of several cycles (e.g. the last three Mondays).
For a product with a strong weekday pattern, a seasonal moving average can cut MAE roughly in half compared to a plain moving average that mixes Mondays with Saturdays.
Rules for fair benchmarking
- Try several moving averages and pick the best.
- Same lag — a forecast made three months ahead must be compared with a benchmark that only had data up to three months before.
- Out-of-sample — don’t compare on the period used to choose or tune your model. A model picked as the best of 15 on 2025 data will naturally beat the benchmark on 2025; the real test is 2026. Otherwise you are measuring overfitting.
- Keep tracking — benchmarking is continuous, not a one-off (lesson 12).
Checkpoint: benchmarks
Checkpoint — section 10.1
1 / 4Why is the naïve forecast a weak benchmark?
Pick an answer to see if you are right.
10.2 Why COV is not a forecastability measure
Coefficient of variation: COV = σ / μ (standard deviation ÷ mean).
Many tools use COV to label items “easy” or “hard” to forecast. Problems:
| Problem | Explanation |
|---|---|
| Data leakage | COV compares each period with the same period’s overall mean — information a forecaster never has. Comparing 2025 demand with the 2025 average looks better than any genuine forecast made from 2024 data |
| Trend inflates COV | A steadily growing product has high variation around its mean, yet a moving average follows it easily |
| Seasonality inflates COV | A highly seasonal product has high COV, yet a seasonal benchmark forecasts it well |
Only for flat demand (no trend, no seasonality) does COV roughly track forecastability — and even then it flatters itself through leakage. Deseasonalising or detrending first doesn’t fix it: that also uses hindsight and isn’t a simple benchmark.
Worked example: trend fools COV
Demand grows 10 units per period: 10, 20, 30, 40, 50, 60.
- Mean = 35; standard deviation ≈ 17.1 → COV ≈ 49% (“hard to forecast”).
- A simple trend-following forecast (last value + last change) predicts each period exactly from period 3 on → error 0.
High COV, perfectly forecastable.
Better: judge forecastability by the error of a good benchmark on the item.
Checkpoint: COV
Checkpoint — section 10.2
1 / 4COV is computed as…
Pick an answer to see if you are right.
Rank: benchmarking practice
Benchmarking practice
1 / 2Rank the steps to judge whether a forecast is “good”.
OrderDrag the handle to rearrange — top should be first.
- 1Compare scores; if the benchmark wins, adopt it or fix the model.
- 2Pick the best benchmark on the evaluation period.
- 3Repeat every cycle.
- 4Compute several simple benchmarks (MA3–MA6, seasonal MA) at the same lag.
- 5Compute your forecast’s MAE and bias on the same out-of-sample period.
Drag items into the correct order (or use ↑↓), then check.
Check: good forecast error
What is a good forecast error?
1 / 5What is the best way to know if a 36% MAE is good?
Pick an answer to see if you are right.
Takeaways
- You can’t know a good error in advance — benchmark it
- Naïve is too weak; use the best of several moving averages (3–6) or seasonal benchmarks
- Compare at the same lag, out-of-sample, and continuously
- COV leaks future information and is inflated by trend and seasonality — don’t use it as forecastability
- Judge forecastability by benchmark error
Further Reading
- 9. Choosing the best forecasting KPI
- Next: 11. Accuracy across a product portfolio
- Free textbook: R. Hyndman & G. Athanasopoulos, Forecasting: Principles and Practice (otexts.com/fpp3)
- Background: N. Vandeput, Demand Forecasting Best Practices (Manning) — used as a study outline