SPB Git

spb/wp29_uqo

Public

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

# 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 in real time? The test uses 8 origins, from first_origin = 2024-01-31 to last_origin = 2025-12-31 (n_origins = 8). Each origin uses only the vintage published on its date, and forecasts are scored against first releases. Does a simple AR model beat the naive (last value) forecast?

# Data and exclusions

  • Inputs are 8 ALFRED vintage files (307–314 rows each), current_vintage.csv (318 rows) and first_release.csv (13 rows). Per-file counts are in n_input_rows. All SHA-256 hashes match data/README.md (see out/state/data_audit.md). There are no missing values, duplicates or gaps.

  • At each origin, the only data used for estimation or as forecast input is that origin's vintage file. current_vintage.csv is used only for the revision statistic. The script asserts that every target's first-release date falls after its origin.

  • The AR estimation sample at each origin is built as follows (out/exclusions.csv, shown for the last origin, 314 quarters):

    1. Drop the first quarter, which has no lag (−1).
    2. Keep only dependent quarters from 1985Q1 on (−150).
    3. Drop the dependent quarters 2020Q2–2020Q4 (−3), so that the COVID outliers (about −28 % and +35 %) appear neither as regressand nor as regressor.

    This leaves n_analysed = 160. The naive forecast uses the full vintage.

  • Data issues and how each was handled are listed in data_issues. They include the COVID outliers and the shutdown-delayed releases: the 8th origin is 2025-12-31, and the 2025Q4 first release is dated 2026-02-28.

# Method

  • Naive: the forecast for h = 1 and h = 2 is the last value in the origin's vintage.
  • Model (model_name = ar1_ols): an AR(1) with intercept, estimated by OLS on the origin's vintage over the sample described above and re-estimated at every origin (model_description). The h = 2 forecast is obtained by iterating the AR(1). I fixed the specification (lag order, 1985 start, COVID exclusion) before looking at any forecast errors and did not tune it afterwards.
  • Scoring: RMSE and MAE of forecast minus first release over the 8 origins, computed separately for each horizon.
  • The method has no randomness (random_seed = null). All forecasts are in out/forecasts.csv.

# Results

naive AR(1) 1 − RMSE ratio
h = 1 RMSE 2.01 (rmse_naive_h1) 1.49 (rmse_model_h1) 0.26 (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.38 (rel_improvement_rmse_h2)
h = 2 MAE 1.81 (mae_naive_h2) 1.03 (mae_model_h2)

All values are in percentage points of annualised growth.

  • On this sample the AR(1) had lower RMSE and MAE than the naive forecast at both horizons. The RMSE was about 26 % lower at h = 1 and 38 % lower at h = 2.
  • The AR(1) had the smaller absolute error at 5 of 8 origins for h = 1 (n_model_smaller_abs_error_h1) and at all 8 for h = 2 (n_model_smaller_abs_error_h2).
  • The gain comes mostly from shrinking toward the post-1985 implied mean of 2.67 % at the last origin (last_origin_ar1_implied_mean). At the last origin the intercept is 1.78 (last_origin_ar1_intercept) and φ is 0.34 (last_origin_ar1_phi). This shrinkage protects against volatile quarters like 2025Q1 (−0.3) and 2025Q3 (4.3), where the naive forecast carries an unusual value forward.
  • The mean absolute revision between first release and the current (2026-10-30) value of the 8 h = 1 target quarters is 0.56 pp (mean_abs_revision_h1_targets). That is roughly a third of the size of the forecast errors.

# Uncertainty

  • There are only 8 forecasts per horizon, and the h = 2 errors overlap across origins.
  • A Diebold–Mariano test on squared-error loss differentials (naive minus model), with Harvey–Leybourne–Newbold correction and a t(7) reference, gives:
    • h = 1: statistic 1.59 (dm_stat_h1), two-sided p = 0.18 (dm_hln_pvalue_two_sided_h1)
    • h = 2: statistic 2.27 (dm_stat_h2), p = 0.11 (dm_hln_pvalue_two_sided_h2)
  • So the AR(1)'s advantage is not statistically significant at the 5 % level. The point estimates favour the model, but a sample this small cannot rule out equal accuracy. The DM asymptotics are themselves unreliable with n = 8.

# Limitations and open issues

  • The evaluation window (2024–2025) is short and covers a particular period, including the tariff-related swings in 2025Q1–Q2. The results may not generalise.
  • Actuals are first releases. Scoring against the current vintage would give different numbers, because revisions average 0.56 pp (mean_abs_revision_h1_targets).
  • The 1985 start and the COVID exclusion are researcher choices, documented in advance. I did not test other specifications, to avoid selecting one on the test sample.
  • The 8th origin's horizons are irregular because of the shutdown-delayed releases.
  • The task was completed as specified (feasibility = complete).
Files · main
Menu

Theme