← Lab
S002

Vol-of-vol filter on classic breakouts

vol-of-vol-filter-v1
failed Stage 1 (Quick-screen) 2026-05-29
Share: Twitter / X LinkedIn
-21.7%-10.6%+0.6%+11.8%+23.0% 2,7120 20-day forward return on all qualifying breakouts (kept + dropped) Return
Mean +0.67%
20-day forward return on all qualifying breakouts (kept + dropped) · n=35,570

ID: S002 Slug: vol-of-vol-filter-v1 Failed at: Stage 1 (Quick-screen) Fail reason: magnitude Date: 2026-05-29

What we tested

The intuition was about "regime stability." When a stock's short-term volatility has been steady for several months — not jumping around — it's plausibly in a calm institutional regime where real buying and selling are visible in the price action. Breakouts in that environment should be "real" — a new high actually means something. In contrast, stocks whose volatility is itself volatile (today calm, tomorrow chaotic) are probably reacting to news shocks or single-stock flow events; breakouts there are more likely to revert.

To measure this, we computed each stock's recent volatility (over 20 trading days), then measured the volatility of that volatility over the past 60 days. Stocks below the monthly median of this metric got tagged as "calm" (the kept group); above-median stocks got tagged "jumpy" (the dropped group).

We then ran a simple 60-day-high breakout signal across the full universe and split the resulting trades into the two buckets. The pre-set criterion: the calm-bucket breakouts needed to beat the unfiltered baseline by at least 5 percentage points in hit rate and 0.5 percentage points in mean return.

What we found

Strategy failed — and in the opposite direction of the setup.

Group Trades Mean 20-day return Hit rate
All breakouts (unfiltered) 35,570 +0.669% 56.1%
Calm-volatility (kept) 19,014 +0.527% 56.3%
Jumpy-volatility (dropped) 16,556 +0.833% 55.8%
Criterion We needed We got
Hit-rate uplift (calm vs all) ≥ +5pp +0.2pp
Mean-return uplift (calm vs all) ≥ +0.5pp −0.14pp
Filter retains enough signals ≥ 50% kept 53.5%
Statistical significance Welch p < 0.05 p = 0.0015 ⚠️ wrong direction partial
Effect in both 2010-2017 and 2018-2026 halves ≥ +3pp uplift in each h1 −0.1pp, h2 +0.5pp
Minimum sample sizes unfiltered ≥ 200, kept ≥ 100 35,570 / 19,014

The Welch test technically passed (p = 0.0015 is highly significant), but the difference is in the wrong direction: jumpy-volatility breakouts outperform calm-volatility ones. The setup as we wrote it predicted the opposite.

Why this matters / what surprised us

The filter inverts the predicted effect, and the inversion is real. With 35,000 trades the result has tight statistical confidence. This isn't "no effect" — it's "effect in the opposite direction." That's a meaningful finding even though the setup is dead.

  1. Jumpy volatility = regime shift in progress. A stock whose 20-day volatility has been bouncing around is likely transitioning into a new pattern — think NVDA in early 2023, MSTR in 2024, the Mag-7 names during their major re-ratings. Breakouts during these transitions ride genuine new institutional flow. Calm-volatility stocks, by contrast, are mature large-caps (KO, JNJ, IBM types) whose breakouts are slow drifts that tend to revert.

  2. Selection effect from the universe. In the top 500 by trading volume of the SP500+NDX pool, calm-volatility concentrates in defensive mega-caps — exactly the names where breakouts don't have momentum follow-through because there's no underlying directional flow. The jumpy bucket captures faster-rotation names (tech, semiconductors, EV) where breakouts get extended.

Gate-design lesson: the Welch p-value criterion we wrote down just asks "is the difference statistically significant" without specifying direction. A more honest formulation would have been "signal direction must match the setup AND p < 0.05." We'll write future filter-style gates with direction-aware significance tests.

What this doesn't tell us yet

  1. The inverse setup — "jumpy-vol breakouts outperform" — is suggested by the data but cannot be claimed from this same run. To test it cleanly we'd need to pre-register the inverse direction and re-run on either fresh data or strictly held-out data.
  2. We tested using a classic 60-day-high breakout proxy, not the actual Mechaniq Breakout strategy. The production Breakout has its own scoring + filters that may already capture some of what the vol-of-vol filter was meant to add.
  3. We tested on a large-cap universe. Small-cap behaviour may differ — that's a separate setup.

