failed_double_bottom
Failed Double Bottom Breakdown
Bullish reversal: price broke below support (double bottom breakdown) but then rises back above the support level. Bears are trapped. Failure threshold normalized by daily volatility.
Signal family
Pattern — Formal chart-pattern detectors (double tops / bottoms, failed breakouts, HH/HL structure).
Parameters
| Name | Description | Default | Range |
|---|---|---|---|
| peak_order | Peak detection window | 15 | 5–25 |
| tolerance_zscore | Tolerance (z-scores of daily vol) | 1.5 | 0.5–3.0 |
| failure_window | Max days for failure after breakdown | 60 | 20–120 |
Historical context
77,180 triggers on 20,144 tickers, 1993-01-29 → 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 α |
|---|---|
| 5-day | -0.32% |
| 20-day | -0.34% |
| 60-day | -0.59% |
| 1-year | +0.85% |
Sign flip across horizons. Bullish raw alpha moves from -0.32% (5d) to +0.85% (1y). Check the permutation rows for those horizons before reading the longer-hold number as edge — raw alpha alone does not distinguish signal timing from universe drift.
Failed Double Bottom Breakdown is a single-direction signal — only the bullish side is meaningful.
Where does FAILED_DOUBLE_BOTTOM 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.06% | -0.09% | +0.69% | +2.04% | +12.26% |
| Bench % | +0.04% | +0.23% | +0.98% | +2.56% | +10.90% | |
| Alpha % | -0.12% | -0.32% | -0.34% | -0.59% | +0.85% | |
| Median alpha | -0.17% | -0.55% | -1.37% | -2.85% | -7.73% | |
| Hit rate (α>0) | 46.6% | 44.9% | 43.9% | 42.5% | 40.7% | |
| p (naive) | <0.001 | <0.001 | <0.001 | <0.001 | <0.001 | |
| p (HAC) | <0.001 | <0.001 | <0.001 | <0.001 | 0.0701 | |
| N | 74,461 | 71,265 | 70,149 | 68,334 | 62,433 | |
| spx | Stock % | -0.06% | -0.09% | +0.69% | +2.04% | +12.26% |
| Bench % | +0.03% | +0.31% | +1.21% | +3.34% | +14.74% | |
| Alpha % | -0.11% | -0.40% | -0.53% | -1.36% | -2.47% | |
| Median alpha | -0.15% | -0.66% | -1.53% | -3.50% | -11.32% | |
| Hit rate (α>0) | 46.6% | 44.1% | 43.2% | 40.9% | 37.1% | |
| 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 | 75,016 | 72,384 | 71,522 | 69,310 | 64,153 | |
| msci | Stock % | -0.06% | -0.09% | +0.69% | +2.04% | +12.26% |
| Bench % | +0.06% | +0.28% | +1.00% | +2.84% | +12.12% | |
| Alpha % | -0.12% | -0.38% | -0.33% | -0.82% | -0.61% | |
| Median alpha | -0.20% | -0.65% | -1.36% | -3.04% | -9.17% | |
| Hit rate (α>0) | 45.8% | 44.2% | 43.8% | 42.1% | 39.0% | |
| p (naive) | <0.001 | <0.001 | <0.001 | <0.001 | 0.0025 | |
| p (HAC) | <0.001 | <0.001 | <0.001 | <0.001 | 0.1939 | |
| N | 74,445 | 71,544 | 70,580 | 68,957 | 62,640 |
Permutation null detail — all horizons × each benchmark
| Horizon | Bench | Observed lift | Null mean | Null 95% CI | pperm |
|---|---|---|---|---|---|
| 1d | spxew | +0.03% | +0.08% | [+0.07%, +0.10%] | 1.000 |
| 1d | spx | +0.02% | +0.09% | [+0.08%, +0.11%] | 1.000 |
| 1d | msci | +0.04% | +0.10% | [+0.08%, +0.11%] | 1.000 |
| 5d | spxew | +0.11% | +0.37% | [+0.33%, +0.42%] | 1.000 |
| 5d | spx | +0.07% | +0.39% | [+0.34%, +0.44%] | 1.000 |
| 5d | msci | +0.08% | +0.39% | [+0.35%, +0.44%] | 1.000 |
| 20d | spxew | +0.86% | +1.22% | [+1.12%, +1.30%] | 1.000 |
| 20d | spx | +0.89% | +1.25% | [+1.14%, +1.33%] | 1.000 |
| 20d | msci | +0.98% | +1.26% | [+1.16%, +1.35%] | 1.000 |
| 60d | spxew | +1.89% | +2.62% | [+2.46%, +2.77%] | 1.000 |
| 60d | spx | +1.86% | +2.69% | [+2.54%, +2.83%] | 1.000 |
| 60d | msci | +1.96% | +2.70% | [+2.56%, +2.86%] | 1.000 |
| 252d | spxew | +5.15% | +5.25% | [+5.02%, +5.49%] | 0.756 |
| 252d | spx | +5.67% | +5.59% | [+5.35%, +5.86%] | 0.264 |
| 252d | msci | +5.38% | +5.50% | [+5.28%, +5.76%] | 0.836 |
Example triggers on US large-caps (2023+, mcap ≥ $30B)
Six recent bullish FAILED_DOUBLE_BOTTOM 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 FAILED_DOUBLE_BOTTOM looks like when it works)
Weakest outcomes (what FAILED_DOUBLE_BOTTOM 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 | 2,212 | -0.24% | +0.33% | -0.54% | 0.0007 | -0.24% | +0.59% | -0.78% | <0.001 | -0.24% | +0.44% | -0.65% | <0.001 |
| Trending + High vol Crisis selloff or parabolic rally | 31,904 | +0.80% | +1.18% | -0.49% | <0.001 | +0.80% | +1.45% | -0.70% | <0.001 | +0.80% | +1.12% | -0.42% | <0.001 |
| Non-trending + Low vol Quiet chop, summer doldrums | 4,710 | +0.19% | +0.38% | -0.20% | 0.0749 | +0.19% | +0.52% | -0.34% | 0.0027 | +0.19% | +0.41% | -0.22% | 0.0486 |
| Non-trending + High vol Classical "whipsaw zone" for momentum | 38,354 | +0.71% | +0.88% | -0.22% | 0.0013 | +0.71% | +1.14% | -0.40% | <0.001 | +0.71% | +0.95% | -0.24% | 0.0004 |
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 | 20,632 | -0.99% | <0.001 | -1.07% | <0.001 | -0.87% | <0.001 |
| 2020-2022 2020-01-01 → 2023-01-01 | 25,424 | +0.30% | 0.0032 | +0.37% | 0.0002 | +0.66% | <0.001 |
| 2023-2026 2023-01-01 → 2099-01-01 | 31,100 | -0.48% | <0.001 | -0.95% | <0.001 | -0.81% | <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
Not a standalone entry trigger at 20 days. Bullish 20d alpha is -0.34% — worse than random : firing on random dates would have done better. This signal fires bullish-only — there is no bearish variant. 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
- Least-bad bullish cell: Non-trending + Low vol — alpha -0.20% / 20d on 4,710 triggers — still wrong-signed; no bullish cell produced positive alpha.
- Best era for bullish: 2020-2022 — alpha +0.30% / 20d on 25,424 triggers.
3 · When it fails — common false positives
- Weakest bullish cell: Trending + Low vol — alpha -0.54% / 20d on 2,212 triggers.
- Worst era for bullish: 2015-2019 — alpha -0.99% / 20d on 20,632 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.
Sequential with completed pattern
Failed double bottom and double-bottom breakdown are two stages of the same underlying structure: the breakdown signal fires when price closes below the shared support by the breakdown margin; the failed version fires when that breakdown is negated — price closes back above the support within the failure window (Edwards & Magee, Technical Analysis of Stock Trends, 11th ed. 2018; Bulkowski, Encyclopedia of Chart Patterns, 3rd ed. 2021). They are sequential rather than concurrent — one signal replacing the other as the setup evolves, so seeing both on the same chart is one piece of evidence, not two.
Measured pairings — Bonferroni survivors
Beyond the literature pairings above, these are the same-day co-fire combinations involving Failed Double Bottom Breakdown 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 — every row below happens to be positive on the full sample, but that is not what the test asked. 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.
China A-shares
| Pair (same-day co-fire, long) | Full α | Test α (2023+) | Test N | p_perm test |
|---|---|---|---|---|
| failed_double_bottom bullish + weekly_change bearish | +9.65% | +10.09% | 73 | 0.002 |
| failed_double_bottom bullish + ma_crossover bearish | +4.44% | +5.28% | 38 | 0.054 |
| failed_double_bottom bullish + vwap_cross bullish | +1.31% | +2.14% | 1,368 | 0.002 |
| failed_double_bottom bullish + hh_hl_streak bullish | +1.85% | +1.89% | 644 | 0.002 |
| failed_double_bottom bullish + macd bullish | +1.42% | +1.82% | 756 | 0.002 |
5 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.
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.
- Require a fundamental anchor — A failed double bottom in a name with improving fundamentals is a structurally different bet than a bare pattern completion. The fundamentals filter on Daily Reports (live) can restrict triggers to names clearing profitability or valuation thresholds, separating recoveries with a real anchor from purely technical short-cover bounces.
- Check the shortest horizons first — If a trapped-bears squeeze carries any edge, it should show in the shortest horizon columns and fade from there — the mechanical bounce plays out in days, not months. A profile that decays or flips between the 1-5d and 20d+ columns in the live tables is consistent with a squeeze fading and the underlying weakness reasserting.
- Use as the failure diagnostic of another pattern — Even when it is not an entry trigger, the signal has diagnostic value: it marks the exact moment a bearish breakdown thesis is invalidated. For anyone positioned short on the double-bottom breakdown, the failed version is the mechanical exit bell — and for docs purposes it is a clean illustration of why classical pattern completions need out-of-sample verification.
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? Pattern signals carry their own structural context; check that the implied support/resistance levels have historical relevance, not just the most-recent 3-month range.
- 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
Read tradability off the live tables, not the textbook: if the bullish side beats the random-date null in the current at-a-glance table, failed double bottoms can serve as a long-side candidate screen; if it does not, treat fires as context on names already under coverage. Any squeeze edge is mechanically front-loaded, so weigh the short-horizon columns before the 60-day ones. Triggers are computed on closing prices; the earliest realistic entry is the next session's open. Historical tendency, not a recommendation.