Markets › Futures · ES futures
Bollinger Band Reversal
Buy when price closes below the lower band, sell short above the upper band, and exit at the middle: the “rubber band” snap-back, with and without a profit target and stop.
Buried · FragileA hint of an edge. Not enough to bank on.
Variants tried: 4 · Passed every gate: 0 · Holdout opened: yes (used before this test)
Short answer: not in this test. We backtested Bollinger Band Reversal on ES futures in 4 variants, net of costs, and 0 passed every gate. The best result, BB-L-S, made +$103,281 over 828 trades but failed the development t-statistic and the random-entry control. “No proven edge” means a convincing edge was not demonstrated, not that none exists.How much costs took here, compared across all 54 of our tests →Did the same rules work on other markets? The cross-market scoreboard →
00The verdict in three lines
- The idea is the “rubber band”: when price closes outside a Bollinger Band (20 bars, 2 standard deviations) it has stretched too far from its average, so bet that it snaps back toward the middle.
- We tested four versions on 6.7 years of ES hourly bars, net of costs. None passed. The best was the long-only simple version at +$103,281 over 828 trades, with a profit factor of 1.21 and 1.39 in validation. It and the long-only version with a target and stop each failed only two of six gates, the closest calls on this site when it was published (7 October 2026); later tests came closer.
- The evidence is a hint, not proof. In the simple version, random long entries below the middle band earn +$77 a trade against +$125 for the real signal, so a good part of that profit is not specific to the band signal. With a target and stop the signal beat our frozen random control clearly (98.8th percentile), but that control enters anywhere below the middle band while real signals fire far below it. Against a control matched on distance from the middle band, the same version reaches the 90th percentile, below the 95th we require (see the control check under “The gates”). Its development t-statistic is only 1.01 and its validation profit factor 1.12. The short side lost money in both long-and-short versions, and the target and stop lowered the profit. Verdict: Fragile (we would not call it “no edge”, and we would not call it an edge either)
01The claim
The “rubber band” reversal is a common mean-reversion setup: price is stretched like a rubber band when it closes outside its Bollinger Bands, and such stretches tend to snap back toward the average. Bollinger Bands are named after John Bollinger, who created them. We found no single source for this exact rule set, so we describe it as a common setup and credit nobody for it. We test our own exact definition, at the default settings, with nothing tuned. We test rules, not people.
Not to be confused with our RSI(2) Dip Buyer test, which uses a different indicator.
02The rules we tested (frozen 7 Oct 2026, before any run)
- Bands: a 20-bar average of hourly closes, with bands 2 standard deviations above and below.
- Signal: a close below the lower band means long. A close above the upper band means short. One position at a time, around the clock, flat before the weekend. Orders fill at the next 1-minute open.
- Simple exit (S): leave at the first close back across the middle band. No stop, no target.
- Full exit (F): a profit target at the middle band, a stop 2 × ATR(14) from the entry, and a 24-bar time limit.
- Four variants declared up front: BB-LS-S, BB-L-S, BB-LS-F, BB-L-F (LS = long and short, L = long only, S = simple, F = full).
The full dated specification is in the files at the bottom.
03Data and costs
| Period | Dates |
|---|---|
| Development | 2020-01-01 to 2023-12-31 |
| Validation | 2024-01-01 to 2025-03-31 |
| Holdout (already used) | 2025-04-01 to 2026-09-25 |
Costs: $5.76 commission per round trip and 1 tick ($12.50) slippage on every fill, 1 contract. That is about $30.80 per trade, and every fill pays it, including targets.
Engine check: before this run, the simulation engine was configured as our RSI(2) Dip Buyer and reproduced its published trades and net result exactly.
Honest caveat on the holdout: the 2025-26 ES data was used in earlier tests of other strategies, so it can't count as clean. With four variants the base bar applies (a t-statistic of 2.0 on development). Data: ES 1-minute, back-adjusted. Raw vendor data is not published.
No stop means real tail risk. The simple versions have no stop. On one contract their worst closed trade lost $21,006 (long and short) and $22,131 (long only), and the worst loss open at some point inside a trade reached $21,263 and $22,388. The full versions cap the worst closed trade at $6,586, and their worst open loss reached $8,113 (long and short) and $6,625 (long only), past the stop level, because a bar's extreme can go beyond the stop price before the stop fills. We show both figures and label them, because they measure different things.
04Results: every variant, net of costs
| Variant | Net, all | Trades | PF dev | t (dev) | PF val | PF holdout* | vs random | Top 10 removed |
|---|---|---|---|---|---|---|---|---|
| BB-LS-S | +$47,528 | 1,651 | 0.98 | -0.23 | 1.15 | 1.13 | 75.4th | -$13,265 |
| BB-L-S | +$103,281 | 828 | 1.16 | 1.12 | 1.39 | 1.19 | 90.6th | +$49,051 |
| BB-LS-F | +$29,252 | 2,389 | 1.00 | -0.07 | 1.04 | 1.05 | 98.4th | -$54,186 |
| BB-L-F | +$87,231 | 1,288 | 1.09 | 1.01 | 1.12 | 1.11 | 98.8th | +$4,940 |
* Holdout already used before this test. PF = profit factor. "vs random" = percentile of the average net $ per trade among 500 random runs that enter on the mean-reversion side at random hours, with the same exits (the control frozen before the run; a control matched on distance from the middle band is in the control check under “The gates”).
Does a profit target and stop help? Judge profit and risk together
| Variant | Net | Max drawdown, closed trades | Max drawdown incl. open losses (approx.) | Worst closed trade | Worst open loss inside a trade | Net per $1 of drawdown |
|---|---|---|---|---|---|---|
| BB-LS-S | +$47,528 | -$58,201 | -$58,920 | -$21,006 | -$21,263 | 0.8 |
| BB-L-S | +$103,281 | -$28,487 | -$31,329 | -$22,131 | -$22,388 | 3.3 |
| BB-LS-F | +$29,252 | -$44,338 | -$45,938 | -$6,586 | -$8,113 | 0.6 |
| BB-L-F | +$87,231 | -$43,119 | -$43,594 | -$6,586 | -$6,625 | 2.0 |
Drawdown on closed trades ignores losses that are open inside a trade. The approximate figure adds each trade's worst open loss (from the 1-minute data) to the equity before it, so it is the more honest measure of account risk, especially without a stop. It is still approximate.
The target and stop lowered the profit (+$47,528 to +$29,252 and +$103,281 to +$87,231) and cut the worst single loss by about 70 percent (for long only, the worst closed trade went from -$22,131 to -$6,586, and the worst open loss from -$22,388 to -$6,625). But the drawdown over the whole period, counting open losses, did not fall: for long only it went from -$31,329 to -$43,594, because the stop is hit often (582 of 1,288 trades, 45%, against 543 at the target). Per dollar of drawdown (counting open losses), the simple version earned 3.3 and the full version 2.0. So the stop bought protection against one catastrophic trade, not a smoother ride.
Longs and shorts
| Variant | Longs net | Longs PF | Shorts net | Shorts PF |
|---|---|---|---|---|
| BB-LS-S | +$102,780 | 1.21 | -$55,252 | 0.89 |
| BB-LS-F | +$81,041 | 1.10 | -$51,789 | 0.92 |
The same pattern as our other ES tests: buying dips earned money while ES rose, and selling rallies lost it. A rubber band should snap both ways. An effect that only works on the long side is often measuring the market's drift, though an edge can genuinely differ by direction. That is why we rely on the random-entry comparison, not on the long-versus-short split, to judge it.
- Pain: the long-only simple version's worst drawdown was -$28,487 on closed trades (-$31,329 counting open losses) and it spent up to 699 days below a previous high. The long-and-short simple version spent 1,547 days.
- Confidence: the chance that the true average trade is zero or negative is 28% (BB-LS-S), 4% (BB-L-S), 36% (BB-LS-F), 8% (BB-L-F).
05The curves
BB-L-S: the best net result (long only, simple)
BB-L-F: the same signal with a profit target and stop
The simple version stays inside the random band in 77 of 81 months: buying ES below its average at random times, with the same exit, makes nearly as much. That is why it fails the random-entry gate (90.6th percentile, 95th needed). The full version is above the band in 75 of 81 months (98.8th percentile against the frozen control), a sign that the band extreme may matter when stops and targets apply, although a control matched on distance from the middle band puts it at only the 90th. Its development t-statistic is only 1.01 and its validation profit factor 1.12, so the evidence is too thin.
06The gates
| Gate | BB-LS-S | BB-L-S | BB-LS-F | BB-L-F |
|---|---|---|---|---|
| PF ≥ 1.2 in validation | fail | pass | fail | fail |
| ≥ 50 trades per period | pass | pass | pass | pass |
| t ≥ 2.0 on development | fail | fail | fail | fail |
| Above 95th pct of random runs | fail | fail | pass | pass |
| Positive without top-10 trades | fail | pass | fail | pass |
| Holdout net positive (used) | pass | pass | pass | pass |
| Gates passed (all 6 needed) | 2 / 6 | 4 / 6 | 3 / 6 | 4 / 6 |
The long-only versions clear the sample-size, ten-best-trades and holdout gates. BB-L-S fails the development t-statistic (1.12) and the random-entry gate. BB-L-F fails validation (1.12, 1.2 needed) and the development t-statistic (1.01). The long-and-short versions fail three or more gates each.
Control check after review (added 8 Oct 2026)
While checking the random control in the RSI divergence post we found the same kind of mismatch here. Our frozen control enters at random bars anywhere on the mean-reversion side of the middle band. The real signal only fires after a close beyond the outer band, a median of about 1.8 ATR below the middle band for the simple version and 2.3 for the full one. Entries closer to the middle band have a nearer exit or target, so the control's trades tend to be smaller than the signal's, and the frozen control is an easier bar than a matched one. We re-ran the comparison with a control matched on distance from the middle band at entry (in ATR units, buckets of 0.25 ATR), same exits and same trade count. Percentile of the average net $ per trade among 500 random runs:
| Variant | Frozen control (as published) | Matched on distance |
|---|---|---|
| BB-LS-S | 75.4th | 67.4th |
| BB-L-S | 90.6th | 81.4th |
| BB-LS-F | 98.4th | 95.0th |
| BB-L-F | 98.8th | 89.6th |
Percentiles move by a point or two between runs because the random trade count is calibrated to the real count. Code and output: bb_control_check.js, bb_control_check.txt.
What this changes. The claim that the target-and-stop version “does beat random entries clearly” was too strong. Against a distance-matched control the long-only full version (BB-L-F) falls from the 99th percentile to the 90th, and the long-and-short full version (BB-LS-F) lands right at the 95th line (95.0th). The simple versions stay well below it. The signal may still carry some information, since it remains above the median of the matched runs, but we have not shown that it clears the bar.
What it does not change. The gate results above stay as frozen, and no variant passed. The verdict and each variant's cause of death are unchanged, because every variant failed other gates too.
FXOther markets: the same rules on four currency pairs (added 8 Oct 2026)
We ran this strategy's four variants, with the same rules and default parameters, on EURUSD, GBPUSD, USDJPY and AUDUSD (spot FX, 60-minute bars, 2004 to September 2026) under a specification dated before any result. Costs are about 1 pip per round trip (1.2 on USDJPY). The table shows each result in pips after costs and how many of the six gates it failed. This strategy is one of six in the full FX study.
| Variant | EURUSD | GBPUSD | USDJPY | AUDUSD | Pairs net positive | Pairs passing every gate |
|---|---|---|---|---|---|---|
| BB-LS-S | -3,981 · 4 of 6 failed | -8,397 · 5 of 6 failed | -20,787 · 5 of 6 failed | -6,889 · 5 of 6 failed | 0 of 4 | 0 of 4 |
| BB-L-S | -2,343 · 4 of 6 failed | -2,586 · 5 of 6 failed | -10,386 · 5 of 6 failed | -5,707 · 5 of 6 failed | 0 of 4 | 0 of 4 |
| BB-LS-F | -12,030 · 5 of 6 failed | -12,996 · 5 of 6 failed | -20,852 · 5 of 6 failed | -6,929 · 5 of 6 failed | 0 of 4 | 0 of 4 |
| BB-L-F | -5,947 · 5 of 6 failed | -5,883 · 5 of 6 failed | -11,275 · 5 of 6 failed | -5,124 · 5 of 6 failed | 0 of 4 | 0 of 4 |
16 variant-pair results, 0 passed every gate. 0 finished net positive after costs and 4 were positive before costs, so costs turned 4 of them into losses. The highest development t-statistic was 0.20 against the 2.5 required. The closest call was EURUSD BB-L-S, which failed 4 of 6 gates (net -2,343 pips). On ES the verdict for this strategy was Buried · Fragile, and nothing here changes it.
07Cause of death
| Variant | Cause | Why |
|---|---|---|
| BB-LS-S | No proven edge | Negative in development, shorts lose heavily, no stop. |
| BB-L-S | No proven edge | Profitable, but random long entries below the average earn about three fifths of the same profit per trade, so it is not distinguishable from random at the 95% level. |
| BB-LS-F | Fragile | Positive in total, negative without its ten best trades. |
| BB-L-F | No proven edge | Beats the frozen random control, but only the 90th percentile of a distance-matched one. Nearly all of its profit sits in a few trades and its significance is low. |
What this test covers, exactly: an entry after a bar closes outside the band. It does not test waiting for the price to come back inside the band, entering at the band with a limit order, or any intrabar touch. It uses ES hourly bars only, so the results do not automatically carry over to gold or crypto, or to 1 to 5-minute charts.
What we did not test: other band lengths or widths, Keltner Channels, trend or volatility filters, daily bars, other markets, and entering at the band with limit orders. We used the common defaults on purpose, because tuning raises the odds of finding a lucky setting, not a real edge.
What would change our mind: a version that clears the random-entry gate and a development t-statistic of 2.0 together, ideally on data we haven't looked at, or a forward sample of new trades with a positive result on both sides.
TWhat this shows, and what to take into your own tests
What the results show
- On the long side, with a target at the middle band and a 2 ATR stop, the band extreme beat 98.8% of random entries in our frozen comparison. Against a control matched on distance from the middle band it reached only the 90th percentile, so the signal may add something but has not been shown to clear the 95% bar.
- Without a target and stop, random long entries below the average earn about three fifths of the same profit per trade, so that version is not distinguishable from random at the 95% level.
- In the long-only version, a stop cut the worst single loss (closed or open) by about 70% but did not reduce the drawdown over the whole period (closed or open).
What remains unknown
- Whether the hint is real: the development t-statistic is only 1.01, so it could be luck.
- Other band lengths and widths, other timeframes and other markets.
- Whether waiting for the price to re-enter the band before entering changes the result.
Why it failed
Less a failure of the idea than of the evidence. The signal beats our frozen random control but not a distance-matched one at the 95% level, the edge per trade is small next to the trade-to-trade noise, the validation profit factor (1.12) is below the 1.2 we require, the short side loses, and the profit rests on the long side, which a rising market flatters.
What you can apply to your own tests
- Use a random-entry control with the same exits. It tells you more than a profit number does.
- Match the control to the conditions your signal trades under. Ours entered anywhere below the average, while the signal waited for a stretch beyond the band, so the control looked weaker than a matched one and flattered the signal.
- Report drawdown including open losses, and the worst single trade, especially for systems without a stop.
- Judge a stop by what it does to total risk, not only to the single largest loss, closed or open.
- Do not conclude "it is only drift" from the long/short split alone. Compare with random entries, as we did.
A note on the numbers: drawdown figures are measured on closed trades unless a table says it includes open losses. Open losses inside a trade are not counted in a closed-trade drawdown, so real account risk is higher, especially for systems with no stop. Backtests are not live trading.
FAQCommon questions
Does the Bollinger Band reversal strategy work?
Not in this test. We backtested Bollinger Band Reversal on ES futures in 4 variants, net of costs, and 0 passed every gate. The best result, BB-L-S, made +$103,281 over 828 trades but failed the development t-statistic and the random-entry control. The random-entry gate is the control frozen before the run; each post's control check shows matched alternatives. “No proven edge” means a convincing edge was not demonstrated, not that none exists.
Does the Bollinger Band reversal strategy work on forex?
We ran the same rules and default settings on EURUSD, GBPUSD, USDJPY and AUDUSD under a pre-registered specification. Of the 16 results, 0 finished above zero after costs and 0 passed every gate. Read the full forex study.
How much do trading costs matter for the Bollinger Band reversal strategy?
We charged about $31 per round trip on ES. Across all 4 variants (6,156 trades) the strategy made +$456,652 before costs and +$267,293 after.
How was the Bollinger Band reversal strategy tested?
On ES futures, with rules written and dated before the data was run, costs included on every trade, results split into development, validation and holdout periods, a random-entry control as the benchmark, and every variant reported. Read the protocol.
08Check our arithmetic
bb_protocol.js · bb_control_check.js · hourly_lib.js · rsi2_protocol.js
Code provenance: our own code, written from the standard definition of Bollinger Bands. No third-party source code is used or published.
Full console output: bb_results.txt and bb_control_check.txt (control check, added 8 Oct 2026).
09Corrections
15 Oct 2026: the cause of BB-L-F changed from “Fragile” to “No proven edge”. The protocol defines Fragile as a result that falls apart without a handful of trades; BB-L-F stays positive without its ten best trades (it passed that gate), so the protocol's name for its case is No proven edge. No number, gate or verdict changed. 14 Oct 2026, after a site audit: the verdict summary called these the closest calls of any test on the site “so far”. That was true on 7 October; later tests came closer, and two variants have since passed every gate (see the findings page). The sentence now says when it was true. No result changed. 7 Oct 2026, after an outside review: (1) the verdict changed from "No edge" to "Fragile" (now labelled "No proven edge" where the label is used site-wide), because the version with a target and stop beat 98.8% of random entries even though it failed the other gates; (2) drawdown including open losses and the worst open loss were added, and the worst closed trade and worst open loss are now shown and labelled separately (an earlier version of this page quoted $6,586 for the full versions, which is the worst closed trade; the worst open loss is $8,113 for long and short and $6,625 for long only); (3) the "drift" argument now rests on the random-entry comparison, and a scope note was added. No test result changed. Also 7 Oct 2026: drawdown and worst-loss figures are now labelled as closed-trade or including open losses. No result changed. 8 Oct 2026, after a second outside review and our own control check: the random control was not matched to the signal (it enters anywhere on the mean-reversion side of the middle band, while real signals fire far beyond it). A control check with a distance-matched alternative is added under “The gates”. The claim that the target-and-stop version “does beat random entries clearly” was too strong and was reworded: against a distance-matched control BB-L-F is at the 90th percentile, not the 99th. The frozen gate results, the verdict and the causes of death did not change. 8 Oct 2026, search and navigation: added an answer-first line, a FAQ and links to related tests and guides. No result changed. 22 Oct 2026, navigation: added a link to the new guide comparing trading costs across all our tests. No result changed. 22 Oct 2026, navigation: added a link to the new cross-market scoreboard, which includes this test. No result changed. 22 Oct 2026, navigation: added a link to the new guide comparing trend following and mean reversion across all our tests. No result changed. 22 Oct 2026, navigation: added a link to the new guide comparing versions with and without a stop loss across our tests. No result changed.
+More tests and guides
- RSI 2 strategy backtest
- Rsi divergence strategy backtest
- Forex strategy backtest
- Did the stop loss help? This test next to the other with-and-without pairs
- Trend following vs mean reversion: this test next to the others of its style
- Free prop firm challenge calculator
- What all the backtests found so far
- The backtesting protocol
- How to backtest a trading strategy without fooling yourself
- Backtesting glossary