SPB Git

spb/wp29_uqo

Public

# F3-conf-04 — Multi-horizon forecasts of Canadian quarterly CPI inflation

# Question

Across 40 rolling origins from 2015Q4 to 2025Q3, does a simple time-series model forecast Canadian quarterly CPI inflation (400·Δln of the quarterly-average CPI, not seasonally adjusted) better than the seasonal-naive forecast at h = 1, 2 and 4? And at h = 4, is the mean squared-error loss differential distinguishable from zero once we use a HAC standard error that allows for the serial correlation caused by overlapping forecast errors?

# Data and exclusions

  • data/cpi_quarterly.csv has 127 rows read (1995Q1–2026Q3). data/cpi_monthly.csv has 381 rows read and was used only for checks: every quarter has 3 months, cpi_avg matches the monthly mean (max abs diff 3e-7), and infl_annualised matches 400·Δln(cpi_avg) (max abs diff 3e-6). I found no duplicate quarters and no gaps.
  • 1995Q1 has no inflation value, so it is left out of estimation. Nothing else is excluded.
  • The evaluation window includes the 2020 COVID shock and the 2021–23 inflation surge. I did not winsorise these quarters.
  • The data are a current vintage. I make no claim of real-time validity.

# Method

  • Seasonal naive. The forecast for quarter t+h is the observed value of quarter t+h−4.
  • Model (ar_sdum_aic). OLS of inflation on four quarter-of-year intercept dummies plus p own lags.
    • The window expands from 1995Q2 to the origin, so each forecast uses only data dated ≤ origin.
    • At each origin, p ∈ {0,…,4} is chosen by AIC on a common sample (starting after the first 4 observations). The chosen model is then re-estimated on the full window.
    • Multi-step forecasts are built by iterating the model forward. AIC chose p = 2 up to 2021Q4 and p = 1 from 2022Q1 on.
    • The last estimation sample has 121 observations.
  • Forecast errors. e = actual − forecast. RMSE and MAE are computed over 40 forecasts per horizon.
  • h = 4 test. d_t = e²_snaive − e²_model.
    • The standard error of d̄ uses a Bartlett (Newey–West) long-run variance with truncation lag 4. This gives non-zero weight to autocovariances 1–4, which covers the required h−1 = 3.
    • I chose this specification before looking at the test results.
    • The p-value is two-sided and uses a Student t with 39 df.
    • No randomness is involved, so no seed was set.

# Results

h RMSE snaive RMSE model MAE snaive MAE model 1 − RMSE ratio
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

(Errors are in percentage points, annualised.) At every horizon the model has lower RMSE and lower MAE than the seasonal-naive forecast. The relative RMSE improvement is 13–23%.

At h = 4, d̄ = 2.818 squared pp, with HAC SE 1.851 (Bartlett, lag 4). This gives DM = 1.52 and p = 0.136. At the 5% level the difference is not statistically distinguishable from zero.

# Uncertainty

The DM result changes with the truncation lag chosen for the long-run variance. All variants below are in results.json → supplementary.dm_sensitivity:

Variant DM p
Bartlett, lag 3 1.35 0.18
Rectangular, lag 3 1.66 0.11
Rectangular lag 3 with Harvey–Leybourne–Newbold correction 1.51 0.14
Bartlett, lag 6 2.04 0.048
Bartlett, lag 8 2.35 0.024
  • Longer lags shrink the SE, which suggests negative higher-order autocorrelation in d_t.
  • With only 40 overlapping observations, a long-run variance estimate is imprecise. I keep the pre-specified lag-4 result as primary rather than picking the lag that gives significance.
  • The fair summary is weak, fragile evidence in favour of the model at h = 4.

Supplementary DM tests at the other horizons are also not significant at 5%:

  • h = 1: d̄ = 3.31, p = 0.105 (Bartlett lag 1).
  • h = 2: d̄ = 2.04, p = 0.447 (Bartlett lag 2).

If targets in 2020–2023 are dropped, the h = 4 mean loss differential falls to 1.27 (n = 24). So part of the advantage comes from the volatile period.

# Limitations and open issues

  • There are only 40 origins and their errors overlap. As a result, DM inference is low-powered and depends on the lag choice.
  • The evaluation window has a structural break (pandemic and the inflation surge). Squared-error differentials are dominated by a few quarters.
  • The model is deliberately simple: no exogenous predictors, constant seasonality, and an expanding window. Other model choices could rank differently. I selected only one model and did no model search on evaluation data.
  • The data are a current vintage, not real-time.
  • I did not apply the Giacomini–White or Clark–West adjustments. The models are not nested in the DM sense, since seasonal naive is a restricted random walk on the 4th lag with no estimation.
Files · main
Menu

Theme