What it does
Split conformal treats alln calibration windows as equally
informative, which is precisely the exchangeability assumption. NexCP
drops it and weights each window by its age:
1, the one before it rho, and so on.
The threshold is then the exact weighted order statistic of the
scores under those weights, not the unweighted one.
rho controls the memory. At rho = 1 every weight is 1 and NexCP is
exactly split conformal. At rho = 0.9 a window 20 steps back carries
12% of the newest window’s vote, and one 50 steps back is essentially
ignored.
Barber et al. give the price explicitly: the coverage gap is bounded by
the total variation between the weighted calibration distribution and
the test point’s. Down-weighting stale data shrinks that gap when the
process drifts, and costs you effective sample size when it does not.
The window axis has to mean time
NexCP reads axis 1 of the calibration arrays as chronological, oldest
first. That is what calibrate_cv produces. If you assemble
calibration windows yourself, get the order right or the decay is
applied to the wrong windows silently.
Worked example
This page uses the eight-series M4 hourly panel rather than AirPassengers, because weighting only matters when the series are long enough for old windows to genuinely be stale.refit=TrueforSeasonalNaiveSeasonalNaivehas noforwardmethod, so statsforecast cannot reuse fitted parameters across cutoffs andcalibrate_cvmust refit at each one. For this model that is free — there is nothing to fit.
rho = 0.99 is
almost free here — 39.5 of 40 windows — while rho = 0.9 leaves the
equivalent of about 18. Fewer effective windows means a coarser quantile
grid and a noisier threshold. That is the trade: less stale information,
but also less information.

What it does to the intervals

rho reweights each series’
own residual history, so a series whose recent errors are unlike its old
ones changes a lot — H10 more than quadruples between rho = 1.0 and
rho = 0.9 — while a stable one such as H200 barely moves. A single
global multiplier could not do that.
Measured coverage
The decay pays for itself here, up to a point Split conformal (rho = 1.0) under-covers on this holdout — 85.9% against a 90% target — because it weights a residual from 40 hours back exactly as heavily as the most recent one. Every decay setting closes that gap,rho = 0.99almost exactly (89.4%), and the Winkler score, which charges width and misses on one scale, improves with it, bottoming out atrho = 0.95(1338.8 against split’s 1369.0). Past that the trade turns over.rho = 0.9buys 94.8% coverage, well beyond what was asked for, and pays 12% more width than split conformal to get it; its Winkler score is the worst of the four. That is the shape to expect — forgetting stale residuals helps while they really are misleading, and costs you effective sample size once they are not. Measure before tuningrho, in both directions.
When not to use it
- Your calibration set is small. Decay throws away effective
sample size you may not have. Check
effective_sample_sizeagainstceil(1/alpha)before trusting the result. - Your drift is abrupt rather than gradual. An exponential decay is a smooth forgetting curve. A step change is handled better by ACI, whose controller reacts to misses directly.
- You do not know how fast to forget.
rhois as much a tuning parameter as ACI’sgamma, and NexCP has no aggregated variant. If that bothers you, use AgACI.
References
R. F. Barber, E. J. Candes, A. Ramdas, and R. J. Tibshirani, “Conformal prediction beyond exchangeability,” arXiv.org, 2022. https://arxiv.org/abs/2202.13415.Next
- SPCI — the last online method, and the only one that changes the shape of the band rather than its level.
- Ragged panels — what the window axis means when series have different lengths, which is exactly what NexCP reads.

