SPB Git

spb/wp29_uqo

Public

# F3-conf-01 — Forecasting Canadian monthly GDP yoy growth under publication lags

# Question

At the end of each month t (48 origins, first_origin = 2022-05-01 to last_origin = 2026-04-01; n_origins), forecast year-over-year growth of Canadian monthly real GDP for months t+1 and t+3 using only data published by then (GDP up to t−2, LFS employment up to t−1). Compare the naive forecast (gdp_yoy of t−2) with a model that also uses employment growth, using RMSE, MAE and 1 − RMSE_model/RMSE_naive.

# Data and exclusions

One file, data/canada_gdp_employment.csv: 345 rows (n_input_rows), 1998-01 to 2026-09. Its SHA-256 matches data/README.md (details in out/state/data_audit.md). GDP is missing for 2026-08 and 2026-09 because it was not yet published. These months are never needed. The latest GDP month used anywhere is 2026-02 (last_target_date_available), and the latest target month is 2026-07. Data issues and how each was handled are listed in data_issues:

  • The README says the first 12 yoy values are empty, but the file has values for 1998. They were used as given.
  • The pandemic months are extreme outliers, with gdp_yoy ranging from −16.2 % to +18.5 %. Any training pair whose regressor or target month falls in 2020-03..2021-12 was excluded from estimation. This rule was fixed before any forecasts were computed, and the excluded window ends before the information set of the first origin begins.

At every origin the script cuts the data by date (GDP ≤ t−2, employment ≤ t−1) and checks the cut with assertions. out/exclusions.csv gives the exclusion ledger for the last estimation sample (origin 2026-04-01, h=1): 345 → 343 after dropping missing GDP, → 338 after keeping only GDP available at the origin, → 335 after keeping only training targets observed at the origin, → 310 after the pandemic exclusion. That leaves n_analysed = 310. The h=3 sample at the same origin has 306 rows, because it loses two more training targets and two more pandemic-touching pairs.

# Method

  • Naive: the forecast for both horizons is gdp_yoy[t−2].
  • Model adl_emp_direct (model_name, model_description): a direct OLS regression estimated separately for each horizon. It regresses gdp_yoy[m+h+2] on a constant, gdp_yoy[m] and emp_yoy[m+1]. The step of h+2 reflects the two-month GDP publication lag.
    • It is re-estimated at each origin on an expanding sample starting in 1998, using only pairs whose months were all published at t.
    • The forecast plugs in gdp_yoy[t−2] and emp_yoy[t−1].
    • The specification was fixed in advance; no model selection was done on the evaluation period.
    • The method has no randomness (random_seed = null).
  • Each forecast's last_target_date_used and last_predictor_date_used are recorded in out/forecasts.csv (192 rows) and checked to be ≤ t−2 and ≤ t−1 respectively.
  • Errors are computed against the current-vintage gdp_yoy.

# Results

horizon RMSE naive MAE naive RMSE model MAE model 1 − RMSE ratio
h=1 0.814 (rmse_naive_h1) 0.642 (mae_naive_h1) 0.743 (rmse_model_h1) 0.604 (mae_model_h1) 0.087 (rel_improvement_rmse_h1)
h=3 1.140 (rmse_naive_h3) 0.872 (mae_naive_h3) 0.902 (rmse_model_h3) 0.753 (mae_model_h3) 0.208 (rel_improvement_rmse_h3)

All errors are in percentage points. Over the 48 origins, the model has lower RMSE and MAE than the naive forecast at both horizons: about 9 % lower RMSE at h=1 and 21 % lower at h=3.

# Uncertainty

  • Diebold–Mariano test. This compares squared-error losses, using a Newey–West variance with h+1 lags (the overlapping errors are h+2 steps ahead) and a t(47) reference distribution. It gives a statistic of 1.41 with two-sided p = 0.165 at h=1 (dm_stat_h1, dm_pvalue_two_sided_h1), and 1.52 with p = 0.134 at h=3 (dm_stat_h3, dm_pvalue_two_sided_h3).
  • Interpretation. The improvements are not statistically significant at conventional levels with only 48 overlapping origins.
  • Where the gain comes from. A diagnostic breakdown by origin year, computed from out/forecasts.csv but not stored in results.json, shows that a large part of the gain comes from the 2022 origins, when post-pandemic growth was reverting quickly.

# Limitations and open issues

  • The data are the current vintage, and both GDP and LFS are revised after first release. The exercise simulates publication timing only and makes no claim of real-time validity.
  • The model combines mean reversion (an intercept and a coefficient on lagged GDP below one) with employment growth. I did not run a separate model without employment, so this exercise does not show how much of the gain is due to employment specifically.
  • Results depend on the a-priori pandemic exclusion window and on a short evaluation period of 48 overlapping origins.
  • The README and the data disagree about whether yoy values are present for 1998. The 1998 values were used as given.
Files · main
Menu

Theme