bollinger
Bollinger Bands
Mean-reversion off the bands. Bullish: price crosses back above the lower Bollinger Band from below (oversold bounce). Bearish: price crosses back below the upper Bollinger Band from above (overbought reversal). Bands = SMA ± N standard deviations.
Signal family
Mean reversion — Oscillator-based signals that fire at overbought or oversold extremes — typically fade the prevailing move.
Parameters
| Name | Description | Default | Range |
|---|---|---|---|
| period | SMA period | 20 | 5–100 |
| ub_factor | Upper band std dev factor | 2.0 | 0.5–4.0 |
| lb_factor | Lower band std dev factor | 2.0 | 0.5–4.0 |
Historical context
2,481,722 triggers on 24,141 tickers, 1988-03-31 → 2026-05-01. Universe: global — all covered exchanges (mcap ≥ $100,000,000, price ≥ $1). Long-only convention: BUY at open T+1, hold the horizon, compare to S&P 500 Equal Weight over the same window.
Methodology footnotes
Benchmarks shown in the detail tables: spxew (S&P 500 Equal Weight — primary, median-stock view, avoids the 2020+ megacap-concentration distortion), spx (S&P 500 cap-weighted, distorted post-2020), msci (MSCI World USD). Per-stock regime tags: trending = ADX(14) ≥ 25, high vol = 20d realized annualized vol ≥ 20%. 1d return = intraday T+1 open→close; 20d = open T+1 to close T+20.
At a glance — alpha vs S&P 500 Equal Weight, global universe
Holding-period sensitivity. Bullish columns: positive = signal worked (long the trigger beat the index). Bearish columns: negative = signal worked (the flagged stock underperformed).
| Horizon | Bullish α | Bearish α |
|---|---|---|
| 5-day | +0.12% | -0.06% |
| 20-day | +0.09% | +0.17% |
| 60-day | +0.30% | +0.58% |
| 1-year | +1.66% | +3.51% |
Bearish: worse than random (p=0.995).
Where does BOLLINGER actually fire?
The bucket distribution often reveals what the signal really is, regardless of its textbook label. Heavy concentration in "non-trending + high vol" = it's mostly a chop-market event. Heavy in "trending + low vol" = it picks up the smooth grinds. Read the chart before the alpha numbers — context shapes everything that follows.
Does it work in every regime?
Trigger alpha split by the host stock's own regime on the trigger date — trending or ranging, high-vol or low-vol. The 20d alpha you'd actually capture if you took the trade. Bars matching your direction's "right" sign (positive for bullish, negative for bearish) = the signal worked in that regime; opposite sign = avoid it there. A signal with one strong-positive bar and three flat ones isn't a "20d alpha" signal — it's a "20d alpha when the stock is X" signal.
Does it work in every era?
A multi-year average can hide major instability. The sample splits into three windows: 2015–2019 (pre-COVID), 2020–2022 (pandemic + 2022 bear), and 2023+ (post-ZIRP + AI megacap rally). All three matching your direction's "right" sign = the signal is durable. One era doing all the work = a regime-specific edge that may not repeat. The bigger the variance across eras, the smaller the position you should run.
↑ Bullish triggers
| Bench | Metric | 1d | 5d | 20d | 60d | 252d |
|---|---|---|---|---|---|---|
| spxew | Stock % | -0.00% | +0.33% | +1.37% | +3.41% | +12.78% |
| Bench % | -0.00% | +0.16% | +1.22% | +3.13% | +10.90% | |
| Alpha % | -0.03% | +0.12% | +0.09% | +0.30% | +1.66% | |
| Median alpha | -0.09% | -0.12% | -0.72% | -1.72% | -6.58% | |
| Hit rate (α>0) | 47.9% | 48.7% | 46.3% | 45.1% | 41.7% | |
| p (naive) | <0.001 | <0.001 | <0.001 | <0.001 | <0.001 | |
| p (HAC) | <0.001 | <0.001 | <0.001 | <0.001 | <0.001 | |
| N | 1,102,436 | 1,068,209 | 1,055,380 | 1,026,908 | 939,635 | |
| spx | Stock % | -0.00% | +0.33% | +1.37% | +3.41% | +12.78% |
| Bench % | +0.00% | +0.23% | +1.51% | +3.67% | +14.73% | |
| Alpha % | -0.03% | +0.06% | -0.17% | -0.25% | -1.92% | |
| Median alpha | -0.07% | -0.17% | -0.99% | -2.32% | -10.32% | |
| Hit rate (α>0) | 48.2% | 48.2% | 45.0% | 43.6% | 37.9% | |
| p (naive) | <0.001 | <0.001 | <0.001 | <0.001 | <0.001 | |
| p (HAC) | <0.001 | <0.001 | <0.001 | <0.001 | <0.001 | |
| N | 1,108,791 | 1,075,952 | 1,071,270 | 1,037,449 | 955,796 | |
| msci | Stock % | -0.00% | +0.33% | +1.37% | +3.41% | +12.78% |
| Bench % | +0.03% | +0.24% | +1.32% | +3.29% | +12.31% | |
| Alpha % | -0.04% | +0.06% | -0.03% | +0.13% | -0.05% | |
| Median alpha | -0.10% | -0.19% | -0.86% | -1.98% | -8.23% | |
| Hit rate (α>0) | 47.5% | 47.9% | 45.6% | 44.4% | 40.0% | |
| p (naive) | <0.001 | <0.001 | 0.0128 | <0.001 | 0.3138 | |
| p (HAC) | <0.001 | <0.001 | 0.0368 | <0.001 | 0.7438 | |
| N | 1,100,296 | 1,063,976 | 1,054,584 | 1,028,583 | 938,807 |
Permutation null detail — all horizons × each benchmark
| Horizon | Bench | Observed lift | Null mean | Null 95% CI | pperm |
|---|---|---|---|---|---|
| 1d | spxew | +0.11% | +0.08% | [+0.07%, +0.08%] | 0.005 |
| 1d | spx | +0.08% | +0.09% | [+0.08%, +0.09%] | 0.557 |
| 1d | msci | +0.12% | +0.09% | [+0.08%, +0.09%] | 0.005 |
| 5d | spxew | +0.51% | +0.34% | [+0.33%, +0.36%] | 0.005 |
| 5d | spx | +0.48% | +0.36% | [+0.35%, +0.37%] | 0.005 |
| 5d | msci | +0.48% | +0.37% | [+0.35%, +0.38%] | 0.005 |
| 20d | spxew | +1.20% | +1.12% | [+1.10%, +1.14%] | 0.005 |
| 20d | spx | +1.17% | +1.15% | [+1.13%, +1.17%] | 0.030 |
| 20d | msci | +1.21% | +1.17% | [+1.15%, +1.19%] | 0.005 |
| 60d | spxew | +2.67% | +2.41% | [+2.36%, +2.44%] | 0.005 |
| 60d | spx | +2.85% | +2.47% | [+2.43%, +2.51%] | 0.005 |
| 60d | msci | +2.82% | +2.49% | [+2.45%, +2.53%] | 0.005 |
| 252d | spxew | +5.42% | +4.76% | [+4.68%, +4.84%] | 0.005 |
| 252d | spx | +5.85% | +5.10% | [+5.01%, +5.17%] | 0.005 |
| 252d | msci | +5.52% | +5.05% | [+4.97%, +5.12%] | 0.005 |
Example triggers on US large-caps (2023+, mcap ≥ $30B)
Six recent bullish BOLLINGER triggers on US mega-caps. Top three: the signal's best outcomes. Bottom three: the worst. Extreme outliers (|α| > 25%) excluded. The three best and three worst are still tail outcomes by construction — read them as the range, not the typical result.
Strongest outcomes (what BOLLINGER looks like when it works)
Weakest outcomes (what BOLLINGER looks like when it fails)
Stock-regime quadrants (2×2 per-stock, 20d alpha detail table)
| Quadrant | N | Stock % (spxew) | Bench % (spxew) | Alpha % (spxew) | p (HAC) | Stock % (spx) | Bench % (spx) | Alpha % (spx) | p (HAC) | Stock % (msci) | Bench % (msci) | Alpha % (msci) | p (HAC) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Trending + Low vol Clean directional grind, low whipsaw | 90,593 | +0.19% | +0.91% | -0.67% | <0.001 | +0.19% | +1.16% | -0.96% | <0.001 | +0.19% | +1.00% | -0.80% | <0.001 |
| Trending + High vol Crisis selloff or parabolic rally | 401,207 | +2.26% | +1.39% | +0.75% | <0.001 | +2.26% | +1.79% | +0.41% | <0.001 | +2.26% | +1.52% | +0.63% | <0.001 |
| Non-trending + Low vol Quiet chop, summer doldrums | 140,021 | +0.20% | +0.92% | -0.68% | <0.001 | +0.20% | +1.17% | -0.95% | <0.001 | +0.20% | +1.05% | -0.82% | <0.001 |
| Non-trending + High vol Classical "whipsaw zone" for momentum | 509,367 | +1.21% | +1.30% | -0.07% | 0.0001 | +1.21% | +1.52% | -0.27% | <0.001 | +1.21% | +1.36% | -0.17% | <0.001 |
Sub-period breakdown table (20d alpha)
| Period | N | Alpha % (spxew) | p (HAC) | Alpha % (spx) | p (HAC) | Alpha % (msci) | p (HAC) |
|---|---|---|---|---|---|---|---|
| 2015-2019 2015-01-01 → 2020-01-01 | 347,704 | -0.12% | <0.001 | -0.19% | <0.001 | +0.02% | 0.3053 |
| 2020-2022 2020-01-01 → 2023-01-01 | 349,798 | -0.04% | 0.0657 | -0.02% | 0.5113 | +0.24% | <0.001 |
| 2023-2026 2023-01-01 → 2099-01-01 | 443,216 | +0.36% | <0.001 | -0.29% | <0.001 | -0.28% | <0.001 |
↓ Bearish triggers negative alpha = signal was right (stock underperformed market)
| Bench | Metric | 1d | 5d | 20d | 60d | 252d |
|---|---|---|---|---|---|---|
| spxew | Stock % | -0.01% | +0.13% | +0.81% | +2.63% | +13.25% |
| Bench % | +0.03% | +0.19% | +0.69% | +2.09% | +9.90% | |
| Alpha % | -0.04% | -0.06% | +0.17% | +0.58% | +3.51% | |
| Median alpha | -0.11% | -0.36% | -0.85% | -1.93% | -5.82% | |
| Hit rate (α>0) | 47.3% | 46.3% | 45.9% | 44.7% | 42.8% | |
| p (naive) | <0.001 | <0.001 | <0.001 | <0.001 | <0.001 | |
| p (HAC) | <0.001 | <0.001 | <0.001 | <0.001 | <0.001 | |
| N | 1,287,604 | 1,239,226 | 1,233,197 | 1,205,768 | 1,053,050 | |
| spx | Stock % | -0.01% | +0.13% | +0.81% | +2.63% | +13.25% |
| Bench % | +0.02% | +0.20% | +0.89% | +2.92% | +13.64% | |
| Alpha % | -0.03% | -0.07% | -0.04% | -0.27% | -0.41% | |
| Median alpha | -0.10% | -0.40% | -1.10% | -2.84% | -9.85% | |
| Hit rate (α>0) | 47.3% | 45.9% | 44.7% | 42.4% | 38.5% | |
| p (naive) | <0.001 | <0.001 | <0.001 | <0.001 | <0.001 | |
| p (HAC) | <0.001 | <0.001 | 0.0025 | <0.001 | 0.0398 | |
| N | 1,299,164 | 1,259,132 | 1,244,496 | 1,221,418 | 1,065,817 | |
| msci | Stock % | -0.01% | +0.13% | +0.81% | +2.63% | +13.25% |
| Bench % | +0.04% | +0.19% | +0.78% | +2.50% | +11.17% | |
| Alpha % | -0.04% | -0.05% | +0.08% | +0.17% | +2.03% | |
| Median alpha | -0.12% | -0.38% | -0.98% | -2.41% | -7.43% | |
| Hit rate (α>0) | 47.0% | 46.1% | 45.2% | 43.4% | 41.2% | |
| p (naive) | <0.001 | <0.001 | <0.001 | <0.001 | <0.001 | |
| p (HAC) | <0.001 | <0.001 | <0.001 | <0.001 | <0.001 | |
| N | 1,290,758 | 1,249,550 | 1,241,787 | 1,212,349 | 1,060,619 |
Permutation null detail — all horizons × each benchmark
| Horizon | Bench | Observed lift | Null mean | Null 95% CI | pperm |
|---|---|---|---|---|---|
| 1d | spxew | +0.09% | +0.08% | [+0.07%, +0.08%] | 1.000 |
| 1d | spx | +0.09% | +0.09% | [+0.08%, +0.09%] | 1.000 |
| 1d | msci | +0.10% | +0.09% | [+0.08%, +0.10%] | 1.000 |
| 5d | spxew | +0.31% | +0.34% | [+0.33%, +0.36%] | 0.005 |
| 5d | spx | +0.34% | +0.36% | [+0.35%, +0.37%] | 0.005 |
| 5d | msci | +0.35% | +0.36% | [+0.35%, +0.37%] | 0.015 |
| 20d | spxew | +1.14% | +1.11% | [+1.09%, +1.13%] | 0.995 |
| 20d | spx | +1.17% | +1.14% | [+1.12%, +1.16%] | 0.990 |
| 20d | msci | +1.18% | +1.15% | [+1.13%, +1.18%] | 0.970 |
| 60d | spxew | +2.33% | +2.41% | [+2.37%, +2.45%] | 0.005 |
| 60d | spx | +2.23% | +2.48% | [+2.44%, +2.52%] | 0.005 |
| 60d | msci | +2.26% | +2.50% | [+2.46%, +2.54%] | 0.005 |
| 252d | spxew | +4.43% | +4.59% | [+4.51%, +4.65%] | 0.005 |
| 252d | spx | +4.65% | +4.94% | [+4.87%, +5.01%] | 0.005 |
| 252d | msci | +4.72% | +4.89% | [+4.82%, +4.95%] | 0.005 |
Example triggers on US large-caps (2023+, mcap ≥ $30B)
Six recent bearish BOLLINGER triggers on US mega-caps. Top three: the signal's best outcomes. Bottom three: the worst. Extreme outliers (|α| > 25%) excluded. The three best and three worst are still tail outcomes by construction — read them as the range, not the typical result.
Strongest outcomes (what BOLLINGER looks like when it works)
Weakest outcomes (what BOLLINGER looks like when it fails)
Stock-regime quadrants (2×2 per-stock, 20d alpha detail table)
| Quadrant | N | Stock % (spxew) | Bench % (spxew) | Alpha % (spxew) | p (HAC) | Stock % (spx) | Bench % (spx) | Alpha % (spx) | p (HAC) | Stock % (msci) | Bench % (msci) | Alpha % (msci) | p (HAC) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Trending + Low vol Clean directional grind, low whipsaw | 116,618 | +0.59% | +0.35% | +0.28% | <0.001 | +0.59% | +0.64% | -0.04% | 0.1562 | +0.59% | +0.50% | +0.12% | <0.001 |
| Trending + High vol Crisis selloff or parabolic rally | 578,778 | +0.97% | +0.72% | +0.33% | <0.001 | +0.97% | +0.94% | +0.09% | 0.0004 | +0.97% | +0.81% | +0.22% | <0.001 |
| Non-trending + Low vol Quiet chop, summer doldrums | 151,671 | +0.53% | +0.42% | +0.11% | <0.001 | +0.53% | +0.68% | -0.16% | <0.001 | +0.53% | +0.54% | -0.01% | 0.6075 |
| Non-trending + High vol Classical "whipsaw zone" for momentum | 493,454 | +0.83% | +0.82% | +0.02% | 0.2677 | +0.83% | +0.96% | -0.11% | <0.001 | +0.83% | +0.88% | -0.01% | 0.6020 |
Sub-period breakdown table (20d alpha)
| Period | N | Alpha % (spxew) | p (HAC) | Alpha % (spx) | p (HAC) | Alpha % (msci) | p (HAC) |
|---|---|---|---|---|---|---|---|
| 2015-2019 2015-01-01 → 2020-01-01 | 400,529 | -0.37% | <0.001 | -0.65% | <0.001 | -0.43% | <0.001 |
| 2020-2022 2020-01-01 → 2023-01-01 | 395,813 | +0.06% | 0.0329 | +0.28% | <0.001 | +0.40% | <0.001 |
| 2023-2026 2023-01-01 → 2099-01-01 | 543,666 | +0.67% | <0.001 | +0.19% | <0.001 | +0.25% | <0.001 |
Methodology and caveats
How to read. Entry at open of T+1 (one trading day after the signal fires on close of T). 20d = open T+1 to close T+20. Alpha = stock return − benchmark return over the same window (Convention A, single-sided, textbook). For bullish triggers, POSITIVE alpha = signal was right. For bearish triggers, NEGATIVE alpha = signal was right (stock underperformed market). No sign-flipping; the direction of the bet determines what "good" looks like. Per-stock regime is each stock's own ADX(14) and RV(20) at the trigger date — not market-wide state.
Three p-values, three robustness tests. (a) p_naive: scipy one-sample t-test on winsorized alphas. Optimistic because overlapping 20d windows on the same ticker inflate effective N. (b) p_hac: Newey-West HAC with lag = horizon — corrects for the overlap and is the academic-finance standard. (c) p_perm: one-sided fraction of 200 random-date null iterations falling in the “signal was right” tail (mean ≥ observed for bullish; mean ≤ observed for bearish). Tests whether the signal beats random date selection at all. A signal that clears all three (pnaive, phac, pperm all < 0.05) has real information; a signal that fails pperm has not beaten random timing whatever the t-test says — and because the test is one-sided, a pperm up at its 1.000 ceiling is not "no edge" but inverted edge: every random draw served the claimed direction better than the trigger dates did.
Caveats. (i) Universe reflects today's active tickers; delisted losers pruned → survivorship bias. (ii) Mcap ≥ $100M filter uses today's snapshot, not point-in-time — mild lookahead on which stocks enter the sample, not on returns. (iii) Means and p-values use winsorized alphas (1/99 percentile) to prevent data errors from dominating. Medians and hit rates use raw data. (iv) Zero transaction costs assumed. Realistic bid-ask + commissions remove 20–40bps from 20d alpha on US large-caps, more on small-cap. Sub-20bps alpha is noise in practice. (v) Past performance does not predict future results.
How to use this
1 · When to reach for this signal
Statistically real but thin at 20 days. Bullish 20d alpha is +0.09% and beats random , but sits below the ~20bps cost floor from the caveats — screening context, not a standalone edge. Bearish 20d alpha is +0.17% — worse than random : firing on random dates would have done better. Fires are screening context inside a composite (section 4), not entries.
These verdicts are 20-day holds vs S&P 500 Equal Weight. Longer horizons can differ in either direction — check the permutation detail tables below before extrapolating.
2 · When it works — the setups that drive it
- Best bullish setup: Trending + High vol — alpha +0.75% / 20d on 401,207 historical triggers.
- Least-bad bearish cell: Non-trending + High vol — alpha +0.02% / 20d on 493,454 triggers — still wrong-signed; no bearish cell produced negative alpha.
- Best era for bullish: 2023-2026 — alpha +0.36% / 20d on 443,216 triggers.
- Best era for bearish: 2015-2019 — alpha -0.37% / 20d on 400,529 triggers.
3 · When it fails — common false positives
- Weakest bullish cell: Non-trending + Low vol — alpha -0.68% / 20d on 140,021 triggers.
- Weakest bearish cell: Trending + High vol — alpha +0.33% / 20d on 578,778 triggers.
- Worst era for bullish: 2015-2019 — alpha -0.12% / 20d on 347,704 triggers.
- Worst era for bearish: 2023-2026 — alpha +0.67% / 20d on 543,666 triggers.
Signal-specific failure patterns
4 · Pairing inside a screen
The statements below describe how this signal relates to others by construction — which indicator family it belongs to, and where same-family redundancy might reduce the independence of evidence inside a Daily Report. These are taxonomic classifications drawn from standard technical-analysis texts; they are not pairing backtests. Measured pair results — same-day co-fires put through the pair backtest — follow under “Measured pairings” below.
Volatility-envelope construction
Bollinger Bands are a volatility envelope: a 20-period simple moving average ± 2 standard deviations of price (Bollinger, Bollinger on Bollinger Bands, 2001). This construction is distinct from momentum oscillators (RSI, Stochastics, Williams %R, CCI) and from moving-average crossover signals, so pairing Bollinger with any one of them does not produce same-family redundancy.
Measured pairings — Bonferroni survivors
Beyond the literature pairings above, these are the same-day co-fire combinations involving Bollinger Bands that cleared the pair backtest's Bonferroni cut on the full 2016–2026 sample (549 pairs × 5 horizons = 2,745 hypotheses), on universes filtered to ADV ≥ $5M, price ≥ $5 and market cap ≥ $100M. That cut is two-sided: it asks only whether the co-fire's α is reliably different from zero, in either direction, so a pair can survive by reliably underperforming — 6 of the 28 rows below do exactly that (negative full-sample α). The same run holds out 2023+: the Test columns are that held-out window, printed for every row with enough held-out co-fires to measure, so a survivor that did not repeat out of sample is visible rather than hidden. All α figures here are for holding the stock long after the co-fire — no shorting assumed, and no sign flip for bearish legs. So positive α means the co-fire was followed by outperformance and negative α by underperformance, whichever way either leg points — a bearish leg does not flip the reading. Survivors are rare by design — absence of a pair here means it did not clear the cut, not that it was untested. Ranked by held-out (2023+) α. Historical tendencies, not recommendations.
US (NYSE / NASDAQ / AMEX)
| Pair (same-day co-fire, long) | Full α | Test α (2023+) | Test N | p_perm test |
|---|---|---|---|---|
| bollinger bullish + stochastics bullish | +0.43% | +0.47% | 13,468 | 0.002 |
| bollinger bullish + new_20d_low bearish | +0.73% | +0.46% | 4,001 | 0.010 |
| bollinger bullish + weekly_change bearish | +0.97% | +0.45% | 6,480 | 0.010 |
| bollinger bullish + williams_r bullish | +0.24% | +0.28% | 18,595 | 0.002 |
| bollinger bearish + double_bottom_breakdown bearish | -3.89% | — | — | — |
5 of this universe's 18 surviving pairs involve this signal · α vs ^SPXEW.
Europe — 3 surviving pairs
| Pair (same-day co-fire, long) | Full α | Test α (2023+) | Test N | p_perm test |
|---|---|---|---|---|
| bollinger bearish + williams_r bearish | +0.40% | +0.46% | 6,855 | 0.002 |
| bollinger bullish + stochastics bullish | +0.46% | +0.24% | 3,957 | 0.066 |
| bollinger bullish + williams_r bullish | +0.28% | +0.18% | 5,876 | 0.086 |
3 of this universe's 20 surviving pairs involve this signal · α vs ^STOXX.
Hong Kong — 4 surviving pairs
| Pair (same-day co-fire, long) | Full α | Test α (2023+) | Test N | p_perm test |
|---|---|---|---|---|
| bollinger bearish + rsi bearish | +1.41% | +1.92% | 1,280 | 0.002 |
| bollinger bearish + stochastics bearish | +1.13% | +1.76% | 1,904 | 0.002 |
| bollinger bearish + williams_r bearish | +0.82% | +1.34% | 3,008 | 0.002 |
| bollinger bearish + weekly_change bullish | +1.23% | +1.32% | 1,479 | 0.002 |
4 of this universe's 23 surviving pairs involve this signal · α vs ^HSI.
China A-shares — 16 surviving pairs
| Pair (same-day co-fire, long) | Full α | Test α (2023+) | Test N | p_perm test |
|---|---|---|---|---|
| bollinger bullish + weekly_change bearish | +4.57% | +6.33% | 12,186 | 0.002 |
| bollinger bullish + volume_breakout bullish | +3.08% | +5.99% | 2,943 | 0.002 |
| bollinger bullish + ma_crossover bearish | +1.64% | +3.62% | 428 | 0.002 |
| bollinger bullish + fresh_52w_low bearish | +1.51% | +2.23% | 681 | 0.002 |
| bollinger bearish + new_20d_low bearish | -2.26% | +2.00% | 147 | 0.032 |
| bollinger bullish + williams_r bullish | +1.71% | +1.77% | 34,977 | 0.002 |
| bollinger bullish + stochastics bullish | +1.55% | +1.44% | 29,183 | 0.002 |
| bollinger bullish + rsi bullish | +1.96% | +1.38% | 13,489 | 0.002 |
| bollinger bullish + cci bullish | +1.24% | +1.38% | 4,902 | 0.002 |
| bearish_trend_breakout bullish + bollinger bearish | +1.54% | +0.90% | 672 | 0.052 |
| bollinger bearish + stochastics bearish | +0.25% | +0.88% | 27,307 | 0.002 |
| bollinger bearish + volume_breakout bearish | -0.87% | +0.05% | 18,879 | 0.593 |
| bollinger bullish + new_20d_low bearish | +0.58% | +0.02% | 7,647 | 0.836 |
| bollinger bearish + hh_hl_structure bullish | -3.87% | -3.56% | 87 | 0.002 |
| bollinger bearish + bullish_trend_breakdown bearish | -6.12% | — | — | — |
| bollinger bearish + fresh_52w_low bearish | -7.10% | — | — | — |
16 of this universe's 138 surviving pairs involve this signal · α vs 83188.HK.
China A-share survivor α runs large but skews toward small-caps, where trading costs and thin liquidity claim a large share of any measured edge — screening context, not a capturable spread.
“—” in the test columns means the held-out 2023+ sample fell below the 20-observation minimum this run requires before it computes any statistic, so no out-of-sample figure exists for that pair — not that it never co-fired again. Those pairs rank last.
What would likely rescue this signal
This block calls out the data or conditions that could turn a technically weak signal into a usable one in a composite screen. Based on signal mechanics and the observed failure patterns above; individual combinations are not yet backtested.
- Volume-filter the bullish side — A lower-band break on heavy volume looks like capitulation; on light volume it is drift. Requiring elevated volume plus a follow-through close is one way to separate completed reversals from continuing declines. Inside a Daily Report this can be approximated today by AND-composing the Bollinger tile with the volume breakout signal (volume above a multiple of its 20-day average on a directional close).
- Regime-gate the bullish side — Mean-reversion entries off the lower band assume a market where dips get bought broadly. A gate requiring healthy breadth (most stocks above their 50-day average) or the benchmark trading some distance below its all-time high is a testable way to carve out the environments where the bounce thesis holds. Check the sub-period breakdown above for whether the current data motivates the gate before relying on it.
- Let the table set the bearish hold — If the current tables show the bearish effect growing from the 20d to the 60d column, short-horizon exits leave most of the move on the table and a time-stop beats a profit target — hold the window absent structural invalidation, such as the stock reclaiming and closing back above its upper band. If the columns are flat or reversed, shorten. Re-check after each backtest refresh.
See also Why technical-only signals don't survive on their own for the broader argument.
5 · Before you act — a 5-point checklist
- Normal trading day? Rule out earnings (within ±3 days), ex-dividend, or known corporate-action dates — the signal is almost certainly reading noise, not momentum, in those windows.
- Where is price vs its own 50 / 200 DMA? A mean-reversion signal firing against the long-term trend (e.g. oversold in a clean uptrend) is much more reliable than one firing with it.
- What's the sector breadth doing? An isolated signal in a broadly down-trending sector is a lower-confidence setup than one firing with the rest of its peer group.
- Is ADV20 enough for your size? If the trigger is on a $500M name and you want to move $1M notional, you're the tape. Consider adv20d ≥ 5% of your intended position.
- What invalidates you? Define a price level (for longs: a close below the trigger-day low; for shorts: close above the trigger-day high) and honor it. The backtest alpha is an average; any one trade can be at either tail.
Execution notes
Entry convention in the tables above is next-day open (open T+1). Parameters are the 20-period / 2-standard-deviation defaults from Bollinger's own work; shorter windows or tighter multiples fire more often on smaller excursions and are noisier by construction. Read direction from the live data: under the single-sided long convention used here, a bearish fire 'works' when post-trigger alpha is negative — the stock lags the benchmark after firing. If a side clears the random-date permutation null in the current tables, it can serve as a screen tile in that direction; otherwise treat its fires as context rather than a trade prompt. Historical tendency, not a recommendation.