← Research
Market structure Indicators

The reversion you see in a band is mostly the band

Price stretches away from a Bollinger band, a Keltner channel, a VWAP band or a regression channel, then snaps back. Split that snap-back into what price did and what the line did, and 96 to 98 percent of it is the line moving to price. The part a trade can actually collect is under a tick.

96–98% of the snap-back is the band refitting, not price returning
0.79 ticks that price actually delivers on ES, against a 2.28-tick round turn
16 band-and-window combinations tested; not one clears the cost floor
$19.77 a trade separates crossing the spread from resting a limit, same signal

Where this came from

This started as a strategy, not a study. Fit a channel to recent price, let it tilt so a trend does not invalidate it, sell the upper band and buy the lower one, and take ten to twenty ticks a session out of the chop. We built it, and the premise checked out at every step — the market really does mean-revert at these horizons, and the band residual really does behave like the textbook process. The trade still did not work. Chasing the gap between those two facts is where the useful result is, and it turned out not to be about this strategy at all.

First, the premise is real

The whole idea rests on one claim: that intraday price has range in it to sell, rather than wandering off like a random walk. That claim is testable without reference to any strategy. The variance ratio compares the variance of a q-minute move to q times the variance of a one-minute move. At 1.00 there is nothing to fade. Below 1.00 the market is reverting.

On 1,227 sessions of ES, every horizon from five minutes out sits below one, and the effect strengthens as the horizon lengthens: 0.988 at five minutes, 0.974 at ten, 0.937 at thirty and 0.913 at an hour, with intervals that clear 1.00 comfortably. The two-minute reading of 0.998 is the one to ignore — at that horizon the bid-ask bounce pushes the statistic down for a mechanical reason that has nothing to do with tradeable range.2

Does ES actually mean-revert intraday?Variance ratios on 1-minute ES closes. 1.00 is a random walk with no range to sell into. Every horizon from five minutes out sits below it, so the premise behind band trading is real.0.860.920.981.04random walk — nothing to sell2 minutes: variance ratio 0.998, 95% CI 0.995 to 1.0010.9982 minrandom walk5 minutes: variance ratio 0.988, 95% CI 0.982 to 0.9950.9885 minreverting10 minutes: variance ratio 0.974, 95% CI 0.964 to 0.9840.97410 minreverting30 minutes: variance ratio 0.937, 95% CI 0.918 to 0.9550.93730 minreverting60 minutes: variance ratio 0.913, 95% CI 0.886 to 0.9410.91360 minrevertingvariance ratio with its 95% interval, by horizonES 1-minute closes, regular session, 2021-08-30 to 2026-08-27 (1,227 sessions). The 2-minutereading is inflated by bid-ask bounce and is not evidence either way.
ES genuinely mean-reverts intraday. This is not a null result, and the rest of the article is not a debunking of this chart.

The model says eleven ticks

Fit a rolling regression channel and the distance from price to the midline — the residual — behaves like an Ornstein-Uhlenbeck process: it gets pulled back toward zero at a rate you can measure.3 On a 30-bar channel the residual's autocorrelation is 0.872, which is a half-life of 5.1 minutes, and the typical band is 7.5 ticks wide. Enter two standard deviations out, hold ten minutes, and the model says the trade is worth 11.18 ticks. The round turn on ES costs 2.28 ticks — one tick crossed on each side plus commission. On paper this is not a marginal edge; it is a licence to print.

The realised move is 0.79 ticks. Not 11.18 with slippage. Not half. A fifteenth. Shorten the channel to 20 bars or lengthen it to 60 and the promise stays near eleven ticks while the delivery stays under one.

What the reversion model promises, and what turns upThe Ornstein-Uhlenbeck model fitted to the channel residual says a two-sigma entry held ten minutes is worth about eleven ticks. The realised move is under one tick, and the round turn costs 2.28.036912cost of the round turn: 2.28 ticks20-bar channelhalf-life 3.3 minN=20: model says 11.11 ticks11.11 tk the model saysN=20: realised 0.59 ticks0.59 tk the market30-bar channelhalf-life 5.1 minN=30: model says 11.18 ticks11.18 tk the model saysN=30: realised 0.79 ticks0.79 tk the market60-bar channelhalf-life 10.3 minN=60: model says 10.22 ticks10.22 tk the model saysN=60: realised 0.66 ticks0.66 tk the marketwhat the model implieswhat the trade actually returnsticksES 1-minute, 1,227 sessions. Entry when price closes two residual standard deviations outsidethe channel, held 10 bars, in at the next bar’s open. Model capture is k·sigma_e·(1 − phi^H)from the fitted residual AR(1).
Three channel lengths, the same gap each time. The model is not slightly optimistic; it is describing a different quantity from the one the trade collects.

