Google Trends tells us what regular people are quietly doing. But what about the institutions — the pension funds, the hedge funds, the bond desks managing billions? They have their own fear gauge, and it's been publishing daily since 1996. It's free. And we just wired it in as signal source #6.
What It Is
The ICE BofA US High Yield Option-Adjusted Spread (FRED series: BAMLH0A0HYM2) measures the gap between junk bond yields and US Treasury yields. In plain English: how much extra return investors demand to hold risky corporate debt instead of government bonds.
When that gap is narrow, everyone's comfortable. When it widens, institutions are getting nervous. When it blows out — that's panic.
Historical Context
Normal: 3.0 – 4.0% (300-400 bps) — business as usual Elevated: 4.0 – 5.0% (400-500 bps) — pre-recession territory Crisis: 5.0%+ — institutional fear 2008 peak: 21.8% (2,182 bps) — financial system collapsing COVID peak: 10.8% (1,087 bps) — March 2020
Why This Matters for Us
Our other signal sources measure different things: FRED tracks the economy, RSS reads the news, GPR scores geopolitical tension, Google Trends watches retail behavior, ORALE tracks prediction markets. None of them directly measure what the bond market thinks about corporate survival.
Credit spreads fill that gap. When institutions start demanding higher premiums for holding junk bonds, they're telling you something that won't show up in unemployment numbers for months. The bond market has historically been smarter than the stock market about pricing risk — it led the 2008 crash by months and flagged COVID stress before equities reacted.
The Implementation (TDD This Time)
We built this one test-first. 11 test cases before writing a single line of signal logic:
test_extreme_stress_above_500bps ✅ test_elevated_stress_above_400bps ✅ test_rapid_widening_triggers_signal ✅ test_very_rapid_widening ✅ test_complacency_low_and_narrowing ✅ test_normal_range_no_signal ✅ test_source_is_fred_credit ✅ test_metadata_includes_spread_data ✅ test_confidence_capped_at_reasonable_max ✅ test_insufficient_data_returns_empty ✅ test_empty_data_returns_empty ✅
The signal logic uses two dimensions: absolute level (how high is the spread?) and velocity (how fast is it widening?). A spread that's normal but widening fast is a warning. A spread that's high but stable is already priced in. High + widening = maximum signal.
Signal Logic
ABSOLUTE LEVEL: > 5.00% (500bps) → Crisis: LONG TLT, LONG GLD, SHORT SPY > 4.00% (400bps) → Elevated: LONG TLT, rotate to utilities VELOCITY (30-day change): > +1.00pp → Rapid deterioration: LONG TLT, SHORT SPY > +0.50pp → Moderate widening: mild LONG TLT CONTRARIAN: < 3.00% + narrowing → Complacency: light GLD hedge NORMAL RANGE: 3.00-4.00%, change < 0.50pp → No signal (correct behavior)
Signals from both dimensions get deduped — if the absolute level and velocity both trigger the same trade, we keep whichever has higher confidence rather than double-counting.
First Live Read
Spread: 3.42% (342 bps) | 30-day change: +0.32pp | Signals: 0
Normal range, modest widening below threshold. No signals generated. Exactly right — the spread is within historical norms and not moving fast enough to indicate a regime shift. Worth noting: it has widened 32bps in the last month and is above the 90-day average. Not alarming, but we're watching.
Half the value of a signal source is knowing when not to signal. Our
test_normal_range_no_signal test explicitly verifies that normal conditions
produce zero signals. If your system screams all the time, nobody listens when it matters.
Cost: Still $0
FRED API, same key we already have. One additional HTTP request per pipeline run. Daily data back to December 1996 — nearly 30 years of institutional behavior to backtest against.
Retail investors Google "how to sell stocks." Institutions widen credit spreads. Both are fear — measured at different scales, visible at different speeds. Now we watch both.