# F3-dev-01 — Rolling-origin forecasts of the US unemployment rate ## Question Over 36 expanding-window forecast origins (2023-07 to 2026-06), does a simple autoregressive model beat the naive (no-change) forecast of the US unemployment rate (FRED UNRATE) at 1- and 3-month horizons? We measure this with RMSE, MAE and 1 − RMSE_model/RMSE_naive. ## Data and exclusions - `data/UNRATE.csv`: 945 data rows, 1948-01 to 2026-09, no gaps in the month sequence. This is the final vintage, not real-time data. - One value is missing: **2025-10-01** (empty field). How it was handled: - Pairs whose target is 2025-10 are kept in `out/forecasts.csv` with an empty `actual` and left out of the error statistics. These are origin 2025-09 at h=1 and origin 2025-07 at h=3. That leaves **35 evaluated pairs per horizon** (out of 36). - At origin 2025-10, the naive forecast is the 2025-09 value. The AR forecast is iterated forward from 2025-09: 2 steps for h=1 and 4 steps for h=3. - For origins from 2025-11 on, the missing month falls inside the training window. It is filled by linear interpolation between 2025-09 and 2025-11, both of which are dated ≤ origin, and used only for AR estimation. - No other exclusions. The 2020 COVID spike stays in the estimation sample. ## Method - **Naive:** the forecast is the latest observation dated ≤ origin, for every horizon. - **Model `AR2_diff`:** an AR(2) with intercept on monthly first differences, estimated by OLS on all data from 1948 up to the origin. Multi-step forecasts are iterated and summed back to levels. I fixed this specification before seeing any out-of-sample results and did no model search, so nothing was tuned on the evaluation period. - The training window is re-estimated at every origin and uses only data ≤ origin. - The last window (origin 2026-06) has 942 level observations (`n_analysed`), which gives 939 regression observations. - Errors are computed as forecast − actual. No randomness is involved (`random_seed` = null). - As a supplementary check I ran a Diebold–Mariano test: squared-error loss, HAC variance with h−1 Bartlett lags, t(n−1) reference. Output is in `out/dm_tests.json`. ## Results | horizon | n | RMSE naive | RMSE AR2_diff | MAE naive | MAE AR2_diff | 1 − RMSE ratio | |---|---|---|---|---|---|---| | 1 | 35 | 0.1171 | 0.1199 | 0.0914 | 0.0957 | −0.0235 | | 3 | 35 | 0.1586 | 0.1597 | 0.1200 | 0.1212 | −0.0074 | (Units: percentage points.) **The AR(2) model does not beat the naive forecast at either horizon.** Its RMSE is about 2.3% higher at h=1 and 0.7% higher at h=3, and its MAE is also slightly higher at both horizons. ## Uncertainty - Diebold–Mariano, model minus naive squared loss: - h=1: DM = 2.54, p ≈ 0.016. The naive forecast is better, and the difference is small but nominally significant. - h=3: DM = 1.70, p ≈ 0.098, which is not significant at 5%. - The sample is only 35 pairs per horizon, and the h=3 errors overlap. The series is rounded to 0.1 pp, so many errors are exact multiples of 0.1 for the naive forecast. - I did no correction for nested-model comparisons (e.g. Clark–West). That correction would make the AR model look relatively better, so the conclusion should read "no evidence the AR model improves on naive", not "the AR model is definitively worse". ## Limitations and open issues - The evaluation uses final-vintage data (with revised seasonal factors), so it does not measure real-time performance. - Only one model specification was evaluated. Other choices (a shorter estimation window, excluding or dummying COVID, different lags) might do differently. They were not explored, to avoid selecting on the test period. - The estimated AR forecasts stay very close to no-change (differences of about 0.01 pp), because the unemployment rate changed little over 2023–2026. The results reflect that calm period only. - The interpolated 2025-10 value enters estimation for later origins. Its effect on the coefficients is negligible given about 940 observations, but it is an imputation.