← All graded classics

Bollinger Band Reversion

Buy the lower band, short the upper — the classic 'bands as rubber bands' read.

F

The claim

Price closing outside a 2-standard-deviation band is stretched and should revert to the mean. The most common way retail traders use Bollinger Bands.

Where it comes from

John Bollinger developed the bands in the 1980s. Bollinger himself warns that a band touch is not automatically a signal — the reversion read is the folklore version.

The exact rule we graded

Long while %B(20, 2σ) < 0 (close below the lower band), short while %B > 1 (close above the upper band), on 1-hour candles. Exits: 2.5% stop, 2.5% target, 48-bar time exit.

The honest verdict

FAILS the gate
Net expectancy
-9.7bp
OOS trades
6,946
Win rate
49%
Reward:risk
0.96
  • OOS net expectancy > 0
  • Clears the cost hurdle
  • Robust, not lucky
  • Survivable drawdown
  • Not overfit
Per-asset OOS expectancy
BNB
+7.9bp
DOGE
-7.6bp
ETH
-8.7bp
BTC
-8.9bp
XRP
-11.0bp
SOL
-11.8bp
LINK
-13.0bp
AVAX
-19.4bp
Permanent verification record →Verified — run on our engine + data

Live forward test

since 2026-07-11 — win or lose

The backtest above is history. Since publication, this exact spec also runs in our nightly forward-test harness (the same one behind /forward-tests): only trades entered after publication count, open positions are never force-closed, and the record publishes either way.

No closed forward trades recorded yet — the record accrues nightly as trades complete their full exit windows.

Honest port notes

  • Graded exactly as the folklore states it, including trading every band breach rather than waiting for re-entry into the bands.
The exact spec, as graded (JSON)
{
  "name": "Bollinger Band Reversion",
  "universe": [
    "BTC/USDT:USDT",
    "ETH/USDT:USDT",
    "SOL/USDT:USDT",
    "BNB/USDT:USDT",
    "XRP/USDT:USDT",
    "DOGE/USDT:USDT",
    "LINK/USDT:USDT",
    "AVAX/USDT:USDT"
  ],
  "risk": {
    "risk_per_trade_pct": 1,
    "leverage_cap": 3,
    "max_daily_loss_pct": 5,
    "max_dd_halt_pct": 25
  },
  "sleeves": [
    {
      "name": "main",
      "timeframe": "1h",
      "entry": {
        "type": "rule",
        "logic": "all",
        "long": [
          {
            "indicator": "bb_pband",
            "period": 20,
            "op": "<",
            "value": 0
          }
        ],
        "short": [
          {
            "indicator": "bb_pband",
            "period": 20,
            "op": ">",
            "value": 1
          }
        ]
      },
      "exit": {
        "stop_loss_pct": 2.5,
        "take_profit_pct": 2.5,
        "time_exit_bars": 48
      }
    }
  ]
}

Every strategy graded on identical terms: 1-hour candles, 8 liquid USDT perpetuals (BTC, ETH, SOL, BNB, XRP, DOGE, LINK, AVAX), ~6 years of data with a chronological train/test split, real cost hurdle, 1% risk-per-trade sizing, 3x leverage cap. All numbers are out-of-sample (test window only).

Run YOUR version of this strategy
Different thresholds, timeframe, or filter? Paste your exact rules or code and see if your variant survives the same gates.
Grade it free →

A Grade is a historical, out-of-sample statistical measurement — not investment advice, a prediction, or a guarantee. Most strategies fail; a passing grade can stop working as markets change. Risk disclosure