F3-conf-01: Forecasting Canadian monthly GDP y/y growth when data are published with a lag
Question
At the end of each month t, for the 48 origins from 2022-05 to 2026-04, how accurately can year-over-year growth of Canadian monthly real GDP be forecast for t+1 and t+3? Only data that would have been published by then are used: GDP up to month t−2 and LFS employment up to month t−1. The question is also whether a model that adds the more timely employment growth beats the naive forecast, which is gdp_yoy(t−2).
Data and exclusions
data/canada_gdp_employment.csv: 345 rows covering 1998-01 to 2026-09. These are current-vintage Statistics Canada series v65201210 (GDP) and v2062811 (LFS employment).- Checks: the monthly index has no gaps or duplicates. From 1999-01 onward,
gdp_yoyandemp_yoymatch a recomputation from the levels exactly. The 1998 yoy values are filled in, even though the README says the first 12 months are empty and the file has no 1997 levels. I kept them as given. GDP is missing for 2026-08 and 2026-09, which is expected because those months were not yet published. - Exclusion (decided before seeing any results): when estimating the model, I drop every training pair that spans any month from 2020-03 to 2021-12. Over that COVID-19 period y/y GDP growth swung between −16.2% and +18.5%. The naive forecast is not affected by this choice. A sensitivity run with no exclusion is reported below.
- Availability at the last origin (2026-04): GDP up to 2026-02-01 and employment up to 2026-03-01.
Method
- Naive forecast: ŷ(t+h) = gdp_yoy(t−2) for both h=1 and h=3.
- Model
direct_ardl_emp: a direct OLS regression estimated separately for each horizon, with k = h+2: gdp_yoy(m+k) = a + b·gdp_yoy(m) + c·emp_yoy(m+1) + u. This mirrors the forecasting setup exactly: from GDP at t−2 and employment at t−1, predict GDP at t+h.- It is re-estimated at every origin on an expanding window that starts in 1998.
- A training pair is used only if its target month is ≤ t−2 and its employment month is ≤ t−1. Consequently the latest training target is t−2.
- The forecast plugs in gdp_yoy(t−2) and emp_yoy(t−1).
- There is no model selection inside the loop. I fixed the specification once, before evaluating it.
- Error measures: RMSE and MAE over the 48 origins for each horizon, computed against current-vintage actuals.
- Ledger:
out/forecasts.csvhas 192 rows and records, for every row, the latest target and predictor months used.
Results
| Horizon | RMSE naive | MAE naive | RMSE model | MAE model | 1 − RMSE ratio |
|---|---|---|---|---|---|
| h=1 | 0.814 | 0.642 | 0.743 | 0.604 | 0.087 |
| h=3 | 1.140 | 0.872 | 0.902 | 0.753 | 0.208 |
All values are in percentage points. The model beats the naive forecast on both RMSE and MAE at both horizons: RMSE falls by about 9% at h=1 and 21% at h=3. The last estimation sample (origin 2026-04, h=3) contains 306 observations; the h=1 sample is slightly larger.
Uncertainty
- Diebold–Mariano tests (squared-error loss, Newey–West variance with h−1 lags, Harvey–Leybourne–Newbold correction, t(47) reference):
- h=1: statistic 2.03, two-sided p = 0.048.
- h=3: statistic 1.65, p = 0.105.
- With only 48 overlapping origins from one post-COVID episode, the gains are therefore borderline evidence at h=1 and not statistically significant at the 5% level at h=3.
- Sensitivity to the COVID exclusion: keeping the 2020–21 pairs in the training sample gives model RMSE 0.804 at h=1 (only 1% better than naive) and 0.794 at h=3 (better than the main specification). How large the gain is depends on how the pandemic period is handled. The direction, model beating naive, holds in both versions.
- No resampling was used, so no random seed.
Limitations and open issues
- The data are current vintage. The exercise simulates publication timing only, not the values first published, so the results have no real-time validity. Revisions to GDP and LFS data could change both the errors and the ranking.
- Not all of the gain can be credited to employment. The model also adds an intercept and estimates persistence (b < 1, so forecasts are pulled toward the mean), and that by itself may beat the random walk. I did not run a GDP-only AR benchmark, so how much employment itself contributes is not separated out.
- The 48 evaluation targets overlap, especially at h=3, and cover a single period of slowing growth, so the evidence about other periods is limited.
- The 1998 yoy values cannot be checked against the file's levels (see Data).