Skip to main content
ACI is the simplest of the online methods. Where split conformal fixes the coverage level once and holds it, ACI adjusts the level it requests as observations arrive — widening after a miss, tightening after a hit — which is what lets it keep long-run coverage on a series whose errors are drifting.

What it does

ACI keeps a time-varying target alpha_t, one per (series, horizon) cell, initialised at alpha. After each observation it checks whether the truth fell inside the interval and nudges the target:
A miss makes the bracket (alpha - 1) negative, so alpha_t shrinks and the next interval is wider. A hit adds gamma * alpha, so alpha_t creeps up and the interval tightens. The interval itself is still an ordinary split conformal interval — just taken at alpha_t instead of alpha. This is a control loop, and it has the property a control loop should: the long-run empirical coverage converges to 1 - alpha whatever the data does, with no exchangeability assumption at all. What it gives up is any finite-sample promise about a single step — alpha_t can wander far from alpha while it chases a shift. gamma is the learning rate. Gibbs and Candès recommend [0.005, 0.05]; a field validator warns above 0.1. Small gamma adapts slowly and stays near split conformal; large gamma reacts fast and oscillates.
gamma too large degenerates, it does not merely wobble Nothing stops alpha_t from being driven to zero or below by a run of misses. At alpha_t <= 0 the requested quantile sits beyond the largest calibration score and the interval becomes infinitely wide — technically 100% covering, and useless. On this 48-month stream gamma = 0.2 does exactly that within a few steps. Stay inside the recommended range; that is what the constructor warning above 0.1 is for.

Worked example

Adaptation only shows up over many steps, so this page forecasts one month ahead and streams the last four years through the method one observation at a time — predict, then update with what actually happened. calibrate_cv returns a fitted object, and update advances that object’s state in place.
Three learning rates, plus split conformal as the gamma = 0 reference. Each one is calibrated on the same 48 cross-validation windows before the stream starts.

What alpha_t did

None of the three starts at alpha = 0.1, because calibrate_cv already rolled alpha_t forward through its 48 windows — an online method adapts during calibration too, not only during the stream. Read the top panel as the controller’s state. Every miss knocks alpha_t down by gamma * (1 - alpha) — a visible cliff — and every hit lets it drift back up by gamma * alpha, a tenth as fast. That asymmetry is the algorithm: it is expensive to miss and cheap to be a little conservative. gamma = 0.005 barely leaves the split-conformal line over 48 months; gamma = 0.05 reacts within a step or two. The bottom panel is the consequence: split conformal holds one width for four years, while the adaptive runs breathe. Which rate is right depends on how fast your process actually moves, and you do not know that in advance. AgACI exists so you do not have to guess.
n_observations counts the calibration windows and the streamed updates — online state does not reset when you stop calibrating and start predicting.

When not to use it

  • You cannot feed truths back. ACI without update is split conformal with extra steps. If your pipeline never learns what actually happened, use split conformal or CQR and be honest about it.
  • You do not want to tune gamma. Use AgACI, which runs a panel of learning rates and aggregates them online.
  • Your problem is width, not level. ACI moves the coverage target; it does not change the shape of the band. If the complaint is “too wide in calm periods, too narrow in volatile ones”, that is SPCI.

References

I. Gibbs and E. Candès, “Adaptive Conformal Inference Under Distribution Shift,” arXiv.org, 2021. https://arxiv.org/abs/2106.00170.

Next

  • AgACI — ACI without choosing gamma.
  • NexCP — the other answer to drift: down-weight stale residuals.
  • Online updating — the predict/update loop in general.