ID: S003
Slug: vol-contraction-expansion-v1
Failed at: Stage 1 (Quick-screen)
Fail reason: magnitude
Date: 2026-05-29
What we tested
The textbook claim (associated with Toby Crabel's NR7 pattern and Larry Connors' work on compression): periods when a stock's recent trading range is unusually narrow tend to resolve into outsized moves. Mechanically, volatility is known to be mean-reverting at short horizons, so a stretch of low daily range should eventually "snap back" with a wider one. The signal doesn't predict direction — only magnitude. That makes it interesting for options strategies (long straddles benefit from large moves either way).
We measured a stock's recent daily range using the average true range (ATR) over 7 days, then compared it to the past year's distribution of 7-day ATRs for the same stock. Signal fires when current ATR sits below the 20th percentile of the past year's distribution — i.e., the stock is in the bottom fifth of its own recent volatility.
We then measured the absolute size of the 5-day and 10-day forward returns (direction-blind: a −3% move counts the same as +3%). The pre-set criterion: signal-day absolute returns needed to be 1.35× larger than a random baseline at the 5-day horizon, 1.25× larger at 10 days, with the effect getting stronger as compression got deeper.
What we found
Strategy failed on all magnitude-related criteria.
| Criterion | We needed | We got | |
|---|---|---|---|
| 5-day absolute return uplift | ≥ 1.35× baseline | 1.010× (basically no uplift) | ✗ |
| 10-day absolute return uplift | ≥ 1.25× baseline | 1.017× | ✗ |
| Effect grows monotonically with compression depth | yes | no — non-monotonic | ✗ |
| Number of signals | ≥ 800 | 25,352 | ✓ |
Compression-depth sweep (the deeper the compression, the larger the expansion we'd expect):
| Compression percentile | Signal count | Mean absolute 5-day return |
|---|---|---|
| Bottom 30% (mildly compressed) | 32,932 | 2.877% |
| Bottom 20% (our chosen threshold) | 25,352 | 2.896% |
| Bottom 10% (more compressed) | 16,471 | 2.919% |
| Bottom 5% (most compressed) | 10,868 | 2.878% |
The numbers barely move and they're non-monotonic — at the deepest compression level (bottom 5%) the effect actually drops back to the level of mildly-compressed signals. This is what "no effect" looks like in a sweep.
Why this matters / what surprised us
This was supposed to be the strongest setup in the batch. Vol-mean-reversion is one of the most robust facts in quantitative finance and is the foundation of multiple successful options strategies. We pre-registered a ~70% expectation of passing. The flat result is therefore the biggest surprise.
-
Wrong universe scale. The Crabel and Connors work came from 1990s markets with many smaller, less-followed names where genuinely "quiet" stretches were rare and diagnostic. In a 2026 mega-cap pool (AAPL, MSFT, JPM, etc.) a low-ATR week often just means "an unremarkable week in a stock that gets traded around the clock by algorithms" — not a coiled spring.
-
The gate measured the wrong thing. We compared signal-day absolute returns to a matched random baseline drawn from the same month and pool. Because both groups share the same market regime, market-wide volatility cancels out — which is correct for isolating the signal, but it also means we're asking "does compressed-ATR add edge above what calendar coincidence alone provides?" The honest answer in this universe: barely, if at all.
-
The literature's "NR7" is a pattern, not a percentile. Crabel's original signal is "today's range is the narrowest of the last 7 days" — a discrete bar-pattern. We tested a percentile-based version (in the bottom 20% of the past year's ATR distribution). These correlate but aren't equivalent; the pattern version captures genuinely unusual single-bar contraction.
What this doesn't tell us yet
- Small-cap behaviour might differ. Extending the test to Russell 2000-style names (with deeper Tiingo ingest) might reveal the effect there — that would be a separate setup.
- Pattern-based NR7 wasn't tested here. A different operationalisation (today's range < min of last 6 bars) could be pre-registered separately.
- Direction-aware variants weren't tested. The setup was explicitly direction-blind. A pattern that conditions compression on trend direction (compression in an uptrend → upward expansion) is a different setup.
What happens next
This specific operationalisation is closed. Lessons for future setups in this family:
- Magnitude-based setups need explicit statistical-significance gates too. Our pre-set criteria were all effect-size thresholds (ratios and monotonicity). A Welch p-value gate would have caught the "no effect" reading more crisply than three independent effect-size fails. We'll include p-value gates on all future magnitude setups.
- A small-cap version (
vol-compression-smallcap-v1) is on the follow-up list — to test whether the original NR7 literature result still holds in the kind of names where it was first documented.
For the specialist — methodology details (click to expand)
Setup (verbatim from spec)
Stocks whose 7-day average true range has compressed to below the 20th percentile of their own 1-year ATR distribution predict above-average absolute returns (in either direction) over the next 5-10 trading days in the liquid US equity universe over 2010-present, because realized volatility is mean-reverting at short horizons and periods of unusually compressed range tend to resolve into expansion.
Test setup
- Universe: SP500+NDX top-200 monthly point-in-time snapshot.
- Data: Tiingo Power EOD, 2010-01-04 → 2026-05-28, 1.98M bars.
- Signal:
ATR_7[t] < 20th percentile of ATR_7[t-252:t-1], dedupe one signal per ticker per 10 trading days. - True range:
max(high − low, |high − prev_close|, |low − prev_close|). - Forward measure:
|(close[t+H] − close[t]) / close[t]|for H=5 and H=10 (direction-agnostic absolute return). - Baseline: 5 matched random (ticker, date) per signal, from the same monthly eligible pool, with identical absolute-return measurement.
Pre-registered gate (all required)
ratio_5d ≥ 1.35 mean |signal_ret_5d| / mean |baseline_ret_5d| ≥ 1.35
ratio_10d ≥ 1.25 mean |signal_ret_10d| / mean |baseline_ret_10d| ≥ 1.25
monotonicity mean |ret| at percentile P is non-decreasing as P decreases
sample_size n ≥ 800 signals
Detailed numbers
| Group | Trades | Mean |return|_5d | Trades | Mean |return|_10d | |-------|--------|-------------------|--------|--------------------| | Signal | 25,334 | 2.896% | 25,324 | 4.216% | | Baseline | 126,623 | 2.868% | 126,554 | 4.147% | | Ratio | | 1.010 | | 1.017 |
Welch t-tests on |signal_ret| vs |baseline_ret|:
- p(5d) = 0.518 (no significance)
- p(10d) = 0.145 (no significance)
Dual-period absolute returns: - 2010-2017: n=12,360, mean 5d-abs 2.521% - 2018-2026: n=12,974, mean 5d-abs 3.253%
The half-period gap (h2 > h1) is driven by post-pandemic vol regimes, not by the compression signal — it appears equally in the baseline.
Operational note
The compression-depth sweep was implemented as four full re-runs of the signal generation pipeline, which made the wall-clock unusually long (944s). Future sweep-style analyses should compute the signal once and slice afterwards.
Artifacts
- Trades:
lab/postmortem/vol-contraction-expansion-v1/trades_5d.parquetandtrades_10d.parquet - Baselines:
baseline_5d.parquetandbaseline_10d.parquet - Histogram bins:
chart_data.jsonin same directory - Setup spec:
lab/setups/vol-contraction-expansion-v1.md - Pre-registered gate:
lab/setups/gates.md§vol-contraction-expansion-v1
Rewritten 2026-05-30 for broader accessibility. No claims, gates, or methodology changed — only presentation.