Skip to content
FinObservatory

Expectations / Methodology

Survey of Professional Forecasters expectations layer: methodology

This route is a read-only expectations layer over data/parquet/spf_point.parquet and data/parquet/spf_micro.parquet, the normalized consensus and anonymized respondent exports built by scripts/build_spf.py. It publishes what the Federal Reserve Bank of Philadelphia's Survey of Professional Forecasters (SPF) respondents said. It does not fit a model, smooth a series, or infer any missing expectation off-platform.

1. Source and local coverage

  • Primary source: Federal Reserve Bank of Philadelphia, Survey of Professional Forecasters (SPF). The local spf-documentation.pdf is the authoritative codebook for the horizon and variable definitions below.
  • Cadence: quarterly. Per the Philadelphia Fed SPF FAQ, the questionnaire is sent on the day the BEA releases its first estimate of GDP, the deadline is about 10 days later, and publication is about three days after the deadline.
  • Local consensus parquet: spf_point.parquet, 86,074 rows, 54 variables, with surveys from 1968Q4 through 2026Q2.
  • Local respondent parquet: spf_micro.parquet, 1,959,101 observations, 60 variables, and 463 anonymized forecaster IDs.
  • Local RECESS coverage: 41,541 non-null point responses from 1968Q4 through 2026Q2. Horizons 1 through 4 each cover 231 survey rounds and horizon 5 covers 227. Respondent counts vary by survey and horizon; the page reports n for every latest point and every historical hover value.
  • Displayed vintage: the route and this methodology page query the latest survey round from the parquet at render time. They do not depend on a live release-calendar date.

2. What is selected

The shipped tables and revision view surface five headline SPF variables from the broader file:

CodeOfficial variable nameOfficial definition / unitWhy it is on the page
RGDPReal Gross National Product/Gross Domestic ProductBillions of real dollars. Seasonally adjusted. Annual rate. Real GNP prior to 1992; real GDP 1992-present.Real activity level
CPICPI Inflation RateAnnualized percentage points. Seasonally adjusted. Based on quarterly average index level.Headline inflation
COREPCECore PCE Inflation RateAnnualized percentage points. Seasonally adjusted. Based on quarterly average index level.Core inflation measure the Fed watches closely
UNEMPCivilian Unemployment RatePercentage points. Seasonally adjusted. Quarterly average.Labor-market slack
TBOND10-Year Treasury Bond RatePercentage points. Not seasonally adjusted. Quarterly average.Long risk-free rate

The new median path and dispersion panels select RGDP, CPI, UNEMP, and TBOND from that same five-variable list. COREPCE remains in the shipped tables and revisions, but is not added to the new panels. The full SPF parquet carries many more variables (NGDP, EMP, INDPROD, HOUSING, BOND, BAABOND, long-horizon inflation series, implied real rates, and others). They stay in the file but are not surfaced on this page.

3. Mean versus median

The SPF parquet carries both stat='mean' and stat='median'. The route exposes that choice explicitly in the URL and on the page header:

  • ?stat=median = the median consensus
  • ?stat=mean = the mean consensus

The shipped latest-path table, revision table, hero values, and unemployment vintage chart honor that selection. The three added panels are deliberately median-only, even when the shipped views display means:

  • latest quarterly median paths
  • respondent interquartile-range histories
  • horizon-6 median forecast errors

That boundary is stated on the page and is never inferred from the URL switch.

The recession-probability exhibits are separate from that switch. They recompute the mean, median, and quartiles from non-null individual RECESS responses in spf_micro.parquet; they never read the published mean or median from spf_point.parquet and never average an already-aggregated statistic.

4. Horizon grammar

The SPF point sheets use the Philadelphia Fed's horizon grammar, preserved verbatim in the parquet:

  • 1: prior quarter's preliminary value
  • 2: current-quarter nowcast
  • 3 to 6: one to four quarters ahead
  • A to D: current calendar year through three calendar years ahead
  • LR: long-run value (not used on this route)

The page's quarterly path begins at 2, not 1, because horizon 1 is not a forward quarter.

RECESS horizon grammar

RECESS has its own official horizon definition and must not inherit the level-sheet mapping above. It measures the respondent-assigned probability, in percentage points, that real output declines from one quarter to the next:

CodeTarget event in a survey conducted in quarter tTarget quarter
RECESS1Real output in t is below its level in t-1survey quarter
RECESS2Real output in t+1 is below its level in tone quarter after survey; the Anxious Index
RECESS3Real output in t+2 is below its level in t+1two quarters after survey
RECESS4Real output in t+3 is below its level in t+2three quarters after survey
RECESS5Real output in t+4 is below its level in t+3four quarters after survey

