Breakout, Confluence and Regime Study BTCUSDT · 2025–2026 · quant-lab
Quant-Lab Research Note · Empirical Asset Behaviour · Status: complete

Breakout, Confluence & Regime

Does a volatility-band breakout on BTCUSDT have an edge — and can it be recovered with confluence filters or a market-regime gate? A negative result, reported in full.

Instrument — BTCUSDT Binance USD-M perpetual & spot 2025-01-01 → 2026-08-31 quant-lab research

AbstractExecutive summary

Question. Does a volatility/band breakout on BTCUSDT have an edge, and can that edge be recovered with (a) confluence filters or (b) a market-regime gate?

Answer. No. The base breakout trigger has no durable edge, and neither confluence filters nor a regime gate produced a robust, statistically significant improvement. The one apparently strong result — breakouts in an “up-trend, high-volatility” regime looked much better in 2026 — failed to replicate on 2025, where the best regime was in fact a down regime. Regime gating reduced losses substantially, but that was almost entirely a reduction in trade count and fees, not a discovered edge. Even gated, the strategy lost money in both 2025 and 2026.

Headline finding

The hypothesis that a breakout trigger plus confluence or a regime gate yields a durable BTCUSDT edge is not supported by 2025–2026 data. Timeframe is the only robust lever.

Headline numbers

1m Bollinger breakout, “good” outcome rate~5%
15m, same definition~18–20%
1h, same definition~32–36%
Best confluence filter (15m), out-of-sample lift1.23× (n.s.)
up_highvol regime, 202635.0% vs 17.8%
up_highvol regime, 202519.8% vs 18.8%
Gated vs ungated backtest, 2025−25.4% vs −78.5%
Gated vs ungated backtest, 2026−7.0% vs −58.0%

§ 1Research question and thesis

The lab’s reference strategy is a volatility/band breakout: price crosses above a volatility band on expanding volume. The working hypothesis was:

H1. Raw breakouts are noise, but a confluence of conditions — volume, order-flow, trend, volatility regime, derivatives — selects the subset that trends. Working hypothesis

A second hypothesis followed from the data:

H2. The edge is regime-dependent — breakouts work in trending/expanding regimes and fail in range/contraction regimes. A regime classifier should therefore separate signal from noise. Follow-on hypothesis

Both were tested on a design period and a separate validation period, with a pre-registered outcome definition, and H2 was additionally stress-tested by replicating 2026 on 2025.

§ 2Data

2.1 Sources and coverage

All data from Binance Public Data bulk archives (data.binance.vision), via a resumable, checksum-verified downloader (quant_lab.data.sources.binance).

Table 1 — Dataset coverage Binance bulk archives, USD-M futures and spot
datasetmarket2025 rows2026 Jan–Aug rowsnotes
bars 1mfutures525,600349,920OHLCV + taker-buy volume
bars 1mspot525,600349,920for spot–perp basis
fundingfutures1,0957298-hourly
open interestfutures105,11769,9845-minute, derived from daily metrics

Ranges: 2025-01-01 → 2025-12-31 and 2026-01-01 → 2026-08-31. Also present: BTCUSDT/ETHUSDT futures 2024-01..03, and 2024-01/02 funding plus five days of OI.

2.2 Storage and validation

Canonical schemas (quant_lab.data.schemas), Parquet partitioned by exchange/market_type/dataset/symbol/timeframe/year/month.parquet, queried via DuckDB. Validation (quant_lab.data.validate) checks missing, duplicate and non-monotonic timestamps, invalid prices and quantities, gaps, outliers and timezone consistency.

Every dataset used here passed validation cleanly. No data was fabricated or silently repaired.

2.3 Known data caveats

§ 3Methodology

3.1 Triggers tested

