# 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.