Real-time forecasts of US real GDP growth from data vintages (F3-conf-02)
Question
How accurately could US quarterly real GDP growth (A191RL1Q225SBEA, % q/q SAAR) have been forecast 1 and 2 quarters ahead using only the data published at each of 8 forecast origins (2024-01-31 … 2025-12-31; first_origin, last_origin, n_origins), scored against first-release values, and does a simple time-series model beat the naive (last-value) forecast?
Data and exclusions
- Inputs: 8 ALFRED vintage files (307–314 rows each),
current_vintage.csv(318 rows),first_release.csv(13 rows); row counts inn_input_rows. All SHA-256 hashes matchdata/README.md; no missing values, duplicate dates or gaps (out/state/data_audit.md). - Real-time rule: at each origin only that origin's vintage file is used (training sample = whole file, values as in that file).
current_vintage.csvis used only for the revision statistic;first_release.csvonly for actuals. Every target's first release is dated after its origin (asserted in code). - Exclusions apply only to the model's estimation sample (
out/exclusions.csv, shown for the last origin): 314 vintage observations → keep 1985Q1 onward (−151) → drop first window quarter for the lag (−1) → drop regression rows whose dependent quarter is 2020Q2–2020Q4 (−3; COVID outliers of about −28/+35 pp) → 159 regression observations (n_analysed). The naive forecast uses the full vintage file. - Data issues recorded in
data_issues: irregular 8th origin (2025-12-31, shutdown-delayed advance estimate), COVID outliers, delayed first release of 2025Q4.
Method
- Naive: forecast for h = 1 and h = 2 = last value in the origin's vintage file.
- Model (
model_name=ar1_post1985_exCovid;model_description): AR(1) with intercept, OLS, re-estimated at each origin on that vintage from 1985Q1 to its last quarter, excluding the COVID regression rows; h = 2 by iterating the AR(1). The specification was fixed before any forecast errors were computed (no tuning on the evaluation sample). - Errors = first-release value − forecast; RMSE and MAE over the 8 origins per horizon;
rel_improvement_rmse_h*= 1 − RMSE_model/RMSE_naive. - Revision statistic: mean over the 8 h = 1 target quarters (2024Q1–2025Q4) of |current-vintage value − first release|.
- Supplementary: Diebold–Mariano test on squared-error differentials with Harvey–Leybourne–Newbold correction (long-run variance with lags up to h−1), t(7) reference. No randomness (
random_seed= null).
Results
| naive | AR(1) | |
|---|---|---|
| RMSE h=1 (pp) | 2.010 (rmse_naive_h1) |
1.484 (rmse_model_h1) |
| MAE h=1 (pp) | 1.687 (mae_naive_h1) |
1.233 (mae_model_h1) |
| RMSE h=2 (pp) | 2.265 (rmse_naive_h2) |
1.398 (rmse_model_h2) |
| MAE h=2 (pp) | 1.812 (mae_naive_h2) |
1.030 (mae_model_h2) |
- Relative RMSE improvement of the AR(1) over naive: 0.262 at h = 1 (
rel_improvement_rmse_h1) and 0.383 at h = 2 (rel_improvement_rmse_h2). - The AR(1) had a smaller absolute error than naive at 5 of 8 origins for h = 1 (
supp_n_origins_model_abs_err_lt_naive_h1) and 8 of 8 for h = 2 (supp_n_origins_model_abs_err_lt_naive_h2). - The estimated AR(1) was very stable across vintages: φ between 0.335 and 0.343 (
supp_ar1_phi_range), implied mean 2.62–2.66 % (supp_ar1_implied_mean_range); the model's gain comes from shrinking the last observation toward the mean, which helped most after the volatile 2025Q1 (−0.3) and 2025Q3 (4.3) prints. - Mean absolute revision between first release and the current (2026-10-30) value of the h = 1 targets: 0.5625 pp (
mean_abs_revision_h1_targets; individual revisions insupp_revisions_h1_targets, range −1.2 to +1.0 pp). This is about a third of the AR(1) h = 1 MAE, so first-release "truth" is itself noisy.
Uncertainty
With only 8 origins the comparison is very imprecise. The DM-HLN test does not reject equal squared-error accuracy at conventional levels: h = 1 statistic −1.49, p = 0.18 (supp_dm_hln_stat_h1, supp_dm_hln_pvalue_h1); h = 2 statistic −1.75, p = 0.12 (supp_dm_hln_stat_h2, supp_dm_hln_pvalue_h2). The point estimates favour the AR(1), but the evidence that it beats the naive forecast in this window is not statistically significant. h = 2 errors overlap across consecutive origins (serial correlation), which the lag-1 long-run variance only partly addresses with n = 8.
Limitations and open issues
- 8 origins (2024–2025) is a tiny, specific evaluation period, including the negative 2025Q1 print (−0.3 first release); results may not generalise.
- The 1985Q1 start and the COVID-row exclusion are judgement calls (pre-specified, not tuned); other reasonable choices (full sample, AR(p)) were not evaluated, by design of a single-model task.
- Origins are irregularly spaced (2025-12-31 instead of 2025-10-31 due to the federal shutdown); horizons are defined relative to the last published quarter, so targets remain the next two quarters.
- Actuals are advance estimates as at month-end; scoring against later vintages would give different numbers (revisions average 0.56 pp in absolute value).
n_trainfor naive rows is the full vintage length; for model rows it is the AR(1) regression sample size.n_analysed= 159 is the model regression sample at the last origin.