Table 2 — Breakout trigger definitions long-only by default; trailing (causal) windows only
strategydefinitionparams (defaults)
bollinger_breakoutclose crosses above upper Bollinger band; exit close < midwindow 20, 2σ
volatility_breakoutclose > EMA and |Δclose| > k·ATR and volume > m·mean(volume)EMA 100, ATR 14, k 1.5, m 1.5
squeeze_releaseBollinger cross only after a compressed-bandwidth squeeze, with bandwidth expandingwindow 20, squeeze z ≤ −0.5, lookback 96
range_breakout_holdclose above prior N-bar high and holds for M consecutive closeslookback 60, hold 2, exit 30

All strategies are long-only by default, use trailing (causal) windows only, and are validated for causality by tests that assert signal and feature values do not change when future bars are appended.

3.2 Execution assumptions

Recorded with every run; defaults are non-zero.

Table 3 — Execution assumptions signal at bar t close → fill at bar t+1 open
assumptionvalue
initial capital100,000
fees (per side)0.0004
slippage (per side)0.0002
position size100% of equity
leverage1×
execution delay1 bar
timingsignal at close t → fill at open t+1

3.3 Outcome measures

For every signal, the forward path is measured from the close of the signal bar over a 7-day horizon:

time to reversion
first bar whose close returns to the signal price (a stricter “touch” variant using the bar low was also computed).
excursion to reversion
the maximum favourable price move (highest high for longs) between the signal and the reversion bar.
good outcome (label)
excursion ≥ X && time_to_reversion > 1h, at X = 0.25% (1m study) and X = 0.5% (main study). A “never reverted” signal counts as slow.

Reversion and excursion are also reported as a cumulative reversion curve and a bucketed excursion table (disjoint reversion-speed buckets).

3.4 Confluence filters

Each filter is a single explicit boolean condition evaluated at the signal bar (no model): volume ≥ 1.5×mean, taker_buy/volume ≥ 0.55, 20-bar CVD > 0, close > EMA200, strong close (close in top 30% of bar range), bandwidth z ≤ −0.5, spot–perp basis > 0, funding ≤ 0, OI 1h change > 0. Combinations are greedy ANDs of the best standalone filters on the design period.

3.5 Regime classifier

A causal classifier (quant_lab.analytics.regimes), computed on a 1h regime timeframe from trailing statistics only:

3.6 Evaluation protocol

§ 4Results

4.1 Phase 1 — Reversion and excursion at 1m

2,492 Bollinger breakout signals, 1m, close-basis reversion, 7-day horizon. Median time to reversion was 1 bar (1 min), mean 51.2 min, p75 4 min; 21 signals (0.8%) never reverted within 7 days.

Figure 1. Cumulative fraction of 1m breakout signals that have reverted by each horizon. More than half revert within a single minute; 99.2% within seven days.

Table 4 — Excursion before reversion, by reversion-speed bucket value in USDT
bucketnmeanmedianminmaxmean %
≤1m1,39010.42.80.0384.90.015%
1m–5m53243.934.10.1460.90.066%
5m–15m21698.670.32.91,409.50.143%
15m–1h178201.6161.69.2979.30.300%
1h–4h88384.7311.952.62,171.40.564%
4h–1d42702.1567.5129.32,404.71.048%
1d–7d251,997.61,831.5607.74,299.72.955%
not reverted219,748.89,343.21,952.016,947.614.871%

Figure 2. Mean excursion (percent, log scale) by reversion-speed bucket. Excursion and reversion time are mechanically linked — only signals that keep running stay out of reversion. The raw 1m trigger is essentially microstructure noise.

4.2 Phase 2 — Confluence at 1m

Design = July, validate = August, 0.25% label. Baseline P(good): 6.28% design, 6.16% validate.

Figure 3. Out-of-sample lift of each 1m confluence filter. No filter was significant; volume flipped sign between periods.

4.3 Phase 3 — Higher timeframes

Jul/Aug split, 0.5% label. The base rate rises roughly 4× (15m) to 6× (1h) versus 1m — but signal counts collapse and range_breakout_hold is too restrictive to evaluate. No filter was significant at any timeframe.

