SPB Git

spb/wp29_uqo

Public

# F3-conf-03 — Rolling-origin ridge forecasts of US industrial production growth

# Question

Does a fixed-penalty ridge regression (λ = 50, key lambda) on 8 standardised monthly predictors (n_features) forecast next-month US industrial production growth (100 × Δln INDPRO, % per month) better than the naive (last value) and expanding-mean forecasts, over n_origins = 60 rolling origins from first_origin = 2021-09-01 to last_origin = 2026-08-01 (targets 2021-10 … 2026-09, keys first_target, last_target), at horizon h = 1?

# Data and exclusions

  • Input: data/ip_predictors.csv, 417 data rows (n_input_rows), 1992-01 … 2026-09, SHA-256 matches the README. No duplicate or missing months; only missing cells are neworder_chg for 1992-01/02 (full audit in out/state/data_audit.md).
  • Exclusions (out/exclusions.csv): (1) months before 1992-03 are not training rows (417 → 415); (2) at the last origin, rows s with s + 1 > 2026-08 have no available label (415 → 413). Training rows at the last origin: n_analysed = 413; at the first origin: n_train_first_origin = 354.
  • Data issues and handling are listed in data_issues: the README claims all change series are empty in 1992-01, but ip_growth, oil_chg, permit_chg are populated (used as given; only ip_growth 1992-01 enters, as a second lag); COVID-era extremes (ip_growth 2020-04 ≈ −14.1 %) are retained because the model is fully specified; data are current vintage.

# Method

  • Naive: forecast of ip_growth(t+1) = ip_growth(t). Expanding mean: mean of ip_growth over 1992-04 … t.
  • Ridge, exactly as specified: training rows s ∈ [1992-03, t−1] with label ip_growth(s+1) and features (ip_s, ip_{s−1}, ip_{s−2}, oil_chg_s, fedfunds_s, permit_chg_s, neworder_chg_s, tcu_s). Each origin recomputes the feature means and sample SDs (ddof = 1) and the target mean from its own training rows (normalisation_window = "expanding"); b = (Z′Z + 50 I)⁻¹ Z′(y − ȳ); forecast = ȳ + z̃_t · b. No intercept penalty. Nothing random (random_seed = null).
  • Evaluation: RMSE and MAE over the 60 forecast errors; relative improvement 1 − RMSE_ridge / RMSE_baseline. As a supplementary step, a Diebold–Mariano test (squared loss, h = 1, Harvey–Leybourne–Newbold correction, t₅₉ reference) compares the ridge and each baseline.
  • Verification (out/state/checks.md): an independent re-implementation matches all forecasts to within 5e-11. Corrupting every value dated after 2023-06 leaves all forecasts for origins ≤ 2023-06 unchanged (no look-ahead). A clean re-run reproduces the outputs byte for byte.

# Results

model RMSE (% / month) MAE (% / month)
naive 0.8831 (rmse_naive) 0.6990 (mae_naive)
expanding mean 0.5439 (rmse_mean) 0.4293 (mae_mean)
ridge (λ=50) 0.5608 (rmse_ridge) 0.4514 (mae_ridge)
  • Compared with the naive forecast, ridge improves RMSE by 36.5 % (rel_improvement_vs_naive = 0.365) and MAE by 35.4 % (rel_improvement_mae_vs_naive).
  • Compared with the expanding mean, ridge is worse: RMSE is 3.1 % higher (rel_improvement_vs_mean = −0.031) and MAE is 5.2 % higher (rel_improvement_mae_vs_mean = −0.052).
  • Answer: the ridge model beats the naive forecast but not the expanding historical mean over 2021-09 … 2026-08. Of the three forecasts, the unconditional expanding mean has the lowest error.
  • At the last origin, oil_chg has by far the largest ridge coefficient (+0.34 per SD, ridge_coef_last_origin). This most likely reflects the joint COVID-2020 collapse/rebound in oil prices and IP inside the training window. It is descriptive only.

# Uncertainty

  • Ridge vs naive: DM statistic −3.36, p = 0.0014 (dm_stat_ridge_vs_naive, dm_pvalue_ridge_vs_naive), so ridge's advantage over naive is statistically clear.
  • Ridge vs expanding mean: DM statistic 0.54, p = 0.59 (dm_stat_ridge_vs_mean, dm_pvalue_ridge_vs_mean). The two cannot be distinguished. The negative relative improvement is small and not statistically significant. The supported conclusion is "no evidence that ridge beats the mean", not "the mean is significantly better".
  • Only 60 evaluation points are available. The DM test assumes squared-loss differentials that are covariance-stationary and roughly serially uncorrelated (h = 1). No confidence intervals for RMSE ratios were computed.

# Limitations and open issues

  • Current-vintage (revised) data and ignored publication lags: these are pseudo-out-of-sample results on revised series under a stylised timing assumption. They do not show real-time forecast accuracy (INDPRO, TCU and NEWORDER are revised substantially, and the IP release lags by about two weeks).
  • λ = 50 is fixed by the task and was not tuned. Results may differ for other penalties, but exploring them was out of scope.
  • The training windows include extreme COVID-era observations. These can dominate the ridge coefficients (e.g. on oil_chg). No robust treatment was applied, as required by the exact model specification.
  • The evaluation period 2021-10 … 2026-09 is a single, relatively calm post-COVID regime. Conclusions may not generalise to other periods.
  • There is a documentation discrepancy in data/README.md about empty 1992-01 cells (see data_issues). It does not affect the results.
Files · main
Menu

Theme