Skip to main content
NexCP answers the same problem as ACI — the world moved and the calibration set is stale — from the opposite direction. Rather than moving the coverage target, it changes whose errors count.

What it does

Split conformal treats all n calibration windows as equally informative, which is precisely the exchangeability assumption. NexCP drops it and weights each window by its age:
The newest window has weight 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=True for SeasonalNaive SeasonalNaive has no forward method, so statsforecast cannot reuse fitted parameters across cutoffs and calibrate_cv must refit at each one. For this model that is free — there is nothing to fit.
The effective sample size is what the decay costs. 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

The widths move by series, not uniformly: 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.99 almost exactly (89.4%), and the Winkler score, which charges width and misses on one scale, improves with it, bottoming out at rho = 0.95 (1338.8 against split’s 1369.0). Past that the trade turns over. rho = 0.9 buys 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 tuning rho, 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_size against ceil(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. rho is as much a tuning parameter as ACI’s gamma, 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.