F3-conf-02 — Real-time forecasts of US real GDP growth
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 available at each of 8 forecast origins (2024-01-31 … 2025-12-31; first_origin, last_origin, n_origins)? And did a simple AR(1) beat the naive no-change forecast, judged against first-release values?
Data and exclusions
- Inputs: 8 ALFRED vintage files (307–314 rows each),
current_vintage.csv(318 rows) andfirst_release.csv(13 rows) (n_input_rows). All SHA-256 hashes matchdata/README.md. There are no missing values or duplicate dates (seeout/state/data_audit.md). - Real-time rule: at each origin, forecasts use only the vintage file dated that day.
current_vintage.csvis used only for the revision statistic. Each target's first release came out after its origin, so every evaluation is truly out of sample (out/state/checks.md). - Exclusions apply only to the AR(1) estimation sample. Using the last origin's vintage (314 rows): keep regression pairs whose lagged value is from 1985Q1 or later (152 rows removed). Then drop the 3 pairs that involve the pandemic outliers 2020Q2/2020Q3. That leaves
n_analysed= 159 pairs (out/exclusions.csv). Earlier origins use the same rules on their own vintages, giving 152–158 pairs (n_traincolumn inout/forecasts.csv). - Data issues (
data_issues): (1) the 8th origin is 2025-12-31 because the shutdown delayed the 2025Q3 advance estimate; (2) the pandemic outliers mentioned above. All 16 targets have first releases, sofeasibility= "complete".
Method
- Naive: at both horizons, the forecast is the last value in the origin's vintage.
- Model (
model_name= ar1_1985_excovid;model_description): an AR(1) with intercept, fitted by OLS separately at each origin on that origin's vintage only. The h = 2 forecast iterates the h = 1 forecast. I fixed the specification (sample start 1985, pandemic exclusion) before looking at any forecast errors. Estimated coefficients are inar1_coefficients_by_origin: intercept about 1.7, slope about 0.34 at every origin. - Targets are the 1st and 2nd quarters after the last quarter in each vintage. Actuals are first releases. The evaluation metrics are RMSE and MAE over the 8 origins for each horizon, plus the relative improvement 1 − RMSE_model/RMSE_naive.
- The revision statistic is the mean, over the 8 h = 1 target quarters (2024Q1–2025Q4), of |current value − first release|.
- No randomness is involved (
random_seed= null).
Results
| naive | AR(1) | rel. improvement (RMSE) | |
|---|---|---|---|
| h=1 RMSE | 2.01 (rmse_naive_h1) |
1.48 (rmse_model_h1) |
0.262 (rel_improvement_rmse_h1) |
| h=1 MAE | 1.69 (mae_naive_h1) |
1.23 (mae_model_h1) |
|
| h=2 RMSE | 2.27 (rmse_naive_h2) |
1.40 (rmse_model_h2) |
0.383 (rel_improvement_rmse_h2) |
| h=2 MAE | 1.81 (mae_naive_h2) |
1.03 (mae_model_h2) |
Units are percentage points of annualised growth.
- The AR(1) has lower RMSE and lower MAE than the naive forecast at both horizons in this sample. Most of its gain comes from not carrying forward unusual quarters: after the 2025Q1 reading of −0.3, the naive forecast was −0.3, while the AR(1) forecast was 1.6–2.3 and the first releases were 3.0 and 4.3. After the 2025Q3 reading of 4.3, the AR(1) forecast 3.2 for 2025Q4, whose first release was 1.4.
- Mean absolute revision from first release to the current value, over the h = 1 targets: 0.56 pp (
mean_abs_revision_h1_targets). That is roughly a third to a half of the forecast RMSEs, so evaluating against current data instead of first releases could change the figures noticeably.
Uncertainty
There are only 8 forecast errors per horizon, so all figures are imprecise. A Diebold–Mariano test on squared-error loss, with the Harvey–Leybourne–Newbold small-sample correction and t(7) reference, does not reject equal accuracy:
- h = 1: statistic 1.49, two-sided p = 0.18 (
dm_hln_stat_h1,dm_hln_pvalue_two_sided_h1); - h = 2: statistic 1.75, two-sided p = 0.12 (
dm_hln_stat_h2,dm_hln_pvalue_two_sided_h2).
The AR(1)'s advantage is therefore suggestive, not statistically established. The single 2025Q1 contraction and the rebound after it drive a large part of the naive forecast's squared error.
Limitations and open issues
- The evaluation window is short (8 origins, 2024–2025). Results may not generalise to other periods.
- I evaluated only one model specification. Choices such as the 1985 start, the pandemic exclusion and the AR order were not tuned, and no alternatives were evaluated.
- The h = 2 targets of consecutive origins overlap with the next origin's h = 1 targets, so the errors are not independent.
- First releases come from a month-end grid (advance estimates as they stood at month end), as described in the data README.
- Process note: early on, an accidental
mkdircreated a scratchout/statedirectory insidedata/vintages. I moved it out at once, re-verified the input file hashes (unchanged), and modified no input file.