What is mean reversion? Three flavors backtested — and only one wins consistently
Mean reversion is a class, not a strategy. We walk-forwarded three implementations across 35 thematic names: regression-channel wins 22 of 35, Fibonacci basket wins at PF 1.76, flat-mean Bollinger wins 1 of 35. The structural reason is which mean you assume.
The standard mean-reversion story goes like this. Prices oscillate around a fair value. When they over-extend up, sellers come in. When they over-extend down, buyers come in. Find the mean, measure the distance from it, and bet that distance closes. Buy the dip, sell the rip, mean-revert into profit.
The story is half-right. Prices do mean-revert — on the right kind of name. The half it gets wrong is treating "mean reversion" as a single strategy when it's actually a class of strategies that disagree fundamentally about what the mean is. We walk-forwarded three different mean-reversion implementations on the same 35-ticker universe over 2 years of hourly bars. The regression-channel version classified ROBUST on 22 of 35 names. The flat-mean Bollinger version classified ROBUST on 1 of 35. The Fibonacci-basket version — a different shape entirely — delivered basket-level PF 1.76 / Sharpe 1.42 / +23.7% over 3 years of daily bars on curated levels. Same underlying concept, three completely different outcomes. This piece walks through why.
The TL;DR. Mean reversion works on volatile thematic names that don't trend cleanly. Which implementation you use matters more than the concept. Flat-mean (Bollinger Bands) fails because the mean isn't flat — it drifts. Regression-channel adapts to the drift and wins on 22 of 35 names. Curated Fibonacci wins at the basket level on a different (daily, multi-week) timeframe. On secular trenders ($NVDA / $TSLA / $AMZN class), every flavor fails — the trend is the dominant factor and the mean is a moving target the strategy can't keep up with.
What mean reversion actually is
A mean-reversion strategy makes two assumptions:
- There exists a reference — a moving average, a regression line, a Fibonacci level, a VWAP, a recent range midpoint — that price is statistically tethered to.
- The further price drifts from the reference, the more likely the next move is back toward it.
Concretely, the strategy fires when price is far from the reference (defined by ±N standard deviations, ±N% from the line, ±N ATRs, etc.), and exits when price returns to the reference (or hits a stop on the far side).
The two design decisions that matter most:
- What is the mean? A flat horizontal? A linear regression that adapts to slope? A user-curated historical level? A volume-weighted intraday line? Each answer makes the strategy work on a different name class.
- What is the distance? Standard deviations of returns? ATR multiples? Percentage points? Each answer makes the entry signal more or less sensitive to regime changes.
The textbook treats these as solved problems with single answers. Empirically, both answers depend on the ticker, the timeframe, and the regime.
Why it works — when it works
Two reasons, one statistical, one behavioral.
Statistical. Returns are noisy around an underlying trend. Day-to-day moves are dominated by liquidity events, news flow, options-related flows, and order-book dynamics — not by changes in the underlying value. Over short horizons, the noise component dominates and that noise is approximately stationary around the trend. A position that fades extreme noise excursions is, in expectation, betting on the noise distribution to revert — a clean statistical bet.
Behavioral. Markets overshoot. Panic sellers don't stop selling at "fair value" — they stop selling when the bid disappears. Euphoric buyers don't stop buying at "fair value" — they stop when they run out of capital. Both overshoots produce the same structural pattern: price extends past the reference, finds no further marginal participants, and reverts. Mean-reversion strategies fade the overshoot.
Both reasons fail in the same situation: when the underlying value itself is moving fast enough that what looks like an overshoot is actually a re-rating. $NVDA running from $100 to $140 in three weeks isn't an overshoot — it's a re-pricing. Faded as a mean-reversion trade, it produces a steady bleed for a year.
The three implementations we tested
QuantAbundancia maintains an internal sweep harness that walk-forwards every strategy in the library across the full thematic universe. The three mean-reversion implementations in the library:
1. Flat-mean Bollinger (the textbook version, file mean_reversion.py)
The reference is a 20-period simple moving average. Bands at ±2 standard deviations. Long entries on a touch of the lower band, exit at the SMA. The implicit assumption: the SMA is the fair value. The flaw: on any name in a sustained trend, the SMA drifts upward but the strategy still treats it as a flat reference — the upper band gets touched repeatedly and produces nothing, the lower band gets touched during healthy pullbacks and produces falling-knife entries.
2. Regression channel (the adaptive version, file regression_channel_mr.py)
The reference is a linear regression fit over the last 40 bars. Bands at ±2 × standard error of the residuals. The key addition: only fade the lower band if the regression slope is non-negative. In other words: don't fade a downtrend. The channel adapts to the trend slope, so it can trade reversion along a trend without being whipsawed by the trend itself.
3. Curated Fibonacci basket (the basket version, file fib_mean_reversion.py)
The reference is a user-curated historical key level — one per ticker, hand-picked from the daily chart. Long entries on a touch within ±2.5% of the level after coming from outside the band. -10% stop, +12% take-profit, 20-bar time exit. Run on a 48-ticker basket spread across 12 themes. Covered in depth in our Fibonacci retracement piece — it's the same mean-reversion class with a curated rather than computed reference.
These three flavors disagree about every design decision: flat mean vs slope-adaptive vs hand-picked level, statistical bands vs percentage bands, no trend filter vs slope filter vs theme-level filter. The walk-forward results disagree just as sharply.
The leaderboard — 35 names, 2 years, 1-hour timeframe
The 35-ticker IBKR universe spans the same thematic structure as the Fibonacci basket — photonics, space, drones, nuclear, CPU bottleneck, AI inference, agentic AI, AI utility, AI power, plus the large-cap secular winners. The sweep classifies each (ticker, strategy) pair as ROBUST (both walk-forward windows positive and meaningful), STABLE (positive but uneven), or LUMPY (one window carries the entire result).
| Strategy | ROBUST | STABLE | LUMPY |
| --- | --- | --- | --- |
| regression_channel_mr | 22 | 7 | 3 |
| ema_crossover (trend follower, for reference) | 15 | 7 | 2 |
| keltner_breakout | 8 | 2 | 3 |
| adaptive | 8 | 2 | 2 |
| mean_reversion (flat-mean Bollinger) | 1 | 0 | 0 |
| macd_adx | 1 | 1 | 3 |
The single most important data point. Two strategies in the same class — both mean-reverting back to a reference — produce 22 ROBUST classifications vs 1. The difference isn't the concept of mean reversion. It's whether the reference itself is allowed to drift.
The 22 regression_channel_mr ROBUST names: $AAOI, $AEHR, $ALAB, $AMKR, $ASTS, $AVGO, $BE, $BKSY, $CIFR, $CRDO, $DOCN, $GEV, $INTC, $IREN, $LITE, $NBIS, $OKLO, $ONDS, $RKLB, $UMAC, $UUUU, $VST.
Map those onto QA's theme taxonomy and the pattern is the same one the Fibonacci basket found: 9 of the same volatile thematic groups dominate — photonics, space, drones, nuclear, CPU bottleneck, AI inference, agentic AI, AI utility, AI power. Two independent strategies, two independent backtests, same winning name class. That's not a coincidence; it's the underlying property of these names.
Single-ticker top-5 by total 2-year PnL on regression_channel_mr:
| Ticker | Full 2y PnL | WF1 PnL | WF2 PnL | | --- | --- | --- | --- | | $CIFR | $302K | $103K | $98K | | $BE | $270K | $66K | $126K | | $ONDS | $247K | $48K | $126K | | $AAOI | $246K | $71K | $98K | | $ASTS | $204K | $57K | $91K |
All five are split across both walk-forward windows — neither window is doing all the work. That's the ROBUST classification's empirical content.
Why the regression-channel wins
The regression-channel implementation does three things the flat-mean version doesn't:
Slope-adaptive reference. The regression line moves with the trend. On $AVGO in 2024-2025, the line had a meaningful positive slope through almost the entire 2-year window — the lower band tracked the trend's natural pullback level, not a flat horizontal that hadn't been touched in a year.
Don't-fade-the-downtrend filter. Only take lower-band touches when the slope is non-negative. This single rule kills the falling-knife failure mode that dooms the flat-mean version on any sustained drawdown.
Centerline exit. Take-profit at the regression line, not at the opposite band. Half the work is done by the time price returns to fair value; demanding the full mean-reversion round trip leaves money on the table and exposes the position to the next noise wave.
The flat-mean version's single ROBUST entry — $KTOS — is a name that happens to oscillate in a roughly flat range for the full 2-year window. The flat-mean assumption is approximately correct for that one ticker. Everywhere else, it isn't.
Where mean reversion fails — every flavor
The shared failure mode is the same one the Fibonacci article identified. Secular trenders blow through every reference. On $NVDA, $TSLA, $AMZN, $ASML, $PLTR, $CRWD, $SNOW, every mean-reversion variant we tested classified as LUMPY or worse. The narrative is straightforward: when a stock prints higher highs through every level for 12 months running, every version of mean reversion is early-bullish and bleeds.
This isn't a flaw in mean reversion. It's the inverse expression of why trend-following exists. The thematic universe splits cleanly into two regime types:
- Volatile thematic mean-reverters (the 22 ROBUST names) — the trend isn't dominant, noise is. Fade the noise.
- Secular trend monsters (the large-cap AI winners) — the trend dominates noise. Follow the trend, don't fade it.
The 15 names where ema_crossover (a trend follower) classified ROBUST overlap with the regression-channel list on 9 names. That's another structural point: on the volatile thematic names, both directions of strategy can work — different timing, different drawdown profile, but both extract edge. On the secular trenders, only trend-following works. The asymmetry tells you which class of name you're looking at.
Basket vs per-ticker — two different games
The Fibonacci basket and the regression-channel sweep play different games. Worth being explicit:
- The Fibonacci basket runs one curated level per ticker across 48 tickers as a diversified basket. The PF 1.76 / Sharpe 1.42 number is a basket-level result — the average ticker contributes a small, noisy slice; the basket smooths the noise. The implicit thesis: diversification across themes is doing as much work as the entry rule.
- The regression-channel sweep runs one configurable strategy per ticker, walk-forward validated per ticker. The 22 ROBUST count is per-ticker — each name carries its own PF, Sharpe, drawdown. The implicit thesis: an individual ticker has enough mean-reverting structure that a strategy fit to it standalone produces real edge.
Both can be true; they're answering different questions. The basket answer is: "if I want a small mean-reversion sleeve in a portfolio, what's a robust way to construct it?" The per-ticker answer is: "if I'm trading $X stock specifically, is mean reversion a viable edge?" Different sleeve, different sizing, different risk profile.
How to apply this
If mean reversion is the angle you want to express, the empirically-supported version of it is:
- Pick a name from the volatile thematic groups. The 9 themes that dominated both the Fibonacci basket and the regression-channel sweep are the same: photonics, space, drones, nuclear, CPU bottleneck, AI inference, agentic AI, AI utility, AI power. The /stocks/<ticker> page shows which theme each name belongs to.
- Don't use a flat-mean reference. A 20-period SMA with fixed-multiple bands is the textbook version and it doesn't survive walk-forward on this universe. A linear regression with a slope filter does.
- Add a don't-fade-the-downtrend rule. Whatever your reference, only take lower-band touches when the underlying trend is non-negative. This single rule is doing meaningful work in the 22-ROBUST result.
- Exit at the reference, not the opposite band. Half the round trip is most of the edge; the second half is exposure to fresh noise.
- Don't apply this on secular trenders. $NVDA class names need a trend strategy. Mean-reversion on those is a 12-month bleed.
For US-retail execution on the basket of names where this works, the cleanest broker for fractional shares and reliable hourly data is Interactive Brokers — /stack/ibkr covers the access mechanics. Live alerts when the regression-channel fires (or when a curated Fibonacci touch hits) are part of /pro.
For the curated-Fibonacci sibling implementation, see What is Fibonacci retracement? — same class, different reference, different timeframe. For QA's broader correlation methodology — which feeds the theme classifications used here — see Why correlation > narrative in thematic investing.
What to watch
- Re-validation cadence. The sweep is re-run roughly quarterly. A persistent breakdown in any of the 22 ROBUST names would shrink the ROBUST list and trigger a parameter sweep on the strategy.
- Regime shift. Mean reversion underperforms in strong unidirectional trends across the whole market. The 2-year backtest spans the late-2024 to mid-2026 window, which included both trending and chopping regimes. A multi-quarter low-vol trending tape would test the regression-channel's slope filter the way 2017 tested every previous MR strategy.
- The opposite-class read. When
ema_crossoverandregression_channel_mroverlap on a name, both classes work on different timing. When they stop overlapping — a name drops off the trend list but stays on the mean-reversion list, or vice versa — the regime on that ticker has shifted, and that's the leading indicator for re-classification. - The flat-mean baseline. Tracking the
mean_reversion(Bollinger) version is a useful canary: when more than one or two tickers start producing edge with the flat-mean assumption, the market is in a low-trend regime where almost any reference works. When the count stays at 1, the slope filter is doing the work. - Bubble-level correlation. If a theme's bubble breaks correlation — meaning the 4 tickers in it stop trading as a cluster — the basket diversification math weakens and the per-ticker edge has to carry more weight.
Live data on the basket: /stocks/rklb, /stocks/aaoi, /stocks/cifr — three of the 22 ROBUST names, each ticker page shows the live regression-channel position and the curated Fibonacci level side-by-side.
Bubble context: /bubbles/photonics and the other 8 validated thematic clusters — the same 9 themes the Fibonacci basket and regression-channel sweep both agree on.
Adjacent reading: What is Fibonacci retracement? for the curated-reference sibling implementation, and Why correlation > narrative in thematic investing for the bubble taxonomy methodology that feeds the universe selection here.
QuantAbundancia is educational research. Nothing here is investment advice. See /disclosures.
Related bubbles
Get the daily digest.
One email a day · alerts + bubble shifts + new research. Free during beta.
No spam. One email per day max. Telegram alerts coming with the paid tier.