Implementation Scope

This captures a low-volatility regime intuition through realised-vol z-scores. It is not a complete volatility mean-reversion implementation with options, spreads, or explicit short-vol carry.

The Intuition

Volatility Mean Reversion is a meta-strategy: instead of trading the price directly, it trades on the state of volatility. The core idea is that realised volatility is itself mean-reverting — periods of unusually low volatility are followed by a return to normal levels, and periods of high volatility eventually subside. This strategy goes long on the asset when volatility is anomalously low, anticipating the regime of calm to persist slightly longer before normalising.

The volatility mean reversion observation is well-established in the empirical literature. GARCH models, introduced by Engle (1982), formalise the clustering of volatility: high-volatility periods cluster together, as do low-volatility periods. The half-life of volatility shocks in equity markets is typically 10–30 days. This clustering means that a z-score on realised volatility has predictive power for future volatility.

The rationale for going long when vol is low: during calm periods, the risk-reward for equity exposure improves. Market makers are more willing to provide liquidity, bid-ask spreads tighten, and the "volatility risk premium" (the gap between implied and realised vol) is typically positive — owning the asset earns a carry-like premium. The strategy is essentially a systematic version of "buy the dip in vol."

Key assumptions: (1) Realised volatility (computed from daily returns) is a good proxy for the volatility regime. (2) The short-window vol (21-day) reliably captures the current regime. (3) The long-window (252-day) mean and standard deviation are stable enough to serve as the baseline. In practice, the 252-day window blends multiple volatility regimes, which can bias the z-score.

The strategy's main risk is "short vol" exposure: low-volatility regimes can end abruptly with large market dislocations (the "volatility black swan"). In 2018's "Vol-mageddon" and March 2020, strategies that systematically went long during low-volatility periods suffered catastrophic losses in a matter of days. Position sizing must account for this tail risk — many practitioners cap position size and use stop-losses on vol-based signals.

The Math

Read this as a compact model summary: what the signal sees, what it ignores, and where fragility can creep in.

r(t)       = log(Close(t)/Close(t-1))
vol_s(t)   = std(r[t-n_short:t]) × sqrt(252)   [annualised]
vol_l_mu   = mean(vol_s[t-n_long:t])
vol_l_std  = std(vol_s[t-n_long:t])
z_vol(t)   = (vol_s(t) - vol_l_mu) / vol_l_std

Signal(t) = +1  if z_vol(t) < -threshold

Parameters

ParameterTypeDefaultDescription
short_window int 21 Short-term volatility estimation window (days)
long_window int 252 Long-term volatility estimation window (days)
threshold float 0.5 Std devs below long-run vol mean to trigger long

Source Code

def run(ticker: str, start: str, end: str, **params) -> dict:
    short_window = int(params.get("short_window", 21))
    long_window = int(params.get("long_window", 252))
    threshold = float(params.get("threshold", 0.5))
    df = fetch_ohlcv(ticker, start, end)

    log_ret = np.log(df["Close"] / df["Close"].shift(1))
    short_vol = log_ret.rolling(short_window).std() * np.sqrt(252)
    long_vol_mean = short_vol.rolling(long_window).mean()
    long_vol_std = short_vol.rolling(long_window).std()

    z = (short_vol - long_vol_mean) / long_vol_std.replace(0, np.nan)
    pos = pd.Series(0.0, index=df.index)
    pos[z < -threshold] = 1.0

    return run_backtest(df, pos, ticker=ticker, start=start, end=end,
                        strategy=METADATA["slug"],
                        params={"short_window": short_window, "long_window": long_window, "threshold": threshold})

Further Reading

  • Sinclair, E. (2013). Volatility Trading, 2nd ed. Wiley.
  • Gatheral, J. (2006). The Volatility Surface. Wiley.
  • Cont, R. (2001). Empirical Properties of Asset Returns. Quantitative Finance, 1(2), 223–236.

When It Works / When It Fails

Works
  • Realized vol clearly elevated above long-run average
  • Calm or recovering regimes after vol spike subsides
  • Instruments with demonstrated historical vol mean reversion
Fails
  • Sustained vol regime shifts — higher vol becomes the new norm
  • Instruments without historical vol mean-reversion tendency
  • Stressed-vol environments: exposure is fully zero here

Regime Fit

Bull or Transition / Calm vol
Full 1.0 long. Vol is low relative to history; bet on continued calm or further compression.
Bull or Transition / Normal vol
0.7–0.8. Modest exposure as vol is above calm but not yet elevated enough for a clear bet.
Bear / Calm or Normal vol
0.6–0.9. Even in bear regimes, calm vol periods allow positioning for further vol compression.
Any regime / Stressed vol
0.0 — fully flat. This is the inverted logic: the overlay cuts exposure exactly when Vol Breakout would be full.

Compared to Alternatives

vs Vol Breakout
Both use vol as core signal but take opposite bets. Vol Breakout goes long on expansion; Vol MR goes long when vol is elevated and expected to contract.
vs Bollinger
Bollinger bets on price mean reversion; Vol MR bets on volatility mean reversion. Same statistical bet applied to different series — price vs realized vol.
vs Supertrend
Supertrend uses vol to size a trend-following trailing stop; Vol MR bets directly on vol reversion as the primary trade thesis. Different applications of volatility data.
Run This Strategy →