Where the other ten ticks went

A residual is the distance between two things, so it can close from either end. Write it out and there is nowhere else for the move to hide:

e(t)            =  price(t) − line(t)

e(t+H) − e(t)   =  [ price(t+H) − price(t) ]  −  [ line(t+H) − line(t) ]
                     price moves to the line      the line moves to price

Only the first term is tradeable. The second is bookkeeping: the midline is refitted on every bar, so once a move is inside the window the fit slides up to meet it and the residual collapses without price going anywhere at all.

Measured across 16,540 ES signals, the line supplied 18.58 ticks of the closing gap and price supplied 0.84. That is the missing factor of fifteen, found. The same split holds everywhere we looked: NQ 87.19 against 2.93, gold 14.48 against 0.23, crude 19.09 against 0.31. Between 96 and 98 percent of the reversion is the band, on four instruments and 83,000 signals.

When the gap closes, which one moved?The residual can close because price came back to the line or because the line went to price. Ninety-six to ninety-eight percent of it is the line, on every instrument tested.share of the closed gap, split by what supplied itthe bar is the whole reversion; the blue piece is the only part a trade can collectES16,540 signals · 1,227 sessionsES: the line moved 18.58 ticks toward priceES: price moved 0.84 ticks toward the linethe line moved 18.58 ticks4%price0.84 tkNQ16,241 signals · 1,225 sessionsNQ: the line moved 87.19 ticks toward priceNQ: price moved 2.93 ticks toward the linethe line moved 87.19 ticks3%price2.93 tkGC35,937 signals · 3,561 sessionsGC: the line moved 14.48 ticks toward priceGC: price moved 0.23 ticks toward the linethe line moved 14.48 ticks2%price0.23 tkCL14,201 signals · 1,256 sessionsCL: the line moved 19.09 ticks toward priceCL: price moved 0.31 ticks toward the linethe line moved 19.09 ticks2%price0.31 tkthe line moved to price (not tradeable)price moved to the line (tradeable)1-minute bars. ES, NQ and CL 2021-08-30 to 2026-08-27; GC 2010-06-07 to 2026-09-09. Regressionchannel, 30 bars, entry at k = 2.0, measured 10 bars later.
Each bar is a complete reversion — the gap between price and the line, closed. The slate portion is the line travelling to price. The blue sliver is everything a trade could have collected.

Why this is not obvious from the chart

On a chart the two cases look identical. Price pokes outside the band, a few bars pass, price is inside the band again — the picture is the same whether price came back or the band went out to get it. The eye reads the gap closing and infers the movement that would have closed it. Every visual test you can run on a band indicator is blind to the distinction, which is why the belief survives so well.

It is not the channel — it is any line that refits

A regression channel is an unusual construction, so the obvious objection is that this is a quirk of that particular fit. It is not. We ran the identical measurement on three band families at five window lengths each: the regression channel, Bollinger bands (a simple moving average with a standard-deviation envelope)4, and Keltner channels (an exponential average with an ATR envelope). Sixteen cells including an anchored session VWAP.

Across all of them, the band moved between 4.0 and 23.7 ticks toward price and price contributed between +0.84 and −0.52. The best cell in the entire grid returns about a third of what it costs to trade. Keltner channels are negative at every window we tested. Both long-window Bollinger cells are negative, which is worth saying plainly: at a 240-bar window, price keeps going away from the band and the gap closes anyway, entirely on the band's side of the ledger.

The anchored VWAP is the interesting control. It is never refitted, only extended — yesterday's prints stay in it forever — so its line should move least, and it does: 4.01 ticks against the regression channel's 18.58. The tradeable term does not benefit. Price contributed −0.44 ticks there, the wrong way. Slowing the line down removes the illusion without revealing an edge underneath it.

