F3-conf-02 — Real-time forecasts of US real GDP growth
Question
How accurately could US quarterly real GDP growth (A191RL1Q225SBEA, % q/q at a seasonally adjusted annual rate) have been forecast 1 and 2 quarters ahead, using only data published at each of 8 forecast origins (first_origin = 2024-01-31 to last_origin = 2025-12-31, n_origins = 8)? And did a simple AR(1) model beat the naive last-value forecast? Forecasts are scored against the first-release value of each target quarter.
Data and exclusions
- Inputs: 8 ALFRED vintage files (307–314 rows each),
current_vintage.csv(318 rows) andfirst_release.csv(13 rows). The counts come fromn_input_rows. All SHA-256 hashes matchdata/README.md(seeout/state/data_audit.md). There are no missing values, duplicate dates or gaps in any file. - At origin d the forecasts use only vintage file d, and the training sample ends at that file's last quarter.
current_vintage.csvis used only for the revision statistic. Every target's first-release vintage date is later than its origin, and the script asserts this. - Exclusions apply to the AR model's regression sample only (
out/exclusions.csv, shown for the last origin). (1) Keep dependent quarters from 1985Q1 onward: 314 → 163. (2) Drop regression rows t = 2020Q2, 2020Q3 and 2020Q4, i.e. any row whose y_t or y_{t−1} is a COVID-19 outlier quarter (about −28 and +35): 163 → 160 =n_analysed. Both rules were fixed before any forecast was computed. The naive forecast uses the full vintage file. Itsn_traininforecasts.csvis the number of vintage rows, although only the last value enters the forecast. - Data issues and how they were handled are listed in
data_issues. They include the irregular eighth origin (2025-12-31 instead of 2025-10-31, because the 2025Q3 advance estimate was delayed by the shutdown).
Method
- Naive: the forecast for both h = 1 and h = 2 is the last value in the origin's vintage.
- Model (
model_name=ar1_post1985_excovid): seemodel_description. At each origin, an AR(1) with intercept is fitted by OLS to that origin's vintage only, using the sample above. The h = 1 forecast is c + φ·y_last and the h = 2 forecast is iterated, c + φ·ŷ(h=1). The estimated coefficients are very stable across origins (intercept ≈ 1.73–1.78, φ ≈ 0.34;ar1_coefficients_by_origin). - Errors: forecast − first-release value. RMSE and MAE are taken over the 8 origins per horizon. The relative improvement is 1 − RMSE_model/RMSE_naive.
- Revision statistic: the mean over the 8 h = 1 target quarters (2024Q1–2025Q4) of |current-vintage value − first release|.
- The method is deterministic, with no randomness (
random_seed= null).out/analysis.pyregeneratesresults.json,forecasts.csvandexclusions.csv.
Results
| horizon | RMSE naive | MAE naive | RMSE AR(1) | MAE AR(1) | 1 − RMSE ratio |
|---|---|---|---|---|---|
| h = 1 | 2.010 (rmse_naive_h1) |
1.687 (mae_naive_h1) |
1.485 (rmse_model_h1) |
1.234 (mae_model_h1) |
0.261 (rel_improvement_rmse_h1) |
| h = 2 | 2.265 (rmse_naive_h2) |
1.812 (mae_naive_h2) |
1.400 (rmse_model_h2) |
1.030 (mae_model_h2) |
0.382 (rel_improvement_rmse_h2) |
- In this real-time evaluation, the AR(1) had a lower RMSE than the naive forecast by 26% at h = 1 and 38% at h = 2. It also had a lower MAE at both horizons.
- The AR(1) had the smaller absolute error at 5 of 8 origins for h = 1 (
n_origins_model_abs_error_smaller_h1) and at all 8 for h = 2 (n_origins_model_abs_error_smaller_h2). - The naive forecast's largest misses come from large swings between consecutive quarters: 2025Q1 was first released at −0.3, 2025Q2 at 3.0 and 2025Q3 at 4.3. The AR(1) shrinks the last value strongly toward its mean (about 2.6), which cuts the damage from these swings.
- On average, the h = 1 target quarters have since been revised by 0.56 pp in absolute value between first release and the 2026-10-30 vintage (
mean_abs_revision_h1_targets; per-quarter values inabs_revision_h1_targets, ranging from 0.1 to 1.2). That is a substantial fraction of the forecast errors. Scoring against current values instead of first releases would give different numbers. This was not done, because the task defines first releases as the actuals.
Uncertainty
- Each horizon has only 8 forecast errors, and the h = 2 errors overlap in time. No standard errors, confidence intervals or Diebold–Mariano test are reported: with 8 dependent errors such a test would have very low power and unreliable size. The RMSE ranking should therefore be read as descriptive for this 2024–2025 window, not as evidence of a general advantage.
- The win counts (5/8 at h = 1, 8/8 at h = 2) indicate the direction is fairly consistent, but one or two large naive misses (e.g. the 2025Q1 contraction) drive much of the RMSE gap.
- Measurement uncertainty in the actuals themselves is about the same size as the revision statistic (0.56 pp,
mean_abs_revision_h1_targets).
Limitations and open issues
- The task is complete (
feasibility= "complete"); all 16 target quarters have first releases. - The window is short (8 origins), and the eighth origin follows a 5-month gap (shutdown delay).
- The model is fixed in advance (AR(1), post-1985 sample, COVID rows excluded). No lag-order selection or alternative models were tried, so no specification search inflates the result. Still, a different reasonable choice could give different numbers. For example, using the full sample with the COVID quarters included would distort φ.
- "First release" means the value at the first month-end vintage containing the quarter (the advance estimate), as defined in
data/first_release.csv. - During the work, a stray
out/directory was briefly created insidedata/by mistake. It was removed, and the data file hashes were re-verified as unchanged (seeout/state/log.md).