
Market-Stress Exposure Scaling
Test the idea. Follow the evidence.
Can daily market-stress signals improve a long-only momentum strategy by scaling its exposure? I compared LightGBM and logistic-regression overlays with simple rules, and a simple drawdown rule beat the models.
- Liquid-stock universe
- Momentum baseline — inverse-volatility weights
- Stress features — SPY trend, volatility, drawdown
- SPY drawdown rule — cash at 10% below the high
- Walk-forward model — LightGBM · logistic regression
- Exposure — applied the next day
- Evaluation — Sharpe · drawdown · turnover
- Baseline, no overlay
- LightGBM
- Logistic regression
- SPY drawdown rule (10%)
The story
The result
A simple rule won. Moving to cash when SPY is 10% or more below its trailing high raised the Sharpe ratio from 0.93 to 1.20 and cut max drawdown from −21.6% to −9.1% over the April 2020 to April 2024 window, where the 10% threshold was also picked. The learned models didn't beat it.
What I learned
My starting assumption was that a learned model would beat a simple rule. It didn't, and that turned out to be the most useful result: more model complexity doesn't guarantee a better strategy. The evidence decides.
Data and baseline
The data is daily yfinance bars from 2015 through 2025 for 609 downloaded tickers. The baseline holds the top decile of liquid S&P 500 names by momentum, weighted by inverse volatility, and the overlay only decides how much of it to hold.
Timing and splits
Every signal is applied the next trading day, so it never earns a return it already saw. Train, validation and test splits are chronological, with a five-day embargo because the labels overlap. A bad window is a five-day return in the bottom 20% of recent outcomes.
Why the rule won
LightGBM raised Sharpe slightly but left the drawdown almost unchanged; logistic regression cut drawdown but gave up too much return. Their AUCs of 0.59 and 0.60 were above chance but too noisy for a stable daily exposure policy. The drawdown rule waits until stress is visible, which discards some information but also removes estimation error and turnover.
Limitations
The main limits are data quality and execution realism: yfinance has coverage gaps, and costs are simplified. The 10% threshold was the best in the tested grid, not a universal cutoff, and it was chosen on the same window the chart shows, so that curve is not an out-of-sample result.
The code is private. I'm happy to walk through it.
