Verification checks (P4)
| # | check | outcome |
|---|---|---|
| 1 | Delete outputs, re-run analysis.py; byte-compare results.json and forecasts.csv with previous run | PASS (identical) |
| 2 | forecasts.csv has 240 rows, 40 per (model, horizon) | PASS |
| 3 | target_date = origin_date + h quarters for every row | PASS |
| 4 | snaive forecast equals infl_annualised of quarter t+h−4, and that quarter ≤ origin | PASS |
| 5 | actual equals infl_annualised of target quarter | PASS |
| 6 | Look-ahead test: model forecasts recomputed with the series physically truncated at the origin (9 origins × 3 horizons) equal the full-data-run forecasts | PASS (0 mismatches) |
| 7 | RMSE/MAE recomputed from forecasts.csv match results.json | PASS (max diff 6e-8, due to 6-dp CSV rounding) |
| 8 | rel_improvement = 1 − rmse_model/rmse_snaive; dm_stat = mean/se | PASS |
| 9 | HAC SE cross-checked against statsmodels OLS-on-constant HAC (Bartlett, maxlags=4, no small-sample correction) | PASS (1.920034 vs 1.920034) |
| 10 | SEs and RMSEs positive; first_origin < last_origin; hac_lags_h4=4 ≥ 3 | PASS |
| 11 | n_analysed = 118 = pairs s∈[1996Q1, 2025Q2] for h=1 at last origin (first ybar4 available 1996Q1) | PASS |
| 12 | Magnitudes vs baseline: model RMSEs (2.30–2.44) below snaive (2.85–2.88), same order of magnitude; sd of target 2.39 | PASS (plausible) |
| 13 | Exclusion ledger: 127 − 1 = 126 usable quarters | PASS |
Note: sample autocorrelation of d_t at h=4: lag1 0.22, lag3 −0.28, lag4 −0.41. Because of negative higher-order autocorrelation the HAC SE is sensitive to the lag choice (Bartlett lag 3: 2.16, lag 4: 1.92, lag 6: 1.43); reported in sensitivity_dm_h4. None of these variants gives p < 0.05.