F3-conf-04 — Multi-horizon forecasts of Canadian quarterly CPI inflation
Question
Over 40 rolling origins (2015Q4–2025Q3), does a seasonal autoregression forecast Canadian quarterly CPI inflation (annualised, NSA) better than the seasonal-naive forecast at h = 1, 2, 4? And at h = 4, is the mean squared-error loss differential different from zero once we allow for the serial correlation that overlapping 4-step errors create?
Data and exclusions
data/cpi_quarterly.csv: 127 rows read (1995Q1–2026Q3).data/cpi_monthly.csv: 381 rows read. I used it only to check provenance: rebuildinginfl_annualisedfrom the monthly file matches the given series to within 5e-7.- The quarters run in an unbroken sequence and nothing is missing apart from 1995Q1 inflation, which cannot be computed because there is no earlier quarter. I dropped that row, so the usable series is 1995Q2 onward (126 observations).
- Targets run from 2016Q1 to 2026Q3. Nothing else was excluded.
Method
- Model (
ar_seas_aic): OLS of y_t on a constant, Q2/Q3/Q4 dummies and p own lags. At each origin p ∈ {0,…,4} is chosen by AIC, comparing all lag lengths on the same sample. The model is then re-estimated on all usable observations from 1995Q2 to the origin (expanding window). Multi-step forecasts are iterated, using the known seasonal dummies of the target quarters. Every estimation and selection step uses only quarters ≤ origin. AIC chose p = 2 for origins up to 2021Q3 and p = 1 after that. The last estimation sample has 121 observations. - Seasonal naive: the forecast for quarter t+h is y in quarter t+h−4.
- Metrics: RMSE and MAE of the 40 errors per horizon, and relative RMSE improvement 1 − RMSE_model/RMSE_snaive.
- DM test at h = 4: d_t = e²_snaive − e²_model. The standard error of d̄ uses a Newey–West (Bartlett kernel) long-run variance with truncation lag 3 (= h − 1), and the p-value is two-sided from N(0,1). I fixed this specification before seeing any results. Sensitivity checks are in
out/sensitivity.json, whichanalysis.pyalso writes.
Results
| h | RMSE snaive | RMSE model | MAE snaive | MAE model | rel. RMSE improvement |
|---|---|---|---|---|---|
| 1 | 2.849 | 2.193 | 2.137 | 1.519 | 0.230 |
| 2 | 2.847 | 2.463 | 2.126 | 1.553 | 0.135 |
| 4 | 2.882 | 2.343 | 2.181 | 1.597 | 0.187 |
(Units: percentage points, annualised.) At all three horizons the model has lower RMSE and lower MAE than the seasonal-naive forecast.
At h = 4: d̄ = 2.818 squared pp, HAC SE = 2.086 (Bartlett, lag 3), DM = 1.35, two-sided p = 0.177. The h = 4 improvement is not statistically distinguishable from zero at conventional levels.
Uncertainty
- How strong the h = 4 evidence looks depends on how the long-run variance is estimated:
- Bartlett lag 4: DM 1.52, p = 0.13.
- Rectangular lag 3: DM 1.66, p = 0.097.
- Bartlett lag 6: DM 2.04, p = 0.041.
- Harvey–Leybourne–Newbold small-sample correction with t(39): p = 0.23.
- Only the longest lag (6) falls below 5%. That result is a post-hoc sensitivity check and should not replace the pre-specified test. With 40 overlapping errors the long-run variance is imprecisely estimated.
- Descriptive DM tests at shorter horizons give p ≈ 0.10 at h = 1 and p ≈ 0.42 at h = 2.
- The 2021–2023 inflation surge dominates the losses. Dropping h = 4 targets in 2021–2023 (28 origins remain) gives RMSE 2.03 for snaive and 1.52 for the model, so the model's ranking stays the same.
Limitations and open issues
- I picked one model before looking at the evaluation results; I did not search over specifications. Other models might do better or worse.
- Errors are computed on the current data vintage, so I make no claim about real-time performance. In reality the data are published about three weeks after quarter-end, and the CPI basket is periodically updated.
- 40 origins is a small sample. The DM test relies on asymptotic approximations, and the standard error is sensitive to the kernel and lag choice.
- The DM test treats forecasts as given. It does not adjust for parameter-estimation uncertainty, which is fine for comparing these particular forecasts (in the Giacomini–White sense).