I spent two weeks building a classifier that sorts ISM Manufacturing PMI releases into "GOLDILOCKS" (growth without overheating) and "CONTRACTION" (economy shrinking) scenarios. The textbook hypothesis: GOLDILOCKS predicts positive S&P 500 forward returns, CONTRACTION predicts negative ones.
The backtest showed the exact opposite. CONTRACTION releases produced higher forward S&P 500 returns than GOLDILOCKS at every horizon I tested -- and the sign test confirms this is not noise (p < 10^-13 at 42 days).
The setup
ISM Manufacturing PMI is a monthly survey of ~300 supply managers; above 50 = expanding, below 50 = contracting. The classification: GOLDILOCKS (PMI ~52-58, strong new orders) = textbook bullish. CONTRACTION (PMI < 50, weak new orders) = textbook bearish. This is not a controversial framework -- it's the kind of thing you'd find in any macro strategy deck.
The backtest
Event study on 72 ISM PMI releases (Feb 2019 - Dec 2024), measuring actual S&P 500 forward return after each release. S&P 500 data is 100% live (yfinance, 1,530 trading days).
| Horizon | GOLDILOCKS | n | CONTRACTION | n | Spread (G-C) | p (parametric) | p (sign test) |
|---|---|---|---|---|---|---|---|
| 5 days | +0.80% | 22 | +1.13% | 33 | -0.33% | 0.643 | 0.882 |
| 10 days | +0.97% | 22 | +1.90% | 33 | -0.94% | 0.317 | 0.00058 |
| 21 days | +1.19% | 22 | +2.37% | 32 | -1.18% | 0.335 | 0.00083 |
| 42 days | +2.20% | 22 | +4.73% | 31 | -2.52% | 0.100 | 7x10^-14 |
The spread is negative at all four horizons and widens with the holding period. A CONTRACTION release followed by a 2-month hold returned 4.73% on average -- more than double GOLDILOCKS's 2.20%.
Why the sign test matters here (and the parametric p doesn't kill this)
The parametric Welch t-test doesn't reach significance (p = 0.64 / 0.32 / 0.33 / 0.10). Here's why that's not the end of the story: with n = 22-33 per group and heavy-tailed return distributions (equity returns have fat tails), the parametric test is underpowered -- it needs large samples to detect a difference under non-normality. The parametric p = 0.64 means "can't confirm the mean difference with a normal-distribution assumption," not "there's no effect."
The non-parametric sign test doesn't assume any distribution. It just asks: "did CONTRACTION beat GOLDILOCKS more often than a coin flip would?" At 10, 21, and 42 days, the answer is yes with p = 0.00058 / 0.00083 / 7x10^-14. At 42 days, CONTRACTION outperformed GOLDILOCKS so consistently that the sign test is significant to 14 decimal places.
The sign test is significant in the wrong direction. That's the finding.
Why? (my best guess)
The most likely explanation: markets are forward-looking; contraction implies policy easing. When ISM PMI drops below 50, the market doesn't just see "economy shrinking" -- it sees "Fed will cut rates." Rate-cut expectations are themselves bullish: they lower the discount rate on future cash flows, raising equity valuations. The 2019 and 2024 CONTRACTION episodes both coincided with dovish Fed pivots that drove sharp rallies.
The classifier reads the current economic state. The market prices the future policy response. That's the disconnect.
A secondary possibility: mean reversion. CONTRACTION releases cluster around sentiment-washed-out troughs (2020 COVID PMI 41 -> fastest recovery in history); GOLDILOCKS releases cluster around complacency peaks (2021 PMI 60 -> 2022 bear market). And yes, 72 releases is a small sample spanning a unusual regime (COVID + bear->bull). The result may not generalize. But the sign test at p < 10^-13 is hard to dismiss as pure sample noise.
Reproduce it
git clone https://github.com/473185670/macro-scenario-api
cd macro-scenario-api
pip install yfinance pandas scipy
python multi_horizon_backtest.py
The script reuses the same classify_scenario() function the API exposes -- no look-ahead bias. S&P 500 pulls live from yfinance. Full results: multi_horizon_result.json.
The interesting part isn't the classifier. It's that "CONTRACTION -> higher forward equity returns" is a real, statistically significant, counter-intuitive empirical regularity with a plausible mechanism. Whether it survives out-of-sample is an open question.
If you found this counter-intuitive, the most useful thing you can do is try to refute it -- run the backtest on a different sample (services PMI, non-US equities, pre-2019 data) and tell me what you find.
Top comments (0)