1# F3-conf-01 — Forecasting Canadian monthly GDP y/y growth under publication lags23## Question4At the end of each month t, for 48 origins from 2022-05 to 2026-04 (`n_origins`, `first_origin`, `last_origin`), how accurately can the year-over-year growth of Canadian monthly real GDP be forecast for month t+1 and t+3 using only data published by then? And does a model that adds the more timely LFS employment growth beat the naive forecast (GDP y/y of month t−2)? At the last origin, the latest GDP month available is 2026-02 (`last_target_date_available`) and the latest employment month available is 2026-03 (`last_predictor_date_available`).56## Data and exclusions7- Input: `data/canada_gdp_employment.csv`, 345 rows (`n_input_rows`), covering 1998-01 to 2026-09. Its SHA-256 matches the README. There are no duplicate months and no gaps. GDP is missing only for 2026-08 and 2026-09, which have not been published. When the y/y columns are recomputed from the levels, they match to within 5e-5 from 1999-01 onward. The full audit is in `out/state/data_audit.md`.8- Data issues and how they were handled are listed under `data_issues`:9 1. The 1998 y/y values are present, although the README says they should be empty, and they cannot be verified from the levels. They are excluded from estimation.10 2. The COVID-19 period 2020-03..2021-12 contains extreme outliers. Training pairs whose target or regressor month falls in that window are dropped. This rule was fixed in advance and was already known at the first origin.11 3. The data are the current vintage, not real-time vintages.12- Exclusion ledger (`out/exclusions.csv`), for the last estimation sample (origin 2026-04, h=1): 345 → 333 (drop 1998) → 326 (keep only targets ≤ 2026-02, i.e. observed at the origin) → 323 (drop targets whose lagged regressors are not available) → 298 (drop pairs touching the COVID window). That leaves 298 observations (`n_analysed`). For h=3 the last estimation sample has 294 observations (`n_analysed_h3_last_origin`).1314## Method15- **Naive baseline:** the forecast for both horizons is gdp_yoy[t−2].16- **Model `dar_emp`** (`model_name`, `model_description`): a direct OLS regression estimated separately for each horizon h:17 - gdp_yoy[m] = a + b·gdp_yoy[m−h−2] + c·emp_yoy[m−h−1].18 - It is re-estimated at every origin on an expanding window starting in 1999.19 - Training targets are restricted to months m ≤ t−2, so every target is observed at the origin, and employment is restricted to months ≤ t−1.20 - The forecast plugs in gdp_yoy[t−2] and emp_yoy[t−1].21- Every forecast records the last GDP and employment dates it used (`out/forecasts.csv`, 192 rows). Checks confirm that all of them respect the availability rules (`out/state/checks.md`).22- **Evaluation:** RMSE and MAE over the 48 origins, computed against the current-vintage `gdp_yoy` of month t+h.23- There is no randomness (`random_seed` = null).2425## Results26| horizon | naive RMSE | naive MAE | model RMSE | model MAE | 1 − RMSE_model/RMSE_naive |27|---|---|---|---|---|---|28| h=1 | 0.814 (`rmse_naive_h1`) | 0.642 (`mae_naive_h1`) | 0.743 (`rmse_model_h1`) | 0.603 (`mae_model_h1`) | 0.087 (`rel_improvement_rmse_h1`) |29| h=3 | 1.140 (`rmse_naive_h3`) | 0.872 (`mae_naive_h3`) | 0.885 (`rmse_model_h3`) | 0.735 (`mae_model_h3`) | 0.224 (`rel_improvement_rmse_h3`) |3031All values are in percentage points, except the last column, which is a fraction.3233The employment-augmented model has a lower RMSE and a lower MAE than the naive forecast at both horizons. The gain is larger at h=3, where the naive forecast is effectively 5 months stale.3435## Uncertainty36- **Diebold–Mariano test** (squared loss, Newey–West variance with h−1 lags, Harvey–Leybourne–Newbold correction, t(47) reference distribution):37 - h=1: DM = −2.08, p = 0.043 (`dm_stat_h1`, `dm_pvalue_h1`).38 - h=3: DM = −1.72, p = 0.093 (`dm_stat_h3`, `dm_pvalue_h3`).39 - The h=1 gain is significant at 5%. The h=3 gain is significant only at 10%.40- With only 48 overlapping origins, these tests have low power and only approximate size.41- **Sensitivity to the COVID exclusion** (`sens_nocovidexcl_*`): when the COVID-window pairs are kept, the model still beats the naive forecast, but the gains shift:42 - h=1 improvement: 0.027 (`sens_nocovidexcl_rel_improvement_rmse_h1`).43 - h=3 improvement: 0.319 (`sens_nocovidexcl_rel_improvement_rmse_h3`).44 - So the size of the improvement depends on this specification choice, though its sign does not.4546## Limitations and open issues47- The data are the current vintage. The exercise reproduces publication timing only, not the first-release values, so these results do not have real-time validity.48- Only one model specification was evaluated (`model_name`). No model selection was done, so there is no selection bias, but no alternative specifications are reported either.49- The evaluation window 2022–2026 follows the pandemic. GDP growth was declining over this period, which favours models with mean reversion. The results may not carry over to other periods.50- The 1998 y/y values could not be verified and were excluded. This has a negligible effect on the training sample.51- The feasibility status is "complete" (`feasibility`).52