0x7a3f...e29c
Strategies / Marketplace My library Following Leaderboard Discussions Learn
Discussions / #strategy-design / Thread

When does a strategy know it's broken?

strategy-design risk drawdown · 8 min read · 1,842 views

Every quant has a version of this conversation with themselves around 3am, after a bad week. "Is the alpha gone, or am I just unlucky?" If you can't answer it cleanly, you'll either kill a strategy that was about to mean-revert, or feed money to one that's already dead.

I've been using a three-bucket framework for the last 18 months. None of these are original — they're all in the literature somewhere — but having them written down in one place has saved me from at least two expensive decisions.

The strategy doesn't know it's broken. You do — but only if you decided what "broken" looks like before you ever ran it live.

1. The drawdown bucket. Boring, but non-negotiable. If your 30-day rolling drawdown crosses 2× the worst window in your backtest, the regime has changed faster than your model. Don't argue with the math.

2. The win-rate decay bucket. Win rate is noisy, but its trend isn't. I track a scipy.stats.kendalltau on the last 50 trades' realized PnL ranked by entry confidence. If τ goes negative and stays there for 20+ trades, your signal stopped predicting.

# sliding-window rank correlation between confidence and realized PnL from scipy.stats import kendalltau def confidence_decay(trades, window=50): recent = trades[-window:] tau, p = kendalltau([t.confidence for t in recent], [t.pnl for t in recent]) return tau, p # pause when tau < -0.1 and p < 0.05

3. The microstructure bucket. The one nobody talks about. Your fills get worse before your PnL does. Track median realized slippage against your model's expected slippage. When realized exceeds expected by >1.5× for a week, somebody on the other side has figured you out, or the venue's flow has changed.

Backtest result · receipt attached by @kira.eth
Strategy
Mean Rev. v2 — three-bucket monitor
Window
2023-01 → 2025-04
Trades flagged
3 / 6,402
Loss avoided
~$22,400
paused

The three got triggered together exactly once — September 2024, ETH was ranging dead, fills were getting fronted on Base. Paused for nine days, came back, the strategy was fine. That's the one that pays for the framework.

What's your version of this? Especially curious to hear from anyone running mean-reverting strategies on perp venues — the funding leg changes the answer in ways I haven't fully figured out yet.

28 comments · 6 saves
28 comments
Top New Old From author
Paolo Lenzi @paolo.lens · 1h 42m ago rank #2

The microstructure bucket is the one I always sleep on, then regret. For perp venues I add a fourth: funding_rate / realized_basis ratio. If it inverts and stays inverted, the basis is gone and you're paying to be in the trade.

inversion

Real example: my ETH-perp basis trade ran clean for 11 months, then went negative on May 7th. I waited four days because the daily PnL was still positive. Cost me ~$3k before I shut it.

Kira Tanaka @kira.eth · 1h 18m ago OP

The four-day wait is the universal pattern. The strategy was profitable, so you trusted it, and the bucket alarm hadn't sounded yet because daily PnL is a lagging indicator.

I'd add basis / |basis_yesterday| to your fourth bucket — it spikes before the inversion.

Paolo Lenzi @paolo.lens · 58m ago

Adding this to the monitor tonight. Will report back next month.

Ophelia Vance @ophelia.degen · 1h 22m ago

Counter-take: all three of your buckets are reactive. They tell you the alpha is gone after it's already cost you. What I do — and what nobody talks about — is run an always-on shadow strategy with randomized signs on my signal. If it makes money, my real signal is noise.

Costs me maybe 0.5% of capital, saves my entire book once a year.

Samir Bhatt @samir.farcaster · 54m ago

One thing that's helped me: don't pause, throttle. When bucket 1 fires I cut size in half. When bucket 2 fires, half again. When 3 fires, I'm at 12.5% notional and I either come back or quietly retire it after 30 days. Avoids the "did I kill it too early?" anxiety.

No-no @nono.lens · 42m ago

This is the only correct answer. Death by a thousand cuts beats sudden hard pause. Markets aren't binary, strategies shouldn't be either.

Théo Garnier @theo.solana · 38m ago

For Solana-side strats I'd add: priority_fee_paid / fee_at_block_top. When you're consistently below the top of the block but still getting filled, something is off with the routing or somebody's giving you adverse selection.

Ben Karras @ben_quant · 24m ago rank #3

The honest answer most people don't want to hear: a strategy "knows" it's broken when you stop wanting to look at it. The framework is downstream of that emotional signal — it just gives you permission to act on it.

If you're avoiding the dashboard, the dashboard already told you.
Henrik Borg @henrik.btc · 18m ago trending

I implemented something close to your three-bucket setup six months ago and the false-positive rate has been ~14% — meaning ~1 in 7 pauses was unnecessary. That sounded bad until I compared it to the false-negative rate when I was eyeballing it, which was probably 40%+.

Bad detectors that fire too often beat good detectors that never fire.

Marisol Iniesta @mari.market · 12m ago

Saving this thread. The Kendall-τ trick is going straight into my monitor.

Markdown supported · be kind, be specific
By posting you agree to the community guidelines. Spam, shilling, or asking for DMs gets you muted; alpha shared in good faith gets you followed.