Sextant
Proof

Stress-test the honesty claim

Sextant's forecast bands are model-derived and backtested for calibration — not decoration. Don't take that on faith. Paste your own series, and we fit the same Holt-linear model the widgets ship, draw the prediction interval, and report how often that interval actually contained the next value on a rolling backtest. Same math, your data.

Try it on your data

Paste a series — forecast + backtest, live

A monthly revenue sample is prefilled. Replace it with your own metric (revenue, signups, latency, headcount). The coverage callout is the number that matters: it's computed by re-fitting the model at every historical origin — never on data the band was built from.

One number per line, or comma / CSV. A date,value row keeps the value. Plain numbers — no thousands separators.

Confidence band
Forecast horizon

80% band — backtested 86% coverage (1-step ahead, n=14)

Rolling-origin backtest: re-fit at each of 14 historical origins, forecast one step, count how often the next actual landed inside the band. 12 of 14 did. At or above nominal — the band holds up.

points
18
residual σ
2,369
z(80%)
1.282
+6mo forecast
40,722
80% interval
28,806 – 52,637

The variance law

How the band is built

From your history we fit Holt's linear-trend exponential smoothing (level α + trend β, both 0.4 here) and extend the final level + trend forward. Around that median we draw a cone whose half-width is z(confidence) × se, where:

  • se is the ETS(A,A,N) forecast standard error σ·√(1 + Σⱼ₌₁ʰ⁻¹(α+jβ)²) (Hyndman & Athanasopoulos, Forecasting: Principles and Practice). The residual σ comes from the in-sample one-step errors; the 1 + Σ(α+jβ)² term is how a trendmodel's uncertainty actually compounds — it widens faster than a naive σ·√h, so a 12-month cone is honestly wide rather than falsely tight.
  • z(confidence) is the real two-sided normal quantile (an Acklam probit), so 95% → 1.96. No fudge factors, no stretched bands.

The caveat

Gaussian, symmetric — stated plainly

The bands are Gaussian and symmetric around the median — fine for most financial and operational series, but a strongly skewed or bounded metric (a rate near 0% or 100%, a hard-floored count) is being approximated. That's exactly what the backtest catches: if the symmetry assumption is wrong for your data, empirical coverage will drift away from nominal and you'll see it in the callout above rather than discovering it in front of the board.

The check

How honest is the band?

A band built from in-sample σ can read tighter than reality. rollingCoverage() is the check: a one-step rolling-origin backtest that re-fits at each historical origin and reports how often the next actual landed inside each band. The callout surfaces it — “80% band — backtested 78% coverage” — so you can see whether the interval is calibrated instead of taking it on faith. Persistent under-coverage there is the signal to widen σ or revisit the model.

One-step-ahead is the standard, well-sampled calibration test: it validates the residual σ that the whole multi-horizon cone is built from (a mis-calibrated σ surfaces here first). It's pure and deterministic — the same series always yields the same coverage.

This is the same sextant-insights/stats.ts that powers the shipping widgets — see it live in chart-forecast-projection and chart-uncertainty-runway.

This is what you're paying for: charts for the numbers you'll be held accountable for.

See pricing →