Figure 4. P(good) by trigger and timeframe, design (open) vs validate (filled). Timeframe is the only lever that moves the base rate consistently.

4.4 Phase 4 — Full 2026, design Jan–Jul / validate Aug

Table 5 — Full-2026 confluence, 0.5% label
triggertfbaseline designbaseline validatebest filter (design / validate lift)
bollinger1m5.0% (n=8,304)5.0% (n=1,234)none > 1.11, n.s.
bollinger15m17.7% (n=566)19.5% (n=82)volume+EMA200: 1.19 / 1.23 (z=0.59)
bollinger1h35.5% (n=138)32.1% (n=28)none (all ≈1.0 or below)
squeeze_release15m18.1% (n=507)21.9% (n=64)volume+EMA200: 1.17 validate
squeeze_release1h36.2% (n=116)29.4% (n=17)none; OI negative

At 15m, two filters were positive in both windows: volume ≥ 1.5× (1.13/1.14) and close > EMA200 (1.11/1.15); their combination gave 1.19/1.23 — the first directionally consistent signal, though not significant. Adding oi_change_1h produced a large validation lift (2.05, n=20, z=1.94) but its design lift was only ~1.06 — treated as regime-specific, not real. At 1h no filter helped; breakouts there are already good about a third of the time.

4.5 Phase 5 — Regime classifier, 2026

Baseline: 17.7% design (Jan–Jul), 19.5% validate (Aug). up_highvol was the best regime in both windows, and down-regimes were worst. At this point H2 looked supported — pending the 2025 replication.

Table 6 — P(good) by regime, 2026 design Jan–Jul / validate Aug
regimedesign ndesign P(good)validate nvalidate P(good)
up_highvol4623.9%1662.5%
up_lowvol5516.4%30.0%
range_highvol16818.5%2213.6%
range_lowvol21217.5%147.1%
down_lowvol3611.1%——
down_highvol2412.5%40.0%

4.6 Phase 6 — 2025 replication

Baseline: 18.8% (2025), 17.8% (2026 Jan–Aug).

Figure 5. Regime performance across the two years. H2 is refuted. In 2025 up_highvol (19.8%) is indistinguishable from the 18.8% baseline and is not the best regime — down_highvol (24.6%) is. The strong 2026 up_highvol effect did not replicate.

Table 7 — Regime performance, 2025 vs 2026 design = 2025, validation = 2026
regime2025 n2025 P(good)2026 n2026 P(good)
up_highvol8119.8%6035.0%
up_lowvol8015.0%6214.5%
range_highvol28221.6%18617.7%
range_lowvol40017.2%25016.4%
down_highvol5724.6%2711.1%
down_lowvol4112.2%3910.3%

Regime-gated backtest

Gate = up_highvol + up_lowvol.

Figure 6. Total return, gated vs ungated. Gating cut losses sharply, but trade count fell 5–6× and fees fell correspondingly — the improvement is fee/turnover avoidance, not recovered edge. Both gated variants still lose money with profit factor below 1.

Table 8 — Gated vs ungated backtest
periodvarianttradestotal returnmax DDSharpewinPFfees
2025ungated619−78.5%−79.3%−4.2927.8%0.6834,189
2025gated107−25.4%−26.4%−3.1123.4%0.467,363
2026ungated417−58.0%−62.6%−5.2825.2%0.5623,008
2026gated79−7.0%−19.2%−0.8729.1%0.866,116

§ 5Interpretation — why it fails

  1. The trigger has no edge. A band/volatility cross fires on a large fraction of bars and, at 1m, is dominated by microstructure; at 15m/1h it is better but still a coin-flip biased toward fast reversion.
  2. The “good” outcome and PnL diverge. “Excursion ≥ 0.5% before reversion” is not a profit measure: the strategy exits at the mid-band, pays fees on both sides, and gives back the excursion. A signal can be labelled good and still lose money.
  3. Regime effects are not stable. The apparently strong 2026 up_highvol result is a single-sample artifact; 2025 contradicts it. With ~60–80 signals per regime-year, confidence intervals are wide enough to manufacture such effects by chance.
  4. Low base rates destroy statistical power. At 1m the good rate is ~5% with thousands of signals; at 1h it is ~⅓ with only ~25/month. There is no window where both the effect size and the sample are large enough to prove a modest (1.2–1.3×) lift.
  5. Gating’s apparent benefit is a turnover effect. Fewer trades → fewer fees → smaller losses. That is risk reduction, not alpha.

