Trying to Trade the Chop: My ETF Mean-Reversion Experiment
Part 14 talks about my attempts to test a Mean-Reversion strategy
This is part 14 of my series — Building & Scaling Algorithmic Trading Strategies
Mean Reversion: A Civilized Weapon for a Less-than-Civilized Market
There’s a certain type of market that just laughs at trend strategies.
You know the one:
No real direction
Breakouts keep failing
Indicators show “momentum,” but price mean-reverts in your face
These are the regimes where mean reversion is supposed to shine.
So alongside my dual long–short sleeve and the volatility sleeve, I wanted to prototype a short-horizon ETF mean-reversion strategy that might:
harvest small edges in choppy, sideways markets
run at low risk (vol-targeted)
have tight stops and a realistic cost model
be a candidate for an “opportunistic / choppy-market sleeve” in my framework
This post is the story of that prototype — including all the ways it failed to clear the bar.
1. The Idea: A Simple ETF Mean-Reversion Sleeve for Chop
Conceptually, the rationale is simple:
When momentum fades and markets go sideways,
short moves away from a recent mean can snap back,
so you can buy dips / fade pops with small profit targets,
as long as you keep position sizes small and risk tight.
I started with a small ETF basket:
SPY, QQQ, IWM, TLT, GLD (or similar equity + rates + gold mix)
And I built a daily mean-reversion backtester with:
Z-score of short-term deviation from a rolling mean (e.g., price vs. moving average)
Entry rules:
go long when z < –z_entry (oversold)
go short when z > +z_entry (overbought)
Exit rules:
flatten when |z| < z_exit (back toward mean)
or a stop if the move extends too far
Sizing:
volatility-scaled weights (target portfolio vol)
per-asset max weight cap
gross exposure cap across all ETFs
Risk control:
no crazy leverage
daily rebalance logic
turnover limiting (weight-change cap)
Basically: “buy/sell small deviations from fair value”, but implemented in a way that tries not to get killed by noise and costs.
2. First Run: It Trades… But the Edge Is Weak
On the first configuration, over 2,426 days (so multiple years):
ROI: ~4.49%
CAGR: ~0.46%
Sharpe: ~0.16
Max drawdown: ~–8.05%
Avg daily turnover: small but non-zero
So:
It trades.
It doesn’t blow up.
But it doesn’t really earn either.
I think of it as a slightly fancier version of “doing nothing.”
3. Parameter Sweep #1: Playing with Vol, Weight, Gross Cap, Bands
Next I started turning knobs to try and find if certain configurations could help unlock ROI.
I ran a small grid of configs, tweaking:
target_vol (how much risk the sleeve is allowed to take),
max_weight (cap per ETF),
gross_cap (overall exposure limit),
z_entry and z_exit (how far from the mean before entry, how tight the profit-take band).
Example configs and results (representative, not exhaustive):
target_vol 0.08, max_weight 0.10, gross_cap 0.6, z_entry 1.0, z_exit 0.3
ROI: ~4.49%
Sharpe: ~0.16
MaxDD: ~–8.05%
target_vol 0.06, max_weight 0.08, gross_cap 0.5, z_entry 1.0, z_exit 0.3
ROI: ~3.65%
Sharpe: ~0.16
MaxDD: ~–6.47%
target_vol 0.10, max_weight 0.15, gross_cap 0.8, z_entry 0.8, z_exit 0.2
ROI: ~13.83%
Sharpe: ~0.26
MaxDD: ~–9.55%
target_vol 0.07, max_weight 0.10, gross_cap 0.6, z_entry 0.8, z_exit 0.25
ROI: ~11.01%
Sharpe: ~0.31
MaxDD: ~–4.51%
target_vol 0.05, max_weight 0.07, gross_cap 0.4, z_entry 1.2, z_exit 0.4
ROI: ~–1.79%
Sharpe: ~–0.09
MaxDD: ~–5.79%
The best Sharpe in that batch was config (4) at ~0.31.
That’s… okay in isolation, but:
below any realistic bar for a new sleeve, and
this is pre realistic transaction costs, slippage, and stress testing.
Not unusable, but not exciting.
4. Bigger Grid, Wider Bands, Still Nothing Special
I then built a bigger grid:
z_entry ∈ {0.8, 1.0, 1.2, 1.5}
z_exit ∈ {0.25, 0.3, 0.4, 0.6}
target_vol ∈ {0.06, 0.07, 0.08}
gross_cap ∈ {0.5, 0.6, 0.7}
max_weight = 0.1
The idea: see if more extreme entry/exit bands help avoid whipsaw and only trade “cleaner” reversions.
Even with that extended search, everything still clustered around:
Sharpe < 0.4,
modest ROI,
and nothing that looks like “aha, here’s the edge.”
Best case was still in the neighborhood of that earlier ~0.31 Sharpe configuration.
So I tried one more extension: wider z-bands plus a simple volatility regime gate (e.g., only mean revert when volatility is in some “choppy but not broken” zone).
Configs like:
target_vol 0.06 / gross_cap 0.5 / z_entry 1.2 / z_exit 0.4
target_vol 0.06 / gross_cap 0.6 / z_entry 1.5 / z_exit 0.6
target_vol 0.07 / gross_cap 0.5 / z_entry 1.5 / z_exit 0.6
target_vol 0.07 / gross_cap 0.6 / z_entry 1.8 / z_exit 0.8
etc.
The bottom line is that even with regime gating, most configs came in around:
ROI ≈ flat to negative
Sharpe ~ 0.0 to a bit negative
MaxDD still non-trivial (–5% to –9%)
So: widening bands + regime filters didn’t really help.
5. Bollinger Bands, Take-Profit/Stop Variant — Also No
Next I tried the classic:
Bollinger bands trigger (enter when price taps outer band),
simple take-profit / stop-loss,
plus the same vol-based regime gate.
Think “more traditional mean reversion,” with:
entry on touch,
a fixed TP,
a fixed SL,
and a limited gross exposure.
Configs like:
target_vol 0.07, gross_cap 0.6, z_entry=1.5, z_exit=0.6
target_vol 0.06, gross_cap 0.5, z_entry=1.5, z_exit=0.6
target_vol 0.08, gross_cap 0.7, z_entry=1.2, z_exit=0.4
All of them came out negative:
ROI: –4% to –7%
Sharpe: around –0.1 to –0.2
MaxDD: –9% to –10%
So the BB / TP / SL variant didn’t rescue the idea.
Still not blowing up, but still far away from a tradable edge.
6. What This Tells Me About ETF Daily Mean Reversion Here
A few clear signals from the experiment:
The daily ETF mean reversion spec (as tested) doesn’t show a strong edge.
Across multiple parameter grids, regimes, triggers (z-score, Bollinger), and risk settings, the strategy failed to produce anything close to Sharpe > 1, and often hovered near zero or negative.The risk is not the problem; the signal is.
Drawdowns were reasonably controlled (–4% to –10%), especially given modest target vols. Turnover was manageable after tuning.
But if you’re earning 1% CAGR with ~–8% max drawdown, it’s just not worth it.More selectivity and “smart” band tuning did not reveal hidden alpha.
Often, when something has a true but weak edge, being more selective improves Sharpe. Here, higher thresholds and stricter filters often made things worse or flat.In my current framework, this sleeve fails both roles:
It’s not viable as an orthogonal alpha sleeve (Sharpe too low).
It’s not a particularly helpful hedge (doesn’t reliably help in stress).
So, as a candidate for “chop trading”: this specific daily ETF mean-reversion model doesn’t make the cut.
7. Where This Fits in the Bigger System
In my strategy taxonomy:
Core engines: dual allocator (trend/flow/velocity)
Orthogonal alpha: vol sleeve, future rate/credit/vol sleeves
Hedges: cash, maybe some explicit tail/risk-off overlays
Opportunistic: event-driven, macro straddles, etc.
This ETF MR sleeve: for now, does not belong in production.
That doesn’t mean “mean reversion doesn’t work” as a concept.
However, it does mean that:
This particular implementation, at this frequency, on this basket, with these triggers, does not produce a robust Sharpe.
Could a higher-frequency MR work better intraday? Maybe.
Could a more sophisticated spread/stat-arb approach work? Possibly.
Could this idea be revived with pair structures, options, or cross-sectional filters? Sure.
But the disciplined move right now is: log the experiment, keep the code, and don’t fund an idea that doesn’t work.
8. What I Might Explore Next (Instead of Forcing This)
Rather than keep grinding on this exact model, the more promising directions are:
Cross-sectional equity momentum or relative-strength sleeves
(where there’s clearer evidence of edge historically).Options-based premium strategies with strict risk-off triggers
(short premium during defined chop, flat when vol breaks).Stat-arb / pairs trading in tightly linked ETFs or stocks
(mean reversion in spreads, not outright ETFs).Or even just invest more in the Bayesian blender + cross-asset signals, which are already showing more promising behavior when blending the dual + vol sleeves.
Closing
I went into this ETF mean-reversion experiment thinking: “If the market wants to chop, maybe I can make some money from the chop.”
What I got instead was a clear answer:
The current daily mean-reversion spec
On this ETF basket
With reasonable parameter sweeps and risk caps
…does not deliver a tradable edge.
At the end of the day, the whole point of this project is to test ideas honestly, keep the ones that survive contact with the data, and kill the ones that don’t — no matter how good they sound in theory.
For now, ETF mean reversion joins FX momentum/carry on the “interesting but not yet” shelf.
The focus stays on:
the dual allocator,
the volatility sleeve,
the Bayesian blender,
and the cross-asset/macro integration — where the numbers are actually starting to confirm the story.
If I revisit mean reversion, it’ll either be higher frequency, spread-based, or options-based. But I won’t force a weak daily ETF mean-reversion sleeve into a system that’s supposed to compound real money.
The information presented in Math & Markets is not investment or financial advice and should not be construed as such.



