Rejected thesis
Turnaround-volume (deep drawdown + sustained volume rise)
Thesis (CONFIRMED): On a name that has lost meaningful value over the last 12 months (ret_252d ≤ -30 % and still near the lows), a SUSTAINED multi-day volume rise (recent 20d mean vs preceding 70d mean ≥ V) is an early sign of institutional accumulation, with positive forward returns over 60-250 days vs same-drawdown controls where no volume-rise fires.
Distinctness vs nearby:
- drawdown_bounce triggers on a SINGLE negative-day with 5d/60d
volume spike — looking for THE bounce day, not the early lead-in.
- bounce scanner cohort requires realised vol ≥ 1.0 (panic
mode) and recent crash >25 %. Here we want STABILISATION.
- accumulation_validate required above-200DMA — opposite filter.
Code: research/turnaround_volume.py
Report: research/turnaround_volume_report.json
(n=11,069 base events, n=3,778 drawdown-matched controls)
Controls are drawdown-matched: same-name days where ret_252d ≤ -30 % AND dist_from_252d_high ≤ -30 % but no volume-rise — apples-to-apples "already beaten down, no accumulation footprint" comparison.
Cell sweep — BOTH axes scale monotonically:
| Cell | n | 20d | 60d | 120d | 250d | hit@60d |
|---|---|---|---|---|---|---|
| D>=30% V>=1.3x | 11069 | -0.62 % | +3.20 % | +0.64 % | +11.63 % | 0.67 |
| D>=30% V>=1.5x | 5839 | -0.03 % | +5.44 % | +3.19 % | +19.38 % | 0.68 |
| D>=30% V>=2.0x | 1831 | +1.46 % | +10.03 % | +8.00 % | +31.30 % | 0.71 |
| D>=50% V>=1.3x | 2895 | +2.63 % | +10.11 % | +8.56 % | +33.88 % | 0.69 |
| D>=50% V>=1.5x | 1659 | +3.76 % | +13.59 % | +12.26 % | +44.34 % | 0.70 |
| D>=50% V>=2.0x | 591 | +5.50 % | +19.29 % | +17.76 % | +59.16% | 0.73 |
The strictest cell (lost ≥50 % AND 2x+ volume rise) gives +59 % edge over 250 days at hit-rate 0.73 on n=591. Both depth and volume-rise compound; this is rare among the cohorts in this file.
Strata (base = D>=30 % V>=1.3x, n=11,069):
| Stratum | n | 20d | 60d | 250d | hit@60d |
|---|---|---|---|---|---|
| base all | 11069 | -0.62 % | +3.20 % | +11.63 % | 0.67 |
| D <= -50% | 2939 | +2.54 % | +9.83 % | +33.32 % | 0.68 |
| V >= 2.0x | 1831 | +1.46 % | +10.03 % | +31.30 % | 0.71 |
| green10 >= 6 (price confirm) | 4385 | +6.95% | +10.56% | +18.93 % | 0.78 |
| green10 <= 3 (no confirm) | 1578 | -14.75 % | -12.30 % | -12.04 % | 0.42 |
| stab < 1.0 (vol compressing) | 2430 | -0.64 % | -2.85 % | +2.54 % | 0.60 |
| stab >= 1.0 (still volatile) | 8639 | -0.62 % | +4.90 % | +14.18 % | 0.69 |
| OOS 2020+ | 7257 | +0.00 % | +6.16 % | +24.87 % | 0.68 |
Three findings:
-
Both axes scale. Depth × volume-rise are independent filters that compound. The strictest cell (D>=50 % V>=2x) gives among the strongest long-horizon edges in the repo. Per-trade n=591 is comfortable.
-
Day-after green-day count is the timing accelerator. Without it the short-horizon edge is roughly zero. With ≥6 of the next 10 closes green: 20d edge jumps to +6.95 %, hit-rate 0.78. The mirror cohort (≤3 greens) bleeds -15 %/20d. Same day-after- confirmation principle that survived
burst_continuationanddormant_awakening— but here it's not strictly required for the long-horizon (250d) edge, only for the short. -
Volatility compression is a NEGATIVE signal, opposite to the coil / VCP intuition. Names quietly going still in deep drawdown are dead-stock-walking (delisting / distress); the still-volatile subset carries the edge. Counterintuitive but clean and well-powered (compressing n=2,430, still-vol n=8,639).
-
OOS 2020+ is strong (+24.9 %/250d at n=7,257) — not the decay we saw on dormant-awakening. The signal works in modern data. Pre-2020 in-sample was +6.0 %/250d, so OOS is actually stronger than in-sample. That's unusual and worth flagging: post-2020 may be a uniquely turnaround-friendly regime (post- pandemic recovery + AI re-ratings of beaten-down names).
Verdict: Real, strong, OOS-robust signal. Worth productizing as a portfolio-layer overlay (long-horizon — not a short-term scanner play; 60-250d holding). The strictest cell (D>=50 % V>=2x) is the high-conviction subset.
Compared to drawdown_bounce: at the same dd≤-30 % gate, drawdown_bounce gave +6.4 %/250d (per the entry in this file). Turnaround-volume's same dd cell gives +11.6 %/250d — the sustained-volume filter adds ~+5 pp by selecting names where accumulation is already happening, vs catching the single panic-low day. The two are complementary: drawdown_bounce times entry, turnaround_volume confirms thesis.
Day-after-confirmation meta-finding extended again: across
burst_continuation, dormant_awakening at all windows, and now
turnaround_volume, the pattern is consistent — day-after price
follow-through is the cleanest selector for short-horizon timing.
On turnaround_volume specifically, it boosts 20d edge from -0.6 %
(unconditional) to +7 % (green10 ≥ 6). It's not load-bearing for
the multi-month edge here, but it is for the multi-week edge.
| Sample | 11,069 |
|---|---|
| Validator | research/turnaround_volume.py |
| Verdict | Rejected |
Every result here is reproducible from the script named above. Reports are in the repository.
- Volatility squeeze
- Pre-FOMC drift
- Uptrend pullback
- Momentum continuation
- Industry-relative momentum (at 4-week lookback)
- Earnings-reaction reversal (anti-PEAD)
- Beat-persistence pre-earnings drift
- Sector ETF mean-reversion
- 52-week-high breakout
- Volume accumulation (above-200DMA +...
- Cross-sector momentum
- Analyst-upgrade cluster