F3-conf-03 — Rolling-origin ridge forecasts of US IP growth
Question
Over 60 rolling origins (2021-09 … 2026-08), at horizon h = 1 month, does a fixed-penalty ridge regression (λ = 50) on 8 standardised predictors forecast US industrial production growth (100·Δln INDPRO) better than (i) the naive last-value forecast and (ii) the expanding historical mean (from 1992-04)?
Data and exclusions
data/ip_predictors.csv, 417 monthly rows (1992-01 to 2026-09), current FRED vintage. neworder_chg is empty for 1992-01/02 (the README also says the 1992-01 values of the other change series are empty, but they are filled in the file; I used them as given). None of these gaps affects the analysis. Ridge training rows start at s = 1992-03, where all 8 features exist. The 2020 COVID swings (ip_growth from −14.1 to +6.3 %) fall inside every training window and were kept, because the specification does not mention outlier treatment. No rows were dropped. At the last origin there are 413 training rows.
Method
- Naive forecast = ip_growth_t. Mean forecast = the mean of ip_growth from 1992-04 to t.
- Ridge setup at each origin t:
- Training pairs (z_s, y_{s+1}) for 1992-03 ≤ s ≤ t−1.
- Features z_s = (ip_s, ip_{s−1}, ip_{s−2}, oil_chg_s, fedfunds_s, permit_chg_s, neworder_chg_s, tcu_s).
- Each feature is standardised with the training-window mean and sample SD (ddof = 1). These are recomputed at every origin (expanding window, no full-sample statistics).
- The target is centred on its training mean ȳ.
- Ridge fit: b = (Z′Z + 50·I)⁻¹Z′(y−ȳ), and the forecast is ȳ + z̃_t·b. No value dated after t is used.
- Errors (forecast − actual) are scored on ip_growth_{t+1}.
- Supplementary checks:
- Diebold–Mariano test with squared loss and Harvey–Leybourne–Newbold correction (h = 1, so no autocorrelation adjustment).
- IID bootstrap over origins (5000 draws, seed 20261030) for the relative improvements.
Results
| model | RMSE (%/month) | MAE (%/month) |
|---|---|---|
| naive | 0.8831 | 0.6990 |
| expanding mean | 0.5439 | 0.4293 |
| ridge (λ=50) | 0.5608 | 0.4514 |
- Relative improvement of ridge vs naive (1 − RMSE_ridge/RMSE_naive) = 0.365.
- Relative improvement of ridge vs mean = −0.031: ridge's RMSE is about 3.1 % worse than the mean's, and its MAE is also worse.
Ridge clearly beats the naive forecast but does not beat the expanding historical mean.
Uncertainty
- Ridge vs naive: DM statistic = −3.36, p = 0.0014; bootstrap 95 % CI for the relative improvement is [0.235, 0.463]. The gain over naive is robust.
- Ridge vs mean: DM statistic = 0.54, p = 0.59; bootstrap 95 % CI is [−0.168, 0.072]. The two cannot be told apart statistically.
- With only 60 origins, these intervals are wide. The IID bootstrap ignores any serial dependence in the loss differentials.
Limitations and open issues
- The data are current vintage and publication lags are ignored. The results measure how predictable the revised series is under a stylised timing assumption, not real-time forecast performance.
- λ is fixed at 50 and was not tuned. Results for other penalties, or for robust handling of the COVID outliers, were not evaluated.
- The evaluation window (2021-09 to 2026-08) is a single post-COVID period, so the conclusions may not carry over to other periods.
- The README's description of empty cells does not match the file for 1992-01. This does not affect the results.