Step-by-step guide on using theThe Conformal Seasonal Pool (CSP) is a training-free probabilistic forecaster introduced in Manokhin (2026), Training-Free Probabilistic Time-Series Forecasting with Conformal Seasonal Pools. It produces a seasonal naive point forecast with empirically well-calibrated prediction intervals. It does this without estimating a single parameter, as the predictive distribution is built entirely from empirical draws of the training history. In the paper’s benchmark, CSP matches or beats deep probabilistic baselines such as DeepNPTS on CRPS while keeping empirical coverage close to the nominal level. It also runs orders of magnitude faster (seconds instead of hours) because there is nothing to train. In this notebook, we walk through the model on the UCI ElectricityLoadDiagrams20112014 dataset, the raw source of the electricity benchmark used in the paper, and mirrors the paper’s rolling-origin evaluation protocol to confirm that the intervals are calibrated.ConformalSeasonalPoolmodel inStatsForecast.
How the model works
The point forecast is exactly a Seasonal Naive forecast , which is the value observed one seasonal period ago. All of the model’s machinery goes into the predictive distribution around . The distribution is estimated fromn_samples draws of a two-component
mixture.
- Seasonal pool. Historical observations at the same seasonal
phase as the forecast target (e.g., all past 3 PM values when
forecasting 3 PM), sampled with exponentially decaying weights
so that newer observations
are drawn more often (
decay= ). - Calibration residuals. Signed seasonal naive errors
computed on the most recent
calib_fracfraction of the history and added back to the point forecast as .
variant parameter
controls .
"fixed"(CSP-Fixed) uses always."adaptive"(CSP-Adaptive) uses when there is no seasonality (season_length≤ 1), when the seasonal pool is thin (fewer than 3 same-phase observations), and otherwise.
| Parameter | Default | Meaning |
|---|---|---|
season_length | Required | Observations per seasonal cycle (24 for hourly data with a daily cycle). |
n_samples | 100 | Mixture samples used to estimate the intervals. A level- interval needs at least samples (≥ 39 for 95%). |
variant | "adaptive" | "adaptive" or "fixed" mixture weight (see above). |
calib_frac | 0.5 | Fraction of the most recent history used for the calibration residual pool. |
decay | 0.01 | Exponential recency rate for the seasonal pool weights. |
Loading libraries and data
Tip You need StatsForecast to run this notebook. To install it, follow these instructions.
Download the electricity dataset
We use the ElectricityLoadDiagrams20112014 dataset from the UCI Machine Learning Repository, which contains the electricity consumption (kW) of 370 Portuguese clients, recorded every 15 minutes from 2011 to 2014. This is the raw source behind the hourlyelectricity benchmark on which the CSP paper is evaluated.
Warning The zip file is about 250 MB. The cell below caches it locally, so it is only downloaded once.
electricity benchmark). To keep
the notebook fast we work with ten clients over the last three months of
2014, keeping only clients that are active (non-zero) throughout the
window, since some clients joined after 2011 and their earlier readings
are recorded as zero.
| ds | unique_id | y | |
|---|---|---|---|
| 0 | 2014-10-01 00:00:00 | MT_002 | 92.46 |
| 1 | 2014-10-01 01:00:00 | MT_002 | 79.66 |
| 2 | 2014-10-01 02:00:00 | MT_002 | 77.52 |
| … | … | … | … |
| 22077 | 2014-12-31 21:00:00 | MT_012 | 727.66 |
| 22078 | 2014-12-31 22:00:00 | MT_012 | 691.49 |
| 22079 | 2014-12-31 23:00:00 | MT_012 | 665.96 |
Explore the data
The hourly load shows the strong daily seasonality that CSP exploits.
Forecasting with prediction intervals
We instantiateConformalSeasonalPool alongside SeasonalNaive and
forecast the next day (h=24) with 80% and 95% prediction intervals.
The default n_samples=100 comfortably exceeds the minimum number of
samples required for non-degenerate 80% and 95% intervals. Note that CSP
requires no training, so forecast returns almost instantly.
| unique_id | ds | CSP-Adaptive | CSP-Adaptive-lo-95 | CSP-Adaptive-lo-80 | CSP-Adaptive-hi-80 | CSP-Adaptive-hi-95 | SeasonalNaive | SeasonalNaive-lo-80 | SeasonalNaive-lo-95 | SeasonalNaive-hi-80 | SeasonalNaive-hi-95 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | MT_002 | 2015-01-01 00:00:00 | 78.95 | 65.38 | 75.32 | 81.79 | 94.02 | 78.95 | 69.05 | 63.81 | 88.85 | 94.09 |
| 1 | MT_002 | 2015-01-01 01:00:00 | 73.26 | 60.46 | 68.85 | 79.79 | 83.94 | 73.26 | 63.36 | 58.12 | 83.16 | 88.40 |
| 2 | MT_002 | 2015-01-01 02:00:00 | 68.99 | 58.29 | 66.07 | 75.39 | 91.04 | 68.99 | 59.09 | 53.85 | 78.89 | 84.13 |
| … | … | … | … | … | … | … | … | … | … | … | … | … |
| 237 | MT_012 | 2015-01-01 21:00:00 | 727.66 | 569.32 | 637.23 | 812.77 | 936.60 | 727.66 | 589.71 | 516.69 | 865.61 | 938.63 |
| 238 | MT_012 | 2015-01-01 22:00:00 | 691.49 | 482.98 | 595.53 | 783.36 | 951.49 | 691.49 | 553.54 | 480.52 | 829.44 | 902.46 |
| 239 | MT_012 | 2015-01-01 23:00:00 | 665.96 | 435.57 | 553.19 | 721.66 | 910.26 | 665.96 | 528.01 | 454.99 | 803.90 | 876.93 |