It is not the channel — it is any line that refitsThe tradeable half of the reversion, in ticks, for three rolling band families at five window lengths plus an anchored session VWAP. Every cell sits far below the cost of the round turn, and several are negative.-10123what the round turn costs: 2.28 ticksregression channel, 20 bars: price supplied +0.68 ticks while the band supplied +20.52Bollinger, 20 bars: price supplied +0.45 ticks while the band supplied +12.84Keltner, 20 bars: price supplied -0.33 ticks while the band supplied +17.4220 barsregression channel, 30 bars: price supplied +0.84 ticks while the band supplied +18.58+0.84Bollinger, 30 bars: price supplied +0.16 ticks while the band supplied +10.67Keltner, 30 bars: price supplied -0.14 ticks while the band supplied +13.9030 barsregression channel, 60 bars: price supplied +0.66 ticks while the band supplied +14.01Bollinger, 60 bars: price supplied +0.05 ticks while the band supplied +7.90Keltner, 60 bars: price supplied -0.36 ticks while the band supplied +9.2160 barsregression channel, 120 bars: price supplied +0.10 ticks while the band supplied +10.57Bollinger, 120 bars: price supplied -0.44 ticks while the band supplied +5.98Keltner, 120 bars: price supplied -0.40 ticks while the band supplied +6.15120 barsregression channel, 240 bars: price supplied -0.01 ticks while the band supplied +8.78Bollinger, 240 bars: price supplied -0.52 ticks while the band supplied +4.42-0.52Keltner, 240 bars: price supplied -0.17 ticks while the band supplied +4.26240 barsanchored session VWAP: price supplied -0.44 ticks while the line supplied +4.01-0.44sessionVWAPtickswhat price contributed to the reversion, by band and windowregression channelBollingerKeltneranchored session VWAPES 1-minute, 1,227 sessions, 2021-08-30 to 2026-08-27. Same rule throughout: price closes 2.0band-widths out, measured 10 bars later. Across these 16 cells the band itself moved 4.0 to23.7 ticks toward price.
The tradeable half of the reversion, in ticks, for every band and window tested. The dashed line is what it costs to trade once. Nothing comes close, and several cells sit on the wrong side of zero.

The second wall is the fill

Suppose you took the 0.79 ticks at face value and tried to collect it. How you get into the trade decides the outcome, and the two answers have opposite signs.

Cross the spread — wait for price to close outside the band, buy or sell the next bar's open — and the trade makes +$9.85 a trade gross across 16,540 fills. Rest a limit order at the band instead, and let the market come to you, and the same signal on the same bars loses −$9.92. That is a $19.77 swing produced entirely by the fill assumption.

The mechanism is not subtle once stated. A resting limit order fills when price trades through your level — and price trades through your level precisely on the bars when the move is continuing, not reverting. You are filled on the breakouts and passed over on the reversions. This is textbook adverse selection against a passive quote,5 and it is the reason a backtest that fills at the touch of a level will show an edge that does not exist. Any simulator that grants you a fill because price reached your price is measuring the simulator.

The same signal, two ways inCrossing the spread at the next bar’s open makes money gross. Resting a limit at the band and waiting to be filled loses money gross, on the same signals over the same bars.gross dollars per trade, before costsES, 30-bar regression channel, two band-widths out, held ten bars$0taker — hit the next open16,540 fills · win 51% · t +3.9taker — hit the next open: +9.85 dollars per trade gross+9.85maker — rest a limit at the band25,527 fills · win 49% · t -4.9maker — rest a limit at the band: -9.92 dollars per trade gross-9.92+19.77 a tradeis the difference between the two rows — same signal, same bars, same hold.ES 1-minute, 1,227 sessions. The resting limit is posted while price is still inside the bandand is filled only when the next bar trades through it by a full tick, which is theconservative assumption about queue position.
Same signal, same bars, same hold. The only difference is whether you pay the spread or try to earn it, and it is worth almost twenty dollars a trade.

Where the geometry is least hostile

Take the taker version at face value — ignore the fill problem entirely, credit the trade with its full gross move, subtract the round turn — and only one instrument clears zero.

ES loses $18.65 a trade, gold loses $22.44, crude loses $20.66. NQ makes $1.34, which is a quarter of a tick, at a t-statistic of 0.58. That is breakeven wearing a hopeful expression, not an edge. But the reason NQ is the least bad is worth carrying away, because it generalises. The cost of a round turn is almost constant in tick terms across these four markets — 2.28 to 2.70 ticks — so the only thing that varies is how much band noise there is to harvest. NQ's band is 32.9 ticks wide where ES's is 7.0. Its tick is the finest in the complex relative to its own volatility, and that is the whole of its advantage here.

Net of costs, on the optimistic fillTaking the taker version at face value and paying the round turn, only NQ clears zero, and it clears by a quarter of a tick with a t-statistic of about half.-28-21-14-707ES: -18.65 dollars per trade net-18.65ESedge 0.79 tkcost 2.28 tkt -6.67NQ: +1.34 dollars per trade net+1.34NQedge 2.97 tkcost 2.70 tkt +0.58GC: -22.44 dollars per trade net-22.44GCedge 0.11 tkcost 2.35 tkt -19.92CL: -20.66 dollars per trade net-20.66CLedge 0.28 tkcost 2.35 tkt -8.63dollars per trade after the round turn, one contractdollarsCost is one tick crossed on each side plus $3.50 commission per round turn. In ticks that is2.28 on ES, 2.70 on NQ and 2.35 on GC and CL, so the only thing that varies across instrumentsis how much band noise there is to harvest.
Net of costs on the optimistic fill. Three instruments lose decisively. The fourth is indistinguishable from zero, and that is the best case in this entire study.