§ 6Limitations

§ 7Conclusion

The hypothesis that a breakout trigger plus confluence or a regime gate yields a durable BTCUSDT edge is not supported by 2025–2026 data.

Recommendation

Stop refining this trigger family. If research continues, change the source of edge rather than the filters — e.g. funding/basis carry, cross-sectional relative strength across a universe of perps, or a mean-reversion trigger with a proper risk model — and design the study around a PnL-based objective with enough sample to detect the effect size of interest.

§ 8Reproducibility

Data

quantlab data build binance --market futures --symbol BTCUSDT --interval 1m \
    --start 2025-01-01 --end 2026-01-01
quantlab data build binance --market futures --symbol BTCUSDT --dataset funding \
    --start 2025-01-01 --end 2026-01-01
quantlab data build binance --market futures --symbol BTCUSDT --dataset open_interest \
    --start 2025-01-01 --end 2026-01-01
quantlab data build binance --market spot --symbol BTCUSDT --interval 1m \
    --start 2025-01-01 --end 2026-01-01
# (repeat for 2026-01-01 → 2026-09-01)
quantlab data validate --symbol BTCUSDT --dataset bars --interval 1m

Reversion / excursion study

quantlab analyze excursions --strategy bollinger_breakout --symbol BTCUSDT \
    --timeframe 1m --start 2026-07-01 --end 2026-09-01 \
    --reversion-only --horizon-days 7 --reversion-basis close \
    --out experiments/reports/bb_reversion_only

Confluence and regime evaluation

quantlab analyze confluence --strategy bollinger_breakout --symbol BTCUSDT \
    --timeframe 15m --source-timeframe 1m \
    --start 2025-01-01 --end 2026-01-01 \
    --validate-start 2026-01-01 --validate-end 2026-09-01 \
    --excursion-pct 0.005 --min-reversion-hours 1 --horizon-days 7 \
    --by-regime --regime-timeframe 1h \
    --out experiments/reports/regime_2025_2026

Regime-gated backtest

quantlab analyze regime-backtest --strategy bollinger_breakout --symbol BTCUSDT \
    --timeframe 15m --start 2025-01-01 --end 2026-01-01 \
    --allow-regimes up_highvol,up_lowvol \
    --out experiments/reports/regime_bt_2025

Key artifacts

pathcontents
experiments/reports/bb_reversion_only/reversion CDF, excursion-by-bucket, per-signal events
experiments/reports/confluence_bb/1m confluence tables (design/validate)
experiments/reports/cf2_*/full-2026 confluence by trigger/timeframe
experiments/reports/regime_bb_15m/2026 regime tables
experiments/reports/regime_2025_2026/2025 vs 2026 regime tables
experiments/reports/regime_bt_2025/, regime_bt_2026/gated vs ungated metrics

Code map

moduleresponsibility
data/sources/binance.py, data/build.pydownload + normalize
data/resample.pycanonical OHLCV resampling
data/validate.pydata-quality reporting
features/core.py, features/market.pyindicators and flow features
strategies/*breakout triggers
backtest/engine.py, backtest/metrics.pyVectorBT engine, metrics
analytics/excursions.pyreversion / excursion analysis
analytics/confluence.pyfilter evaluation, design/validate
analytics/regimes.pyregime classifier + gate
analytics/gating.pyregime-gated backtest

Tests

uv run pytest — 97 tests, including deterministic end-to-end, lookahead/causality, resampling, regime and gating tests.