Rejected thesis
Volatility Contraction Pattern (Minervini)
Thesis (rejected as a stand-alone breakout): A sequence of three
progressively narrower 20-day sub-windows ending in a final
contraction ≤ 8 %, on monotonically contracting volume, followed by a
close > 60-day high on volume ≥ 1.5× — should select the cleanest
pre-breakout setups (distinct from coil_breakout's flat-base and
flag_pennant's pole-and-channel).
Code: research/vcp.py
Report: research/vcp_report.json (n=1,213)
| Horizon | event mean | edge vs ctrl |
|---|---|---|
| 5d | n/a | -0.03 % |
| 10d | n/a | -0.39 % |
| 20d | n/a | -0.46 % |
| 40d | n/a | -1.04 % |
No bucket rescued it — deep-drawdown (dd ≤ -15%, n=142) is the worst at -1.4 % / 40d, OOS-2020+ is -2.0 % / 40d.
Why it failed: As a stand-alone breakout-day signal the geometry buys too late — the sequence of contractions ends with a high-volume thrust day, but the day-after dynamics dominate the forward window. See the Stage-2 entry below: gating VCP by a Weinstein Stage-2 trend flips the edge positive at 20d (+1.25 %).
Verdict: Reject the unconditional VCP. Keep it as a candidate event filter to be stacked under a trend gate; do not use raw.
| Sample | 1,213 |
|---|---|
| Validator | research/vcp.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