Summary Two paired, multi-seed results:Synthetic data lowers error where the model is short of data, not where it already has enough.
- Augmentation is neutral. On M4 Monthly, adding
SynAugmentseries 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.
The benchmark
We sample panels ofn 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
SynAugmentcounterparts, fit on the training split only (leakage-safe).
benchmarks/benchmark_augmentation.py;
here we load its committed summary.

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 casesCoverage is straightforward to check. One call yields a panel of visibly different data-generating processes:
- Coverage and diversity.
generate_seriesand 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.

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 frompretraining_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.

Reproduce
--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):

