DEV Community

Cover image for Volatility Relative-Value Trading: The Complete Guide
tomasz dobrowolski
tomasz dobrowolski

Posted on • Originally published at flashalpha.com

Volatility Relative-Value Trading: The Complete Guide

Originally published on the FlashAlpha Research blog.

What relative-value volatility trading is

A directional equity trader has a view on where the stock goes. A volatility relative-value trader has a view on how much it should cost to insure it, and on whether that cost is mispriced relative to history, relative to a model, or relative to another asset. The underlying price is not the primary variable: implied volatility is.

Relative-value vol trading exploits dislocations in the implied volatility surface: one tenor trading too rich versus another (calendar trades), the put wing too expensive versus fair value (skew trades), index implied correlation diverging from single-name vols (dispersion), or the market pricing future variance above what realised variance will deliver (variance or volatility risk premium). The common thread is that every trade is structural and model-referenced, not a directional bet on the S&P going up or down.

This matters because the risk profile is different. A well-constructed vol-arb trade is delta-hedged and, when also vega-hedged across legs, is primarily exposed to the shape of the surface rather than its level. That shape exposure (the relative cheapness or richness of one part of the surface versus another) is more persistent and mean-reverting than the level of implied vol itself. That is the edge.

The toolkit

SVI surfaces and arbitrage-free constraints

The Stochastic Volatility Inspired (SVI) parameterisation, due to Gatheral (2004), maps log-moneyness k to total implied variance w for a single expiry slice:

w(k) = a + b·[ ρ(k − m) + sqrt((k − m)² + σ²) ]
Enter fullscreen mode Exit fullscreen mode

where k = ln(K/F) is log-moneyness relative to the forward F, and the five parameters carry clear economic content:

  • a is the overall level of variance (vertical shift)
  • b is the angle of the smile wings (controls vol-of-vol)
  • ρ is put/call asymmetry (negative in equity markets due to the leverage effect)
  • m is the moneyness at which the smile is most symmetric
  • σ is the curvature of the ATM region

Five parameters describe a liquid equity smile. The real difficulty is not the fitting; it is ensuring the fitted surface is arbitrage-free. Two static arbitrage conditions must hold. No butterfly arbitrage means the risk-neutral density must be non-negative at every strike, which translates to a non-negative second derivative of total variance in log-moneyness. No calendar arbitrage means total variance must be non-decreasing across expiries at every moneyness. If either fails, you have a surface that implies free money, and any trade priced off it is wrong in an unbounded way. Arbitrage detection is the first deliverable to check, not an afterthought.

Variance swap replication and the var-swap strike

A variance swap pays the difference between realised variance and a fixed strike agreed at inception. The fair strike is the replication-theoretic value (Demeterfi et al. 1999):

K_var = (2/T) · [ ∫₀ᶠ P(K)/K² dK + ∫ᶠ^∞ C(K)/K² dK ]
Enter fullscreen mode Exit fullscreen mode

Because the integrand spans all strikes, you need a complete smile, which is exactly what the SVI fit provides. The numerical integral over the smile gives a clean, arb-consistent fair value for realised variance that goes beyond ATM implied vol. The convexity adjustment (fair vol minus ATM IV) measures how much the wings contribute; when the put wing is rich, the fair var-swap vol sits above ATM IV, and selling vol via variance swaps captures that richness.

Variance risk premium versus volatility risk premium

This is one of the most conflated concepts in practice. The variance risk premium (VaRP) is the expected profit from selling a variance swap and delta-hedging: it operates on squared vol. The volatility risk premium (VolRP) is the P&L from selling a vega-neutral straddle and continuously delta-hedging: it operates on vol itself.

VaRP = K_var − E[σ_R²]      VolRP = σ_IV,ATM − E[σ_R]
Enter fullscreen mode Exit fullscreen mode

These diverge because of the nonlinear relationship between variance and vol. In the tails, variance grows quadratically while vol grows linearly, so fat-tail regimes inflate VaRP far more than VolRP. A strategy that looks like it is selling VaRP may actually be mostly selling VolRP with a highly convex residual tail exposure, and vice versa. Knowing which you are trading, and sizing accordingly, is critical.

Skew and term structure

The surface has two primary shape dimensions beyond the ATM level. Skew is the slope of implied vol across strikes at a fixed expiry; in equity markets the put wing is systematically richer than the call wing. Term structure is the slope of ATM implied vol across expiries: contango (front below back) is normal, backwardation occurs around events that concentrate near-term uncertainty. Calendar trades buy cheap tenors and sell rich ones.

