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.
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; the1 + Σ(α+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 →