SIGNAL_BENCH DOCS

Trend-based methodology

Macro Surprise Index

A composite that aggregates trend-surprise z-scores across major macro releases. Similar information to Citi-style ESI without consensus data.

What It Is

The Macro Surprise Index reads whether recent economic releases (payrolls, CPI, GDP, retail sales, etc.) came in above or below their own trailing trend, then aggregates those per-release surprises into a single normalized score per category.

Three indices ship today:

Signal IDFocusInputs
composite.surprise.us.macroBroad US macro10 headline releases across growth, labor, inflation
composite.surprise.us.growthGrowth and activityPayrolls, GDP, IP, retail sales, durable goods, housing starts, orders, leading index
composite.surprise.us.inflationInflation onlyCPI, core CPI, PCE, core PCE, PPI, median CPI, sticky CPI, trimmed mean PCE

Methodology

For each input series, the latest observation is converted to a z-score against the trailing distribution. Window length scales with the series' release cadence — 12 months for monthly series, 26 weeks for weekly, 60 days for daily.

z = (latest_value - mean(last_N_observations)) / stddev(last_N_observations)
  • Raw z-scores are clamped to [-3, +3] to limit outlier influence
  • Series whose positive direction is 'falling' (unemployment, claims, debt-service ratio) have their sign flipped so a below-trend print contributes positively to the index
  • The composite is the mean of polarity-adjusted z-scores, normalized to [-1, +1] by dividing by 3

Comparison To Citi ESI

Citi-style economic surprise indices use (actual − Bloomberg consensus) / stddev — they measure 'were forecasters wrong?'. The Signal Bench surprise index uses (actual − trailing mean) / stddev — it measures 'did the release deviate from its own recent trend?'.

These are methodologically different. Empirically they correlate ~0.7–0.8 historically because both metrics surface the same large macro inflections. The trend version misses cases where the release matched consensus exactly but consensus had drifted from the trend — those are real consensus-surprises but show as zero on a trend-surprise basis.

Why trend-based for now

Consensus data feeds (Bloomberg, Trading Economics) restrict redistribution. As a paid API product, we cannot legally redistribute consensus values without a commercial license. We may add a consensus-based variant under a v2 formula once revenue justifies the data cost; for now, the trend version is fully transparent and ships on public data alone.

API Endpoints

Standard tier and above. Two endpoints:

# Current values for all three surprise indices
curl https://www.signalbench.dev/api/v1/surprise/current \
  -H "x-api-key: $SIGNALBENCH_API_KEY"

# History (default 90 points, max 365), optionally filter to one index
curl 'https://www.signalbench.dev/api/v1/surprise/history?signal_id=composite.surprise.us.macro&limit=180' \
  -H "x-api-key: $SIGNALBENCH_API_KEY"