1# F3-conf-03 — Rolling-origin ridge forecasts of US industrial production growth23## Question4Does a fixed-penalty ridge regression (λ = 50) on eight standardised monthly predictors forecast next month's US industrial production growth (100·Δln INDPRO, percent per month) better than the naive (last value) forecast and the expanding historical mean, over the 60 origins 2021-09-01 … 2026-08-01 (`n_origins`, `first_origin`, `last_origin`) at horizon h = 1?56## Data and exclusions7`data/ip_predictors.csv` (417 rows, `n_input_rows`; SHA-256 matches the README), monthly 1992-01 to 2026-09, current-vintage FRED data. Only missing cells: `neworder_chg` 1992-01/02, which are never used. Exclusion ledger (`out/exclusions.csv`) for the training sample at the last origin: 417 rows → drop 2 months before 1992-03 (lags/feature not defined, task-specified start) → drop 2 months whose next-month target lies after the 2026-08 origin → 413 training rows (`n_analysed`). The data problems found and how they were handled are listed under `data_issues`: the README describes the 1992-01 cells inaccurately (harmless), COVID-19 outliers were kept, and the data are current-vintage.89## Method10- Naive: forecast for t+1 = ip_growth_t. Expanding mean: mean of ip_growth over 1992-04 … t.11- Ridge (`lambda` = 50, `n_features` = 8): training rows s from 1992-03 to t−1 (target ip_growth_{s+1} ≤ t). Features: ip_growth_s, its lags 1 and 2, oil_chg, fedfunds, permit_chg, neworder_chg, tcu. Each feature is standardised with the training-window mean and sample SD (ddof = 1), recomputed at each origin (`normalisation_window` = "expanding"). The target is centred on its training mean ȳ, which serves as the unpenalised intercept. b = (Z′Z + λI)⁻¹Z′(y − ȳ), and the forecast is ȳ + z̃_t·b.12- Errors are forecast − actual on the 60 targets 2021-10 … 2026-09. Accuracy measures are RMSE and MAE, and the relative improvement is 1 − RMSE_ridge/RMSE_baseline.13- Uncertainty: Diebold–Mariano tests of equal squared-error loss, with the Harvey–Leybourne–Newbold small-sample correction and t₅₉ reference. Not required by the task; added to support the Uncertainty section.14- The method is deterministic, so no random seed is used (`random_seed` = null). `out/analysis.py` regenerates every number.1516## Results17| model | RMSE (pp/month) | MAE (pp/month) |18|---|---|---|19| naive | 0.8831 (`rmse_naive`) | 0.6990 (`mae_naive`) |20| expanding mean | 0.5439 (`rmse_mean`) | 0.4293 (`mae_mean`) |21| ridge λ=50 | 0.5608 (`rmse_ridge`) | 0.4514 (`mae_ridge`) |2223- Ridge vs naive: its RMSE is 36.5% lower (`rel_improvement_vs_naive` = 0.3649).24- Ridge vs expanding mean: its RMSE is 3.1% higher (`rel_improvement_vs_mean` = −0.0310). Its MAE is also higher than the mean's (0.4514 vs 0.4293, `mae_ridge`, `mae_mean`).25- So the ridge model beats the naive forecast but does not beat the expanding historical mean over this evaluation window.2627## Uncertainty28- Ridge vs naive: DM statistic −3.36, p = 0.0014 (`dm_stat_ridge_vs_naive`, `dm_pvalue_ridge_vs_naive`). The naive forecast's larger loss is statistically significant at conventional levels.29- Ridge vs mean: DM statistic 0.54, p = 0.59 (`dm_stat_ridge_vs_mean`, `dm_pvalue_ridge_vs_mean`). The 3.1% RMSE gap is not distinguishable from zero.30- With only 60 monthly errors, the ranking of ridge against the mean should be treated as inconclusive rather than as clear evidence that the mean is better.3132## Limitations and open issues33- Current-vintage (revised) data are used and publication lags are ignored. The results measure predictability of the revised series under stylised timing, not real-time forecasting performance.34- One penalty value (λ = 50) and a single 60-month window were evaluated, as the task specifies. No tuning or sensitivity analysis was done, so the conclusions may not carry over to other λ values or periods.35- The training windows contain the extreme COVID-19 months (2020-03 … 2020-06). These were kept because the specification is fixed, and they may distort the standardisation and the coefficients.36- The DM tests assume covariance-stationary loss differentials. The test is approximate in small samples.37- `feasibility` = "complete". All required quantities were produced.38