1# F3-conf-03 — Rolling-origin ridge forecasts of US IP growth (h = 1)23## Question4Over 60 forecast origins (2021-09 … 2026-08), does a fixed-penalty (λ = 50) ridge regression on 8 standardised predictors forecast next month's industrial production growth (100·Δln INDPRO) better than (a) the naive last-value forecast and (b) the expanding historical mean? We report out-of-sample RMSE/MAE and 1 − RMSE_ridge/RMSE_baseline.56## Data and exclusions7- `data/ip_predictors.csv`: 417 rows, 1992-01 to 2026-09, no duplicate or missing months. Current-vintage FRED data. Publication lags are ignored, as the task says.8- Missing values: `neworder_chg` for 1992-01 and 1992-02 (documented in the README). These rows never enter the analysis, because training rows start at 1992-03.9- A small mismatch with the README: it says the 1992-01 value of every change series is empty, but `ip_growth`, `oil_chg` and `permit_chg` have values for 1992-01. I used these values as given. Only `ip_growth` 1992-01 is actually used, as the lag-2 feature of the first training row (1992-03), which is what the task spec asks for.10- Extreme target values (2008-09: −4.50; 2020-04: −14.14; 2020-06: +6.35) are real observations. I kept them without winsorising, because the model is fully specified. They fall inside every training window.11- At the last origin there are 413 training rows (s = 1992-03 … 2026-07).1213## Method14- **Naive:** the forecast for t+1 is ip_growth_t.15- **Expanding mean:** the mean of ip_growth from 1992-04 to t.16- **Ridge:** at each origin t the training rows are s ∈ [1992-03, t−1], with target ip_growth_{s+1}. The features are (ip_growth_s, ip_growth_{s−1}, ip_growth_{s−2}, oil_chg_s, fedfunds_s, permit_chg_s, neworder_chg_s, tcu_s).17 - At every origin, features are standardised with the mean and sample SD (ddof = 1) of that origin's training rows only (`normalisation_window = "expanding"`). The target is centred on its training mean ȳ.18 - Coefficients: b = (Z′Z + 50·I)⁻¹Z′(y − ȳ). There is no penalised intercept.19 - Forecast: ȳ + z̃_t·b.20 - The latest target used in training is dated t, so no data after the origin enters.21- **Evaluation:** errors are forecast − actual over the 60 targets (2021-10 … 2026-09). The script is `out/analysis.py` and it is deterministic. The only random step is the supplementary bootstrap, which uses seed 0.2223## Results24| model | RMSE (pp/month) | MAE (pp/month) |25|---|---|---|26| naive | 0.8831 | 0.6990 |27| expanding mean | 0.5439 | 0.4293 |28| ridge (λ=50) | 0.5608 | 0.4514 |2930- Relative RMSE improvement of ridge over naive: **+0.365** (ridge is better).31- Relative RMSE improvement of ridge over the expanding mean: **−0.031**. Ridge is about 3% worse than the mean in RMSE, and also worse in MAE.3233The ridge model clearly beats the naive forecast. It does **not** beat the expanding historical mean in this evaluation window.3435## Uncertainty36These figures are supplementary. They are not required keys and are stored in `out/supplementary_uncertainty.json`.3738- **Diebold–Mariano tests** (squared loss, Harvey–Leybourne–Newbold correction, t_{59} reference):39 - Naive vs ridge: DM = 3.36, p = 0.0014 with lag 0; DM = 3.53, p = 0.0008 with Newey–West lag 4.40 - Mean vs ridge: DM = −0.54, p = 0.59 with lag 0; DM = −0.58, p = 0.56 with lag 4.41- **Moving-block bootstrap** (block length 6, 5000 draws, seed 0), 95% intervals for the relative improvement:42 - vs naive: [0.25, 0.43].43 - vs mean: [−0.16, 0.06].4445The gain over naive is statistically significant. The difference between ridge and the expanding mean cannot be distinguished from zero. With 60 evaluation points, the tests have low power.4647## Limitations and open issues48- The data are current-vintage, revised series (INDPRO, TCU and NEWORDER are revised heavily), and publication lags are ignored. The results are therefore not real-time forecast accuracy.49- The evaluation window is short (60 months) and covers a single post-COVID period. The relative ranking may not hold in other periods.50- λ = 50 is fixed by the spec and was not tuned. The training data include the 2020 COVID outliers, which may distort the coefficients and standardisation statistics. A robust or tuned specification might perform differently, but it was not part of the task.51- DM tests compare forecasts from nested and estimated models, so their reference distribution is approximate.52