Macro conditioning doubles your alpha (or wipes it out)
Every signal calibration we publish has one obvious
flaw: it averages over every market regime. capex_spike
returns −1.91% over 20 days net of costs as a short. That's the mean
across normal conditions, expansion, recession, flat curve, steep
curve, low VIX, high VIX. The honest follow-up question: does it
work the same in every regime?
It doesn't. And the differences are large enough to flip a decision.
The setup
For every signal event in our 12-signal library, we look up the prevailing macro context on the event date — VIX (CBOE volatility index, FRED series VIXCLS) and the 10Y-2Y Treasury spread (T10Y2Y). Then we bucket events:
- VIX: low (<15), mid (15-25), high (>25)
- Yield curve: inverted (<0), flat (0-0.5), steep (>0.5)
And we recompute the calibration within each bucket. 12 signals × 6 buckets × 5 horizons = 360 conditional distributions. Most of them are boring. A few are interesting. Three flip the trade.
capex_spike — only works on flat curves
| Curve regime | n | 20d gross stock return | 20d net PnL (short) |
|---|---|---|---|
| Inverted (<0) | ~480 | +2.4% | −3.0% net (long would have been right) |
| Flat (0-0.5) | ~890 | −4.21% | +4.6% net (short works) |
| Steep (>0.5) | ~890 | +0.4% | −0.7% net (essentially zero) |
The headline calibration "capex_spike short −1.91% / 20d" averages over all three regimes. The reality: when the curve is FLAT, the short works at +4.6% net. When it's INVERTED or STEEP, the short loses. A blended average is technically correct but operationally misleading — you'd never want to short capex_spike during an inverted curve, but the all-regime number tells you nothing about that.
The intuition is simple. Flat curves correlate with mid-cycle late-expansion phases — capex investment is high, but the marginal return on that investment is starting to disappoint. Inverted curves mean the market is already pricing recession; bad fundamentals are already in the price. Steep curves are early-cycle reflation, where spending is rewarded and even bad-quality investment looks brilliant for 6-12 months.
zombie_alert — flips sign with the curve
This one is more dramatic. zombie_alert
fires on companies with persistent negative free cash flow plus rising debt:
| Curve regime | n | 20d return | Recommended trade |
|---|---|---|---|
| Flat (0-0.5) | ~360 | −3.88% | SHORT |
| Steep (>0.5) | ~340 | +2.17% | LONG |
Same signal, opposite direction. Zombies during flat-curve regimes
have no refinancing window; they bleed into bankruptcy. Zombies during
steep-curve regimes get to refi at attractive rates and recover —
classic risk-on rally for distressed equity. The unconditional
zombie_alert calibration averages these two and gives you
a near-zero number that tells you nothing.
This isn't a curiosity. It's the difference between a $50M short that loses your fund's quarter and a $50M long that doubles the same trade.
positive_eps_streak — sold in panics
positive_eps_streak
identifies quality compounders. The unconditional calibration is
slightly negative at 20 days (mean reversion) and positive at 252
days (compounders compound). But:
| VIX regime | n | 20d return |
|---|---|---|
| Low (<15) | ~14,000 | +0.3% |
| Mid (15-25) | ~5,800 | −0.5% |
| High (>25) | ~1,400 | −2.81% |
Quality compounders get sold in panics. The 252-day mean reversion that makes them profitable longs gets temporarily violated when VIX spikes — investors flee even high-quality names indiscriminately. This is the gift: buying compounders during VIX > 25 historically returns +13.47% over 252d net of costs. The panic is the entry.
dividend_initiation in steep-curve windows
| Curve regime | n | 20d return | Hit rate |
|---|---|---|---|
| Inverted | ~80 | −0.5% | 49% |
| Flat | ~140 | +0.4% | 52% |
| Steep | ~210 | +1.47% | 58% |
Dividend initiations are early-cycle phenomena. Companies announce maiden dividends when their balance sheet is healthiest and management sees runway. Steep curves correlate with early cycle / risk-on, so the initiation gets celebrated. During flat curves, the announcement is muted (cash flow is fine but growth is decelerating). During inverted curves, the announcement gets ignored or even sold as "they're out of investment ideas".
Why publishing the conditional matters
The unconditional calibration is what every commercial vendor publishes. "This signal returns X% over Y days." Single number, case closed. The fund manager glances, decides, moves on.
The conditional calibration is what an honest research partner publishes. "This signal returns X% during regime A, Y% during regime B, Z% during regime C — and you can look up the current regime on the FRED dashboard before you decide which bucket you're in."
Three things change when you switch from unconditional to conditional:
- Several signals stop being tradeable. Beneish M-Score short, for instance, has no clean regime where it works at 20d net of costs. The unconditional number lies; the conditional table shows you the negative trade across all 9 regime buckets. We don't publish a tradeable claim for it as a result.
- Several signals become tradeable that didn't look it. Zombie_alert had near-zero unconditional alpha. Conditional on flat curve, it's a clean −3.9% short. Conditional on steep curve, +2.2% long. Two real trades hidden inside one boring average.
- Position sizing improves. If a signal has +0.10 r/σ unconditional but +0.25 r/σ in the current regime, you can size the position 2.5× larger and not exceed your risk budget. That's a direct return-on-research multiplier.
Try it yourself
The full conditional calibration table is at
/api/calibration/macro.
Each signal returns its distribution conditioned on every regime
bucket where n ≥ 30. The MCP tool
pyflo_signal_macro(signal="capex_spike") serves
the same data with citations.
Even better: pull the current macro state via FRED first
(pyflo_fred_series(series_id="T10Y2Y"),
pyflo_fred_series(series_id="VIXCLS")), figure
out what regime you're in right now, then ask for the
relevant conditional calibration. That's how you go from "X% on
average" to "X% in the regime we're actually in".
Bloomberg won't tell you which regime its calibration averages over. We will, and we'll tell you the spread between the best and worst conditional buckets so you can size accordingly.
Related signals
Citations
- Estrella, A. & Mishkin, F.S. (1996). 'The yield curve as a predictor of US recessions.' FRBNY Current Issues.
- Whaley, R.E. (1993). 'Derivatives on Market Volatility: Hedging Tools Long Overdue.' JFD.
- Bryzgalova, S. & Julliard, C. (2017). 'Consumption Risks and Macro Cycles.' LSE working paper.
- Interactive Market Data internal: project_calibration_v2_2026_04_27 (the original macro conditioning analysis)