skaters

Simple, fast, automatic, distributional univariate time-series prediction.

One call, zero dependencies, every prediction a full probability distribution computed online in O(1) — in pure Python and JavaScript alike. A general-purpose forecaster for non-price economic series: on held-out likelihood laplace beats AutoARIMA, AutoETS, SARIMAX, conformal, zero-shot foundation models like Chronos and TimesFM, and GARCH-t — all heavier and slower. (No free lunch on price/returns: there GARCH-t wins, and you should use it.)

distributional O(1) online automatic zero-dependency Python + JavaScript
Accuracy vs speed frontier: laplace dominates the
        baselines, with higher held-out likelihood at a fraction of the runtime.
Held-out accuracy vs. runtime on 894 non-price FRED series. laplace sits alone in the top-right — best likelihood, fastest — while the classical, neural, and foundation-model baselines trade accuracy for orders of magnitude more compute. The benchmarks →
One library, two languages — verified identical. The pure-Python package is mirrored by a zero-dependency JavaScript port, checked against it to 1e-6, so the same models run server-side, natively in the browser, or in Pyodide. Try the live demos →
It wins the likelihood race against every baseline on non-price series. On 894 continuous non-price FRED series (rolling one-step-ahead, per series), laplace has the highest mean held-out log-likelihood (3.20) and the best win-rate against AutoARIMA (82%), AutoETS (97%), statsmodels SARIMAX (87%), conformal, and — the real test — the heavy-tail SOTA GARCH-t (68% raw / 65% family-weighted; mean LL 3.20 vs 3.03). On CRPS it loses only to the CRPS-specialists (conformal, GARCH-t). No free lunch on price/returns — there GARCH-t wins, and we recommend it. The benchmarks →
…and it beats the foundation models too — zero-shot. On 120 FRED change-series, laplace beats Chronos, TimesFM, Moirai, and Lag-Llama used zero-shot, on the continuous series, on both log-likelihood (97–100%) and CRPS (72–94%) — a zero-dependency online ensemble holding its own against 200M-parameter transformers. The foundation study →
Anomaly detection falls out for free. Every arriving point is scored against the forecast that was made for it: the state carries its probability integral transform (state["pit"], ~Uniform when the stream behaves) and its normalized surprise (state["z"], ~N(0,1)) at every horizon — running normalization with no extra compute, and a threshold on |z| is an anomaly detector calibrated by construction. See it live → · the skill →

pip install skaters. Every prediction is a Dist — a weighted Gaussian mixture carrying the mean, the spread, quantiles, and a density at once. You build models by composition: transforms chain, ensembles nest, and a distributional leaf sits at the bottom (see the Guide).

Quick start

from skaters import laplace

f = laplace(k=3)
state = None
for y in observations:
    dists, state = f(y, state)
    dists[0].mean              # point forecast
    dists[0].std               # uncertainty
    dists[0].quantile(0.975)   # 95th percentile
    dists[0].logpdf(y)         # log-likelihood
    dists[0].cdf(y)            # CDF at y

Every skater returns list[Dist] — one weighted mixture per horizon $h = 1, \ldots, k$. Point forecasts, uncertainty, density evaluation, and quantiles are all facets of the same object.

One general forecaster

Portrait of Pierre-Simon Laplace
Pierre-Simon Laplace (1749–1827), for whom the forecaster is named.

skaters exposes exactly one forecaster, laplace. At multi-step horizons (k>1) it is multi-scale by default, mixing instances on decimated clocks by likelihood (opt out with scales=[1]). Everything else is a building block you can compose. ("skater" is the concept — any (y, state) → ([Dist], state) function — not a function name.)

from skaters import laplace

f = laplace(k=1)

A likelihood-weighted ensemble over the full candidate pool — model first, conform last, with the lattice projection on by default, and an Ornstein–Uhlenbeck mean-reversion group in the multi-step (k>1) pool. Specialist behaviour (mean reversion, GARCH-style volatility) is reachable by composition (ou_transform, garch_leaf) when you have a strong prior. For price/return series there's no free lunch — use GARCH-t.

Guide →

The Dist object, transforms, conjugation, and ensembles — how it all composes.

Papers & benchmarks →

The paper, and the studies vs ARIMA/ETS/GARCH/conformal and the foundation models.

Live demos →

Watch a policy forecast live, with its uncertainty band, on data you choose.

Robustness explorer →

Slice the non-price benchmark any way you like — random, by category, keyword, seasonality, tails — and watch laplace's win-rate hold, live.

Heritage

skaters is a from-scratch rewrite that distils ideas from timemachines, the competition-winning forecasting package by Peter Cotton, and builds on years of experience running live distributional prediction contests at microprediction — where forecasts are scored, continuously, as full distributions rather than points. Sibling packages: precise (online covariance) and humpday (global optimizers).

Get the source

github.com/microprediction/skaters · pip install skaters · Examples