Spot-vol correlation is a further shape measure. When spot falls, vol typically rises (negative spot-vol correlation in equities). A surface with very steep downside skew reflects a high-magnitude negative spot-vol correlation priced into the smile.

Dispersion and implied correlation

Implied correlation is extracted by comparing index implied vol to single-name implied vols:

ρ_implied = (σ_index² − Σ wᵢ²σᵢ²) / (2 Σ_{i<j} wᵢ wⱼ σᵢ σⱼ)
Enter fullscreen mode Exit fullscreen mode

Implied correlation is typically higher than realised because the index put skew is structurally bid: investors pay up to hedge the index as a unit rather than buying individual-name puts. A dispersion trade sells index vol and buys single-name vols (or vice versa), monetising the spread. When implied correlation exceeds realised, the index is rich relative to constituents: sell the index, buy the names.

Reading the data

SVI parameters: what the numbers tell you

import requests

resp = requests.get(
    "https://lab.flashalpha.com/v1/adv_volatility/SPX",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
d = resp.json()

for s in d["svi_parameters"]:
    print(
        f"{s['expiry']} ({s['days_to_expiry']}d): "
        f"a={s['a']:.5f}  b={s['b']:.5f}  "
        f"rho={s['rho']:.4f}  m={s['m']:.4f}  sigma={s['sigma']:.4f}  "
        f"ATM IV={s['atm_iv']:.2f}%  arb_free={s.get('arb_free', True)}"
    )
Enter fullscreen mode Exit fullscreen mode

Interpretation per parameter:

  • rho more negative than −0.7: extremely steep put skew. Often indicates event risk or structural demand for downside protection. Check whether it is a single-name earnings effect or a broad index regime.
  • b above 0.15: wide wings, large moves priced at both extremes. High b with a normal rho means symmetric wing richness, which is unusual and may indicate a vol-of-vol dislocation.
  • sigma near zero: a nearly V-shaped smile with minimal ATM curvature. Numerically fragile; arb violations are more likely.
  • cross-slice rho flattening: near-term slices are usually steeper than long-dated ones. If the long end suddenly steepens to match, the long end is pricing a structural change.

Arbitrage flags: non-negotiable checks

flags = d.get("arbitrage_flags", [])
if flags:
    for f in flags:
        print(f"[{f['type'].upper()}] {f['expiry']} moneyness={f.get('moneyness','n/a')}: {f['description']}")
else:
    print("Surface is arbitrage-free")
Enter fullscreen mode Exit fullscreen mode

A butterfly violation means the risk-neutral density goes negative at that moneyness, so any price referencing that region is undefined. A calendar violation means a calendar spread there is a free lunch. Do not trade off a surface with active flags.

Variance surface and var-swap strikes

for vs in d["variance_swap_fair_values"]:
    K_var     = vs["K_var"]            # fair variance strike (annualised)
    fair_vol  = vs["fair_vol"]         # sqrt(K_var), vol units
    convexity = fair_vol - vs["atm_iv"]
    print(
        f"{vs['expiry']}: fair_vol={fair_vol:.2f}%  "
        f"ATM={vs['atm_iv']:.2f}%  convexity_adj={convexity:+.2f}pp"
    )
Enter fullscreen mode Exit fullscreen mode

The convexity adjustment directly measures how much the wings cost relative to ATM. Above +1.5pp for SPX is historically elevated, indicating the market is paying a premium for tail coverage beyond what ATM vol implies. Track the time series and you have a clean signal for when variance swaps are cheap or rich relative to straddles.

Dispersion and spot-vol correlation

disp = requests.get(
    "https://lab.flashalpha.com/v1/dispersion",
    params={
        "index": "SPX",
        "symbols": "AAPL,MSFT,NVDA,AMZN,GOOGL",
        "weights": "0.07,0.07,0.06,0.05,0.05",
        "horizon_days": 20,
    },
    headers={"X-Api-Key": "YOUR_API_KEY"}
).json()

print(f"Implied correlation:  {disp['implied_correlation']:.4f}")
print(f"Realised correlation: {disp['realized_correlation']:.4f}")
print(f"Corr premium:         {disp['correlation_premium']:+.4f}")
Enter fullscreen mode Exit fullscreen mode

The trades

Calendar / term-structure trades

A calendar spread buys total variance at one expiry and sells it at another. Compute the ATM IV ratio between front and back via /v1/volatility/skew-term. If the ratio is in the top decile of its history, the front is rich: sell front variance, buy back variance. Size to vega-neutrality across the two legs, not notional-neutrality.

ts = requests.get(
    "https://lab.flashalpha.com/v1/volatility/skew-term/SPX",
    headers={"X-Api-Key": "YOUR_API_KEY"}
).json()

front = ts["term_structure"][0]
back  = ts["term_structure"][-1]
print(f"Front/back ratio: {front['atm_iv'] / back['atm_iv']:.4f}")
print(f"Regime: {ts['term_structure_regime']}")
Enter fullscreen mode Exit fullscreen mode

Event distortions. The front ratio inflates mechanically before FOMC, CPI, and earnings because the near-term expiry prices the event premium. A top-decile ratio during a FOMC week is not a calendar opportunity; it is the options market correctly pricing the event. Check the term-structure endpoint's event flags first.

Skew / risk-reversal trades

A risk reversal sells an OTM put and buys an OTM call at the same delta, delta-hedged: a pure bet on the skew level.

RR25 = σ_IV(Δput = −0.25) − σ_IV(Δcall = +0.25)
Enter fullscreen mode Exit fullscreen mode

A 25-delta RR in the bottom decile (puts cheap relative to calls, rare in equities) is a long-skew opportunity. A top-decile RR (puts extremely rich) is a short-skew opportunity, but timing matters enormously because equity skew is structurally bid and can stay rich for months.

Dispersion

The canonical dispersion trade sells index variance and buys single-name variance in proportion to index weights. The P&L is driven by the off-diagonal cross-terms: each constituent pair contributes its weighted vol product weighted by the correlation gap. When implied correlation exceeds realised, selling the index and buying the names earns positive carry.

Regime risk. Correlation is regime-switching. In a broad risk-off event (March 2020, the 2022 rate shock), realised correlation spikes above 0.9 and the dispersion trade loses catastrophically because single-name vol cannot offset the index move. Sizing requires explicit correlation-scenario stress testing, not just historical mean-reversion assumptions.

Variance vs vol RP trades

vrp = requests.get(
    "https://lab.flashalpha.com/v1/vrp/SPX",
    headers={"X-Api-Key": "YOUR_API_KEY"}
).json()

print(f"VRP (variance basis): {vrp['variance_risk_premium']:.2f}pp")
print(f"VolRP (vol basis):    {vrp['volatility_risk_premium']:.2f}pp")
# VRP z >> VolRP z: wings rich, convexity elevated
# VolRP z >> VRP z: wings cheap, ATM richness dominates
Enter fullscreen mode Exit fullscreen mode

When the convexity adjustment widens, the wings are expensive relative to ATM; a ratio spread long ATM and short the wings monetises it. When it compresses, butterfly buyers and long vol-of-vol positions benefit.

Risk and sizing

Every vol-RV trade should be vega-hedged at the trade level: the book earns from surface-shape dislocations, not from the level of vol. Net vega across all legs should sit close to zero, rebalanced at least daily. Gamma neutrality is harder to hold simultaneously, since in a calendar the short front leg has far higher gamma than the long back leg, so you will carry net gamma. For a multi-name dispersion book, report risk in vega-weighted terms per name, normalising by vol-of-vol (proxy via b from the SVI fit), because 10,000 vega in NVDA carries more vol-of-vol risk than 10,000 vega in MSFT.

The residual risk in a delta- and vega-neutral book is correlation risk, which is fat-tailed and regime-switching. Size as a fraction of the risk budget assuming realised correlation can spike 0.3 to 0.5 above its long-run mean in a single macro shock, and confirm the resulting P&L stays inside your drawdown limit.

The kinks and common mistakes

1. Trading off a non-arbitrage-free surface. A butterfly failure implies negative probability density. The symptom is subtle: a calendar that should pay positive carry bleeds theta because the fit is locally inconsistent. Check arb_free per slice before placing any trade.

2. Conflating VaRP with VolRP. A high VolRP z-score says ATM straddles are rich. A high VaRP z-score says the wings are rich too. Selling a straddle when VaRP is rich but VolRP is flat earns no premium; the wing richness lives in the variance-swap convexity adjustment. The correct trade there is a ratio spread, not an outright straddle sale.

3. Liquidity filtering of SVI fits. Stale, zero-OI, or wide-market strikes distort the fit. Rich/cheap signals in the far wings are often artefacts of liquidity gaps, not real dislocations. Cross-check wing signals against raw chain liquidity.

4. Dispersion correlation regime shifts. The implied-exceeds-realised argument is valid in low-correlation regimes. During a macro sell-off, realised correlation jumps toward 1.0 and the trade loses on both legs at once. Require hard stop-losses on realised correlation.

5. Term-structure event distortions. A calendar that looks rich on the ATM ratio alone may be fully justified by an event in the front expiry. Check event flags on both legs before interpreting front-month richness as a calendar opportunity.

6. Realised vol estimator choice. Close-to-close is biased by overnight gaps and noisy for short windows. Yang-Zhang uses overnight, open-to-close, and close-to-close returns simultaneously for lower variance. The choice can shift apparent richness by 0.5 to 2pp, enough to flip a weak z-score signal.

Worked example: an SPX surface snapshot

Representative figures, illustrative rather than live:

Metric Front (21d) Back (49d) Read
ATM IV 17.4% 15.8% Ratio 1.10, mild backwardation, front modestly rich
25Δ RR −4.2pp −3.1pp Front put wing steeper, within normal range (~60th pctile)
Var-swap fair vol 19.1% 17.2% Convexity +1.7pp and +1.4pp above ATM, wings elevated
Butterfly (25Δ) 1.8pp 1.5pp Wing curvature above ATM, consistent with convexity
Arb flags None None Trade-ready on both slices

The front convexity adjustment of +1.7pp is elevated versus the historical mean near 1.0pp for SPX, so variance swaps are expensive relative to straddles. A ratio spread (long ATM, short wings) or an outright var-swap sell is more attractive than a simple straddle sale. The skew signal is neutral at the 60th percentile, so no standalone RR trade is justified.

import requests, numpy as np

adv = requests.get("https://lab.flashalpha.com/v1/adv_volatility/SPX",
                   headers={"X-Api-Key": "YOUR_API_KEY"}).json()
hist = requests.get("https://lab.flashalpha.com/v1/surface/history/SPX?lookback_days=90",
                    headers={"X-Api-Key": "YOUR_API_KEY"}).json()
skew = requests.get("https://lab.flashalpha.com/v1/volatility/skew-term/SPX",
                    headers={"X-Api-Key": "YOUR_API_KEY"}).json()

rr_today = skew["term_structure"][0]["risk_reversal_25d"]
rr_hist  = [s["risk_reversal_25d"] for s in hist["skew_history"]]
rr_pctile = np.mean(np.array(rr_hist) <= rr_today) * 100
front_arb_free = adv["svi_parameters"][0].get("arb_free", True)

if rr_pctile > 85 and front_arb_free:
    print("PUT WING RICH: short skew / short RR candidate")
elif rr_pctile < 15 and front_arb_free:
    print("PUT WING CHEAP: long skew / long RR candidate")
else:
    print(f"No skew signal: RR at {rr_pctile:.0f}th percentile")
Enter fullscreen mode Exit fullscreen mode

Endpoints for vol-arb

Endpoint Delivers Tier
/v1/adv_volatility/{t} SVI params, variance surface, arb flags, var-swap fair values Alpha
/v1/surface/{t} Full IV surface grid (historical replay available) Alpha
/v1/surface/svi/{t} Per-bucket IV with rolling mean and z-score Alpha
/v1/vrp/{t} Variance RP, vol RP, z-scores Alpha
/v1/dispersion?index=...&symbols=...&weights=... Implied/realised correlation, premium Alpha
/v1/volatility/skew-term/{t} ATM IV, 25Δ RR, butterfly, regime, event flags Growth
/v1/volatility/spot-vol-correlation/{t} 30d, 90d, 6m spot-vol correlation Growth
/v1/volatility/{t} ATM IV, Yang-Zhang and close-to-close realised vol, IV rank Growth

For a Claude-based research or signal-generation agent, the vol-arb MCP connector is at https://lab.flashalpha.com/mcp-oauth/volarb, exposing the advanced volatility, VRP, surface, dispersion, and term-structure tools as Claude-callable functions.

Conclusion

The edge in relative-value volatility is exposure to the shape of the surface, not its level, and shape is more persistent and mean-reverting than level. Capturing it cleanly depends on an arbitrage-free fit, a clear separation between variance and volatility risk premium, and explicit correlation-scenario sizing for anything dispersion-shaped. Get the surface right first; the trades follow from it.


Originally published on FlashAlpha. FlashAlpha provides SVI surfaces, var-swap strikes, VRP decomposition, dispersion, and term structure as structured JSON for 6,000+ US equities and ETFs. Free API key, no credit card.

Top comments (0)