Skip to main content
Synthetic data is often assumed to be a free accuracy boost: generate more series, get a better model. The two benchmarks on this page bound that claim. Adding synthetic series to a model that already has enough real data does not reliably lower error. Pretraining on synthetic data and applying it zero-shot does lower error for series with little history. Synthetic data is also useful for coverage, robustness testing, and privacy, which accuracy numbers on a single panel do not capture.
Summary Two paired, multi-seed results:
  • Augmentation is neutral. On M4 Monthly, adding SynAugment series to a properly-scaled global forecaster did not reliably beat the observed data alone. Across panel sizes 3–30 and 20 seeds the win rate sat at a coin flip with no significant effect.
  • Zero-shot pretraining helps cold-start. On M3 Monthly, a model pretrained on synthetic data and used zero-shot beat training from scratch by ~20% when each series kept only ~48 months of history, in every one of 10 seeds. The edge reversed once history was ample.
Synthetic data lowers error where the model is short of data, not where it already has enough.

The benchmark

We sample panels of n M4 Monthly series and compare a global gradient-boosted forecaster (HistGradientBoostingRegressor via MLForecast, with per-series standardization β€” the correct configuration for M4’s varied scales) trained on:
  • observed β€” the real series only;
  • augmented β€” real series plus SynAugment counterparts, fit on the training split only (leakage-safe).
We forecast the official 18-month M4 holdout and score seasonal MASE, paired within each seed. The full sweep (20 seeds) lives in benchmarks/benchmark_augmentation.py; here we load its committed summary.
The confidence intervals overlap everywhere and the paired win rate never departs meaningfully from 50%. Two caveats about what the result does and does not show:
Scope of the result
  • This is not evidence that synthetic data is useless. It shows that augmenting a model that already has enough signal does not lower error. A gradient-boosted global model with a few full M4 histories is not short of data.
  • A win is easy to manufacture. An earlier version of this benchmark showed a large apparent gain that came from an unscaled baseline, where augmentation was compensating for the model’s poor scale handling, and from too few seeds. With per-series scaling and 20 seeds the effect vanished. Treat augmentation benchmarks that omit either with suspicion.

Other uses

Synthetic data is useful in ways a single-panel accuracy number does not measure:
Four use cases
  • Coverage and diversity. generate_series and the balanced pool span behaviors β€” volatility clustering, long memory, intermittency, chaos β€” that no single real dataset contains. Useful for stress-testing a pipeline and for pretraining breadth.
  • Robustness testing. Inject anomalies, changepoints, and missingness with known ground truth to measure how a model degrades.
  • Privacy. Share a reproducible, statistically-similar panel without exposing proprietary series.
  • Pretraining at scale. The diversity-targeted generators β€” TSI, TCM, and KernelSynth β€” exist to pretrain models that transfer to unseen series. The section below measures this: a synthetic-pretrained model used zero-shot beats training from scratch when the real history is short.
Coverage is straightforward to check. One call yields a panel of visibly different data-generating processes:

Pretraining: a cold-start win

The augmentation result above concerns a model that already has enough real data. Pretraining tests the opposite case: a model with too little real history to learn from. We pretrain a small NHITS on a synthetic corpus from pretraining_pool(), then forecast M3 Monthly series while varying how much history each series keeps, from 48 months up to the full record. The corpus is generated independently and never sees M3. Three ways to use the pretrained model, compared against the same 18-month holdout:
  • from-scratch β€” ignore pretraining, train NHITS on the real history alone.
  • zero-shot β€” apply the synthetic-pretrained model directly, no real training.
  • pretrain + fine-tune β€” continue training it on the real history at a reduced learning rate.
With only 48 months of history the zero-shot model cuts seasonal MASE by about 20% against training from scratch, winning in all 10 seeds (p = 0.002, the smallest value a 10-seed paired test can produce). The from-scratch model has too few windows to learn the seasonality the pretrained model already carries. The gap narrows as history grows and reverses past roughly 100 months, where a from-scratch model has enough data and wins outright. Fine-tuning lands in between and rarely wins: on short histories it drags the pretrained model toward the data-starved fit, and on long ones it cannot beat from-scratch. Use zero-shot for cold-start series and from-scratch once history is ample.

Reproduce

Use --quick for a fast smoke run. The script is model- and dataset-agnostic enough to re-point at another panel. To decide whether augmentation helps on a given problem, run the same paired, multi-seed comparison on that data, never on the final holdout. And the pretraining sweep (needs a GPU):