The mapping is calendar-quarter aware. For example, in a 2025Q4 survey the five targets are 2025Q4, 2026Q1, 2026Q2, 2026Q3, and 2026Q4. The executable quality fixture also checks a 1999Q4 to 2000 rollover so an off-by-one or year-boundary error fails the gate.

The output concept changes with the source survey: real GNP before 1992Q1, fixed-weighted real GDP from 1992 through 1995, and chain-weighted real GDP thereafter. These probabilities are not NBER recession classifications.

5. What each exhibit computes

Recession-probability path and history

The latest path groups individual, non-null variable='RECESS', kind='point' responses by survey round and horizon. For each available group it returns only these bounded aggregates:

  • non-null respondent count
  • arithmetic mean probability
  • median probability
  • continuous 25th percentile
  • continuous 75th percentile

Missing responses are absent; they are never recoded to zero. Missing horizon groups remain missing rather than being filled or interpolated. The arithmetic mean is the average probability assigned by respondents, not the percentage of respondents predicting that a decline will occur. No respondent or survey weights are applied because the Philadelphia Fed documentation does not specify them for this calculation.

The historical panel fixes the definition at RECESS2 in every survey. It therefore traces the same next-quarter event horizon, known as the Anxious Index, rather than mixing current-quarter and varying-ahead forecasts. The line shows the mean respondent-assigned probability, the dashed line shows the median response, and the band spans the 25th to 75th percentiles. Each hover value reports the non-null n for that survey.

Both exhibits report professional-forecaster beliefs. They are not FinObservatory model estimates, probabilities inferred from realized data, the fraction of respondents making a binary recession call, or realized recession indicators.

Latest path table

For the latest survey round in the local parquet, the table shows:

  • quarterly horizons 2 to 6
  • annual horizons A, B, and C

These are direct SPF point forecasts from spf_point.parquet. No transformation is applied other than row/column layout.

Revision table

For the same five variables, the revision table compares the latest local survey against the immediately previous local survey:

  • current-quarter nowcast revision = latest horizon='2' minus prior horizon='2'
  • four-quarters-ahead revision = latest horizon='6' minus prior horizon='6'
  • next-calendar-year revision = latest horizon='B' minus prior horizon='B'

These are differences between two published SPF consensus points, not model-implied deltas.

Median path small multiples

The latest-survey panel uses horizons 2 through 6, from the current-quarter nowcast through four quarters ahead:

  • CPI, UNEMP, and TBOND use the published stat='median' values from spf_point.parquet.
  • RGDP is stored as a real-GDP level, so growth is computed respondent by respondent from paired adjacent microdata levels: 100 * ((current / previous)^4 - 1). The median is taken only after this transformation. Growth is never computed from aggregate median levels.

Target quarters are mapped from the survey quarter with horizon 2 at delta zero and horizon 6 at delta four.

One-year-ahead dispersion

The dispersion panel uses the full horizon-6 history in spf_micro.parquet. For each survey-variable pair it reports:

  • the continuous 25th percentile
  • the continuous median
  • the continuous 75th percentile
  • interquartile range = 75th percentile minus 25th percentile
  • the non-null respondent count

For RGDP, each respondent's paired horizon-5 and horizon-6 levels are transformed to annualized quarterly growth before any percentile is computed. The latest response count is shown separately for each variable because panel participation differs across variables.

One-year-ahead forecast errors

The error panel matches each published horizon-6 SPF median to the complete realized quarter four quarters after its survey round. The sign convention is always:

error = forecast - realized

A positive value is an overforecast; a negative value is an underforecast. Realized mappings are limited to the three separately sourced comparators already on disk:

SPF variableRealized seriesTransformation
CPIFRED CPIAUCSLAverage the three monthly index levels in each complete quarter, then compute annualized quarter-over-quarter growth. Both the target and previous quarters must be complete.
UNEMPFRED UNRATEAverage the three monthly observations in each complete quarter.
TBONDFRED DGS10Average daily observations within completed calendar quarters.

No error comparator is added for RGDP or COREPCE. The latest matched target in the current data is 2026Q2, using the 2025Q2 horizon-6 forecasts.

Vintage chart

The vintage chart uses UNEMP because it has the cleanest realized comparator already on disk:

  • each thin line is one SPF unemployment forecast path from survey quarter through four quarters ahead (2 to 6)
  • surveys shown: 2019Q1 through 2025Q2
  • realized line: quarterly average of monthly UNRATE from fred_macro.parquet

The vintage chart remains distinct from the median-only forecast-error panel. It honors the page's mean-versus-median switch and shows whole unemployment paths against the direct quarterly-average realized comparator.

6. Out of scope by design

  • probability-bin SPF series
  • any FinObservatory nowcast or forecast
  • any realized-series mapping beyond CPIAUCSL, UNRATE, and DGS10
  • any subscriber-only gating