What happens next

This specific filter is closed. Two things go on the follow-up list:

  1. Future setup regime-transition-trend-v1 — test the inverted version (long breakouts on rising-vol-of-vol tickers) as a regime-shift trend-following signal. Will be pre-registered with a direction-aware Welch gate.
  2. Lesson applied to future gate-design — direction-aware significance tests on all filter-style setups, so a wrong-sign-significant result is correctly logged as a fail rather than a Welch-passes-but-direction-wrong ambiguity.
For the specialist — methodology details (click to expand)

Setup (verbatim from spec)

Tickers with vol_of_vol_60d < monthly median in the top-500 pool predict higher 20-day forward hit-rate and mean-return on classic-60d-high breakout signals in the SP500+NDX top-500 universe over 2010-present, because vol-of-vol is a proxy for regime stability and breakouts in stable regimes are less often false than breakouts in volatile-vol regimes.

Test setup

  • Universe: monthly point-in-time top-500 by trailing 60-day dollar volume within the SP500+NDX 516-pool (effectively the full pool — 500 of 516 candidates per month).
  • Data: Tiingo Power EOD, 2010-01-04 → 2026-05-28, 1.98M bars.
  • Vol-of-vol computation (per ticker, day t): 1. daily_return[t] = (close[t] − close[t-1]) / close[t-1] 2. realised_vol_20d[t] = std(daily_return[t-20:t-1]) 3. vol_of_vol_60d[t] = std(realised_vol_20d[t-60:t-1]) All windows trailing via .shift(1).rolling(...) — current bar never appears in its own window.
  • Breakout proxy: close[t] > max(close[t-60:t-1]), dedupe one signal per ticker per 20 trading days.
  • Filter split: per month M, compute the median vol_of_vol_60d across all top-500-eligible tickers on M-start. Each breakout signal in month M is classified kept (vov < median) or dropped (vov ≥ median).
  • Forward measure: (close[t+21] − open[t+1]) / open[t+1] — enter next-day open, exit 20 trading days later at the close.

Pre-registered gate (all required)

hit_rate_uplift          kept_hit_rate − all_hit_rate ≥ +5pp
mean_return_uplift       kept_mean − all_mean         ≥ +0.5pp
signal_retention         |kept| / |unfiltered|        ≥ 0.50
welch_significance       p(kept vs dropped) < 0.05
dual_period_uplift       hit-rate-uplift ≥ +3pp in both 2010-2017 AND 2018-2026
sample_size              |unfiltered| ≥ 200, |kept| ≥ 100

Detailed numbers

  • Unfiltered: n=35,570, mean +0.669%, hit 56.1%
  • Kept (vov < median): n=19,014, mean +0.527%, hit 56.3%
  • Dropped (vov ≥ median): n=16,556, mean +0.833%, hit 55.8%
  • Welch t-test (kept vs dropped): p = 0.0015 (wrong sign — dropped outperformed kept)
  • Half-1 (2010-2017): unfiltered hit 58.1%, kept hit 58.0% → uplift −0.1pp
  • Half-2 (2018-2026): unfiltered hit 54.1%, kept hit 54.6% → uplift +0.5pp
  • Top concentrated ticker: HUT at 0.5% of signals — concentration was not the issue

Artifacts

  • Trades with filter decision: lab/postmortem/vol-of-vol-filter-v1/trades_with_filter.parquet (35,570 rows: ticker, signal_date, ret, vov_60d, vov_median_that_month, kept)
  • Histogram bins: chart_data.json in same directory
  • Setup spec: lab/setups/vol-of-vol-filter-v1.md
  • Pre-registered gate: lab/setups/gates.md §vol-of-vol-filter-v1

Rewritten 2026-05-30 for broader accessibility. No claims, gates, or methodology changed — only presentation.

← Oldervol-of-vol-filter-v1 Newer →vol-contraction-expansion-v1

Mechaniq provides information, not investment advice. We do not execute trades. Past results are no guarantee for future performance. You are solely responsible for your trading decisions.

Lab · Methodology · Greeks Lab · About · FAQ · Glossary · Privacy · Terms · mechaniq.trade © 2026

07 Jul 2026, 07:10