What to do with this

The useful part of this is not a verdict on one strategy. It is a measurement you can run on any indicator you are thinking of trading, in an afternoon.

What we’d test next

The band question is closed for our purposes: the premise is real, the tradeable term is under a tick, and the fill is adverse. Three things we would measure next, in order of how cheap they are:

  1. The same decomposition against references that never move at all — the prior day's close, the session open, the overnight high. If the tradeable term is still near zero there, the conclusion is about intraday price rather than about indicators.
  2. NQ alone, with much wider bands and far fewer trades, which is the only corner of this grid where the arithmetic is not immediately fatal.
  3. Whether order flow separates a trade-through that is noise from one that is a real breakout — resting size, absorption, delta at price. That is the missing input, and it is invisible in OHLCV bars. Two other studies in this lab have terminated at the same requirement.

Method

Data
1-minute futures bars, regular session only. ES, NQ and CL from 2021-08-30 to 2026-08-27 (1,227, 1,225 and 1,256 sessions); GC from 2010-06-07 to 2026-09-09 (3,561 sessions). Contract roll days are dropped entirely, because the roll gap is not a price move. Sessions with fewer than 250 bars are excluded.
Bands
Four families, all built the same way and all measured with the same rule. Regression channel: rolling ordinary least squares on bar position, midline taken at the window end, half-width k times the residual standard deviation. Bollinger: simple moving average, half-width k standard deviations. Keltner: exponential moving average, half-width k times ATR. VWAP: anchored at the session open, half-width k times the running standard deviation of price around it. Windows of 20, 30, 60, 120 and 240 bars for the three rolling families.
Signal and measurement
A signal is a close k = 2.0 band-widths outside the band, with a cooldown equal to the hold so signals cannot stack. Everything is measured 10 bars later. The decomposition uses closes at the signal bar and the exit bar; the tradeable P&L uses the next bar's open as the entry, never the signal bar's close. The maker fill requires the next bar to trade through the resting limit by a full tick, which is a conservative assumption about queue position — it is generous only in ignoring the orders ahead of yours.
Costs
One tick crossed on each side plus $3.50 commission per round turn: 2.28 ticks on ES, 2.70 on NQ, 2.35 on GC and CL. No exchange-fee variation, no slippage beyond the tick, no financing.
Statistics
Signals inside one session overlap and are not independent, so P&L is averaged to a daily figure first and the t-statistic is taken across sessions, not across signals. Variance-ratio intervals use the standard heteroskedasticity-consistent form.1 No result here is adjusted for multiple comparisons; the grid is reported whole rather than as a best cell.
Limits
One entry threshold and one hold — k = 2.0 and ten bars — across five windows and four band families. This is not a parameter sweep, and it is not a full strategy backtest: there are no stops, no targets and no position sizing, because the object being measured is the reversion itself rather than a trading rule. Three of the four instruments cover five years; only gold covers sixteen. A wider grid would change the individual numbers. It would have to change them by a factor of three to change the conclusion.

References

  1. Lo, Andrew W., and A. Craig MacKinlay. “Stock Market Prices Do Not Follow Random Walks: Evidence from a Simple Specification Test.” The Review of Financial Studies 1, no. 1 (1988): 41–66. Link
  2. Roll, Richard. “A Simple Implicit Measure of the Effective Bid-Ask Spread in an Efficient Market.” The Journal of Finance 39, no. 4 (1984): 1127–1139. Link
  3. Uhlenbeck, George E., and Leonard S. Ornstein. “On the Theory of the Brownian Motion.” Physical Review 36, no. 5 (1930): 823–841. Link
  4. Bollinger, John. Bollinger on Bollinger Bands. New York: McGraw-Hill, 2001.
  5. Glosten, Lawrence R., and Paul R. Milgrom. “Bid, Ask and Transaction Prices in a Specialist Market with Heterogeneously Informed Traders.” Journal of Financial Economics 14, no. 1 (1985): 71–100. Link
  6. Avellaneda, Marco, and Sasha Stoikov. “High-frequency Trading in a Limit Order Book.” Quantitative Finance 8, no. 3 (2008): 217–224. Link
Historical behaviour of futures contracts, not a strategy or a recommendation. Full disclaimer.