SPB Git

spb/wp29_uqo

Public

# F3-conf-02 — Real-time forecasts of US real GDP growth from data vintages

# Question

How accurately could US quarterly real GDP growth (A191RL1Q225SBEA, % change q/q at a seasonally adjusted annual rate) have been forecast 1 and 2 quarters ahead using only the data published at each of 8 forecast origins (first_origin = 2024-01-31 to last_origin = 2025-12-31, n_origins = 8)? And does a simple time-series model beat the naive (last-value) forecast when both are scored against first-release values?

# Data and exclusions

  • Inputs: 8 ALFRED vintage files (307–314 data rows each), current_vintage.csv (318 rows) and first_release.csv (13 rows). Row counts are in n_input_rows. All SHA-256 hashes match data/README.md (see out/state/data_audit.md). No missing values, duplicate dates or quarterly gaps.
  • Information rule: at each origin the forecasts use only the vintage file dated at that origin. current_vintage.csv is used only for the revision statistic. The code asserts that every target's first-release date is on or after the origin date.
  • Exclusions (model only; the naive forecast uses the full vintage): quarters before 1985Q1 are dropped, and 2020Q2 and 2020Q3 (pandemic swings of about −28 and +35 % SAAR) are set to missing. For the last origin: 314 − 151 − 2 = 161 observations (n_analysed). The ledger is in out/exclusions.csv; the same rules applied at every origin are listed in out/exclusions_by_origin.csv.
  • Data issues and how each was handled are listed in data_issues. They include the 2025-12-31 eighth origin (the 2025Q3 advance estimate was delayed by the federal shutdown) and revisions of past quarters between vintages.

# Method

  • Naive: the forecast for h = 1 and h = 2 is the last value in the origin's vintage file.
  • Model (model_name = ar1_post1985; model_description): an AR(1) with intercept, estimated by OLS on the origin's vintage from 1985Q1 to the last published quarter, with 2020Q2 and 2020Q3 set to missing. Any lag pair that involves those quarters is dropped. The h = 2 forecast iterates the AR(1). I fixed this specification before computing any forecast errors (out/state/log.md) and did not tune it on the evaluation set. The method has no randomness (random_seed = null).
  • Targets are the quarters h = 1 and h = 2 after the vintage's last quarter. The actual for each target is its first-release value. Metrics are RMSE and MAE over the 8 origins per horizon, and relative improvement = 1 − RMSE_model / RMSE_naive.
  • Revision statistic: the mean of |current-vintage value − first release| over the 8 h = 1 target quarters (2024Q1–2025Q4).
  • Per-row forecasts are in out/forecasts.csv (32 rows).

# Results

h = 1 h = 2
RMSE naive 2.010 (rmse_naive_h1) 2.265 (rmse_naive_h2)
MAE naive 1.688 (mae_naive_h1) 1.813 (mae_naive_h2)
RMSE AR(1) 1.484 (rmse_model_h1) 1.398 (rmse_model_h2)
MAE AR(1) 1.233 (mae_model_h1) 1.030 (mae_model_h2)
1 − RMSE ratio 0.262 (rel_improvement_rmse_h1) 0.383 (rel_improvement_rmse_h2)

Units are percentage points of annualised growth.

  • In this sample the AR(1) has a lower RMSE than the naive forecast: 26 % lower at h = 1 and 38 % lower at h = 2. The AR(1) pulls forecasts toward its estimated post-1985 unconditional mean, c/(1 − φ) ≈ 1.77/(1 − 0.335) ≈ 2.7 % at the last origin (supp_ar1_coefficients_by_origin), and this helps most after unusual quarters, such as the −0.3 first release for 2025Q1 and the 4.3 for 2025Q3.
  • Mean forecast errors (actual − forecast) are small and negative for both models: naive −0.24 / −0.19 and AR(1) −0.34 / −0.33 at h = 1 / h = 2 (supp_mean_error_*).
  • The mean absolute revision from first release to the 2026-10-30 vintage for the h = 1 targets is 0.5625 pp (mean_abs_revision_h1_targets). That is roughly a third of the AR(1) h = 1 RMSE, so the first-release target itself carries non-trivial measurement noise.

# Uncertainty

  • Each metric rests on only 8 forecast errors. The h = 2 errors also overlap in time with the h = 1 errors of the next origin.
  • A Diebold–Mariano test with the Harvey–Leybourne–Newbold small-sample correction, using squared-error loss (naive minus AR(1)), gives statistics of 1.49 at h = 1 (supp_dm_hln_stat_h1, two-sided p = 0.18, supp_dm_hln_pvalue_two_sided_h1) and 1.85 at h = 2 (supp_dm_hln_stat_h2, p = 0.11, supp_dm_hln_pvalue_two_sided_h2).
  • The AR(1) advantage is therefore not statistically significant at conventional levels. The asymptotic justification of the test is also weak with n = 8.
  • A single quarter can move the RMSEs substantially. 2025Q1 (−0.3) alone contributes a naive h = 1 squared error of 6.76 out of a total of 32.33.

# Limitations and open issues

  • The evaluation window is short (2024Q1–2026Q1 targets). It includes an unusual negative first release for 2025Q1 (−0.3), so the results do not generalise to other periods.
  • I specified only one model. The 1985 sample start and the pandemic treatment are judgement calls made before evaluation; I did not run other specifications, so I cannot say how sensitive the results are to these choices.
  • Actuals are first releases, as the task requires. Against current-vintage values the ranking could differ; I did not evaluate this, because current values are not real-time information.
  • The origins are not equally spaced (the 2025-12-31 origin replaces 2025-10-31). The first-release grid in first_release.csv uses month-end vintages, so a "first release" is the advance estimate as it stood at that month-end.
  • feasibility = "complete": every required quantity was computed.
Files · 46a1f53512bec3cd5d9c16e8fc9d9da4129c09cc
Menu

Theme