What it does
ACI keeps a time-varying targetalpha_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:
(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.
gammatoo large degenerates, it does not merely wobble Nothing stopsalpha_tfrom being driven to zero or below by a run of misses. Atalpha_t <= 0the requested quantile sits beyond the largest calibration score and the interval becomes infinitely wide — technically 100% covering, and useless. On this 48-month streamgamma = 0.2does exactly that within a few steps. Stay inside the recommended range; that is what the constructor warning above0.1is 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.
gamma = 0 reference.
Each one is calibrated on the same 48 cross-validation windows before
the stream starts.
What alpha_t did

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
updateis 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/updateloop in general.