Evaluating calibration with the paper’s protocol
The paper evaluates each method with a rolling-origin protocol using 7 non-overlapping evaluation windows per series, each one day long (h=24). StatsForecast.cross_validation implements exactly this. We
request the levels [20, 40, 60, 80], whose interval bounds correspond
to the quantile grid used by the
paper’s CRPS and quantile-loss metrics, plus level 95 for the coverage
check.
| unique_id | ds | cutoff | y | CSP-Adaptive | CSP-Adaptive-lo-95 | CSP-Adaptive-lo-80 | CSP-Adaptive-lo-60 | CSP-Adaptive-lo-40 | CSP-Adaptive-lo-20 | … | SeasonalNaive-lo-20 | SeasonalNaive-lo-40 | SeasonalNaive-lo-60 | SeasonalNaive-lo-80 | SeasonalNaive-lo-95 | SeasonalNaive-hi-20 | SeasonalNaive-hi-40 | SeasonalNaive-hi-60 | SeasonalNaive-hi-80 | SeasonalNaive-hi-95 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | MT_002 | 2014-12-25 00:00:00 | 2014-12-24 23:00:00 | 79.66 | 81.79 | 72.50 | 75.39 | 76.81 | 76.81 | 77.95 | … | 79.83 | 77.74 | 75.28 | 71.88 | 66.63 | 83.75 | 85.85 | 88.30 | 91.70 | 96.95 |
| 1 | MT_002 | 2014-12-25 01:00:00 | 2014-12-24 23:00:00 | 81.08 | 72.55 | 66.09 | 68.28 | 69.70 | 69.70 | 71.12 | … | 70.59 | 68.49 | 66.04 | 62.63 | 57.39 | 74.51 | 76.60 | 79.06 | 82.46 | 87.70 |
| 2 | MT_002 | 2014-12-25 02:00:00 | 2014-12-24 23:00:00 | 76.10 | 68.28 | 55.85 | 62.59 | 66.86 | 66.86 | 66.86 | … | 66.32 | 64.22 | 61.77 | 58.37 | 53.12 | 70.24 | 72.33 | 74.79 | 78.19 | 83.44 |
| … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … |
| 1677 | MT_012 | 2014-12-31 21:00:00 | 2014-12-30 23:00:00 | 727.66 | 806.38 | 597.53 | 634.47 | 696.60 | 761.70 | 768.09 | … | 779.07 | 749.86 | 715.66 | 668.24 | 595.11 | 833.69 | 862.91 | 897.11 | 944.53 | 1017.66 |
| 1678 | MT_012 | 2014-12-31 22:00:00 | 2014-12-30 23:00:00 | 691.49 | 744.68 | 550.21 | 616.17 | 653.19 | 666.17 | 716.17 | … | 717.37 | 688.15 | 653.96 | 606.54 | 533.41 | 771.99 | 801.21 | 835.40 | 882.83 | 955.96 |
| 1679 | MT_012 | 2014-12-31 23:00:00 | 2014-12-30 23:00:00 | 665.96 | 661.70 | 468.09 | 553.19 | 592.77 | 608.51 | 640.85 | … | 634.39 | 605.17 | 570.98 | 523.56 | 450.43 | 689.01 | 718.23 | 752.43 | 799.85 | 872.98 |
- Scaled CRPS and mean quantile loss over are the headline distributional accuracy metrics.
- Empirical 95% coverage is the fraction of observations inside the 95% interval, which should be close to 0.95 for a calibrated model.
- Mean 95% interval width measures the sharpness of the intervals.
| CSP-Adaptive | SeasonalNaive | |
|---|---|---|
| metric | ||
| mqloss | 22.66 | 28.77 |
| scaled_crps | 0.10 | 0.13 |
| CSP-Adaptive | SeasonalNaive | |
|---|---|---|
| metric | ||
| coverage_level95 | 0.93 | 0.84 |
| mean 95% interval width | 306.75 | 257.12 |
SeasonalNaive undercover noticeably.
All of this comes from a model with zero trained parameters that
evaluates in a fraction of a second.
Fixed vs. adaptive variant
Withvariant="fixed", the mixture weight is always . The
adaptive variant only deviates from this when seasonality is absent
(season_length ≤ 1) or the seasonal pool is thin. On a series this
long, the two variants behave identically. To see the adaptive rule act,
we now forecast from a short history of two and a half days. Each
hour of the day has been observed at most 3 times, and the adaptive rule
shrinks the seasonal pool’s weight to 0.3, leaning more on the
calibration residuals.
| mean 95% width | |
|---|---|
| CSP-Adaptive | 31.06 |
| CSP-Fixed | 29.96 |
variant="adaptive", as it reduces to the fixed rule whenever the
history is rich enough.
References
- Valery Manokhin (2026). “Training-Free Probabilistic Time-Series Forecasting with Conformal Seasonal Pools”.
ConformalSeasonalPoolAPI reference.SeasonalNaiveAPI reference.- Conformal prediction intervals for any StatsForecast
model. CSP is natively
conformal. For models that are not, the
ConformalIntervalswrapper described in that tutorial adds conformal intervals on top. - Trindade, Artur (2015). “ElectricityLoadDiagrams20112014”. UCI Machine Learning Repository.

