Vanna & Charm: The Greeks That Move Markets
Vanna and charm explained: the second-order Greeks behind vol-compression rallies and expiration-week drift, with live VEX and CHEX data.
Vanna and charm explained: the second-order Greeks behind vol-compression rallies and expiration-week drift, with live VEX and CHEX data.
If you have followed dealer positioning analysis, you already know gamma exposure (GEX). GEX tells you whether dealers will stabilize or amplify price moves. It is a powerful tool, but it only answers one question: what happens when price moves?
Markets do not just move in price. They also move in volatility and time. Implied volatility expands and contracts. The clock ticks toward expiration every second. Both of these forces change dealer delta - and dealers must hedge those changes just as aggressively as they hedge gamma.
The Greeks that capture these forces are vanna and charm. They are second-order derivatives, which sounds academic until you realize they routinely generate billions of dollars in mechanical hedging flow. Understanding them is the difference between watching the market move and understanding why it moved.
Vanna is the sensitivity of an option's delta to changes in implied volatility. Equivalently, it is the sensitivity of vega to changes in the underlying price. Mathematically, it is the mixed second partial derivative of the option price with respect to both spot price and volatility.
In plain language: when implied volatility changes, option deltas shift. Vanna tells you the direction and magnitude of that shift. A positive vanna means delta increases when IV rises. A negative vanna means delta decreases when IV rises.
For a standard call option, vanna is positive when the option is out-of-the-money and negative when it is deep in-the-money. Put options exhibit the opposite pattern. The magnitude peaks for options that are slightly out-of-the-money - exactly where the most open interest tends to concentrate.
Vanna is the Greek that connects the volatility market to the equity market. When IV changes, vanna forces dealers to adjust their stock hedges - creating directional flows that have nothing to do with fundamental news or price action. These flows are mechanical, predictable, and often the dominant force after events like FOMC, CPI, or earnings.
Figure: The vanna feedback loop. When implied volatility drops, dealer delta hedges shift, forcing mechanical stock purchases that push prices higher - which further suppresses volatility.
Most of the time, dealers are net short options (customers are net buyers of protection). This means dealers carry positive aggregate vanna exposure. The implications are profound.
Sign convention matters. The direction of vanna-driven flow depends on whether dealers are net short or net long options at each strike, and whether the options are calls or puts. FlashAlpha's VEX tool handles the sign convention for you - positive VEX means the strike benefits from vol compression (bullish), negative VEX means it benefits from vol expansion (bearish).
The practical result is that when IV drops, the aggregate vanna effect creates buying pressure. Dealers must purchase shares to rebalance their hedges. This mechanical buying is the engine behind the "vol-compression rally" - the steady grind higher that follows FOMC announcements, earnings IV crushes, and VIX mean-reversion events.
Why vol-down = dealers buy stock. In equity markets, dealers are predominantly net short puts due to institutional hedging demand. When volatility drops, OTM put deltas approach zero - dealers who were short stock to hedge these puts find themselves over-hedged and must buy stock to rebalance. This put-dominated aggregate vanna effect is why vol compression tends to be bullish for equities. The opposite applies during vol expansion: put deltas increase in magnitude, forcing dealers to sell stock to maintain their hedges.
The reverse is equally important:
This is why volatility spikes are self-reinforcing in the short term. It is not just panic selling by retail traders. It is billions of dollars in mechanical dealer flow driven by vanna. The selling continues until IV stabilizes or until the vanna exposure at the relevant strikes decays away.
Charm is the sensitivity of an option's delta to the passage of time. It measures how much delta changes per day (or per hour, per minute) with all else held constant. It is also called "delta decay" because it describes how deltas drift toward their terminal values (0 or 1 for calls, 0 or -1 for puts) as expiration approaches.
Sign convention note: Charm is defined here as −∂Δ/∂t (with a leading negative sign). Some sources define it without the negative sign (∂Δ/∂t). Both conventions appear in practice - Bloomberg uses the negative convention. The interpretation remains the same: as time passes, option deltas decay toward their expiration values (0 or ±1).
Charm answers a simple question: if the stock price and implied volatility stay exactly the same, how will dealer delta change by tomorrow morning?
For out-of-the-money options, charm pushes delta toward zero - the option is becoming less sensitive to the underlying as time runs out. For in-the-money options, charm pushes delta toward 1 (calls) or -1 (puts) - the option is becoming more like stock. The largest charm effects occur for at-the-money options near expiration, where time decay is fastest.
Charm operates 24/7, but stock markets are only open 6.5 hours a day. This means a significant portion of delta decay accumulates overnight. When the market opens, dealers must rebalance for all the charm-driven delta changes that occurred while the market was closed. This is one of the reasons opening prints can be volatile - it is not just news, it is overnight charm rebalancing.
Figure: Delta decay over time for ITM, ATM, and OTM call options. As expiration approaches, ITM deltas converge to 1.0, OTM deltas converge to 0.0, and ATM deltas diverge sharply - creating the largest charm-driven hedging flows in the final days.
Charm is the quiet force. Unlike vanna, which activates during dramatic vol moves, charm works constantly - every minute, every hour, relentlessly pushing deltas toward their endpoints.
Charm's magnitude scales inversely with time to expiration. A 30-day option has modest charm. A 7-day option has noticeable charm. A 0DTE option has enormous charm. As the 0DTE boom has concentrated massive open interest in same-day expiration contracts, charm has become one of the dominant intraday forces.
Between the market close (4:00 PM ET) and the next open (9:30 AM ET), 17.5 hours pass. During that time, option deltas decay via charm but dealers cannot hedge in the stock market. The result is a hedging deficit that must be resolved at the open.
If overnight charm produces a net positive delta shift for dealers (they need to be shorter stock than they currently are), the open will see selling pressure. If charm produces a net negative delta shift (dealers need to be longer stock), the open will see buying pressure.
Charm is strongest around large OI expirations. Monthly OPEX (third Friday), quarterly OPEX, and days with heavy 0DTE activity see the largest charm-driven flows. If you trade the open on these days without checking charm exposure, you are flying blind.
Raw vanna and charm values for individual options are available on most platforms. What FlashAlpha does differently is aggregate them across the entire option chain - every strike, every expiration - weighted by open interest and dealer positioning assumptions. The result is Vanna Exposure (VEX) and Charm Exposure (CHEX): the total hedging flow dealers must execute in response to vol changes and time passage.
The VEX endpoint (GET /v1/exposure/vex/{symbol}) returns per-strike vanna exposure and aggregate metrics. Here is how to read the data:
The CHEX endpoint (GET /v1/exposure/chex/{symbol}) returns per-strike charm exposure and aggregate metrics:
Both endpoints require the Basic plan or higher (VEX and CHEX are Basic+ alongside DEX). Here is how to pull VEX and CHEX data programmatically.
import requests
API_KEY = "YOUR_API_KEY"
BASE = "https://lab.flashalpha.com"
# Fetch vanna exposure for SPY
resp = requests.get(
f"{BASE}/v1/exposure/vex/SPY",
headers={"X-Api-Key": API_KEY}
)
vex = resp.json()
print(f"Net Vanna Exposure: {vex['net_vex']:,.0f}")
print(f"Interpretation: {vex['interpretation']}")
print()
# Show top 5 strikes by absolute vanna exposure
strikes = sorted(vex["strikes"], key=lambda s: abs(s["vanna_exposure"]), reverse=True)
print("Top strikes by vanna exposure:")
for s in strikes[:5]:
direction = "bullish on vol-down" if s["vanna_exposure"] > 0 else "bearish on vol-down"
print(f" ${s['strike']:>8.1f} VEX: {s['vanna_exposure']:>+12,.0f} ({direction})")
import requests
API_KEY = "YOUR_API_KEY"
BASE = "https://lab.flashalpha.com"
# Fetch charm exposure for SPY
resp = requests.get(
f"{BASE}/v1/exposure/chex/SPY",
headers={"X-Api-Key": API_KEY}
)
chex = resp.json()
print(f"Net Charm Exposure: {chex['net_chex']:,.0f}")
print(f"Overnight flow: {chex['overnight_direction']}")
print()
# Show strikes with largest overnight hedging impact
strikes = sorted(chex["strikes"], key=lambda s: abs(s["charm_exposure"]), reverse=True)
print("Top strikes by charm exposure:")
for s in strikes[:5]:
flow = "selling pressure" if s["charm_exposure"] > 0 else "buying pressure"
print(f" ${s['strike']:>8.1f} CHEX: {s['charm_exposure']:>+12,.0f} ({flow})")
import requests
API_KEY = "YOUR_API_KEY"
BASE = "https://lab.flashalpha.com"
SYMBOL = "SPY"
# Pull all exposure metrics in sequence
gex = requests.get(f"{BASE}/v1/exposure/gex/{SYMBOL}", headers={"X-Api-Key": API_KEY}).json()
vex = requests.get(f"{BASE}/v1/exposure/vex/{SYMBOL}", headers={"X-Api-Key": API_KEY}).json()
chex = requests.get(f"{BASE}/v1/exposure/chex/{SYMBOL}", headers={"X-Api-Key": API_KEY}).json()
# Call/put walls come from /v1/exposure/levels (gamma flip is on gex)
levels = requests.get(f"{BASE}/v1/exposure/levels/{SYMBOL}", headers={"X-Api-Key": API_KEY}).json()["levels"]
print(f"=== {SYMBOL} Dealer Positioning Summary ===")
print(f"GEX (gamma): {gex['net_gex']:>+14,.0f} | {'Positive gamma - stabilizing' if gex['net_gex'] > 0 else 'Negative gamma - amplifying'}")
print(f"VEX (vanna): {vex['net_vex']:>+14,.0f} | {vex['interpretation']}")
print(f"CHEX (charm): {chex['net_chex']:>+14,.0f} | Overnight: {chex['overnight_direction']}")
print(f"Gamma Flip: ${gex['gamma_flip']}")
print(f"Call Wall: ${levels['call_wall']}")
print(f"Put Wall: ${levels['put_wall']}")
Each exposure metric answers a different question. Used together, they give you a three-dimensional view of dealer positioning that no single metric can provide.
| Metric | Driven By | When It Dominates | Key Question |
|---|---|---|---|
| GEX | Price movement | Always - the baseline | Will moves be dampened or amplified? |
| VEX | IV changes | FOMC, earnings, VIX spikes | What happens if vol drops or spikes? |
| CHEX | Time passage | 0DTE, OPEX weeks, overnight | What hedging flow will time alone create? |
A mega-cap tech stock reports earnings after the close. The stock barely moves, but IV drops 15 points overnight. Here is how each metric applies:
Figure: The four regime combinations of gamma and vanna exposure. Each cell describes the market behavior and trading implications when the two forces interact.
For a broader overview of how GEX, VEX, and CHEX work together - including DEX (delta exposure) - see Why GEX Isn't Enough. For deeper coverage of gamma exposure specifically, see What Is Gamma Exposure (GEX)?
FlashAlpha provides vanna and charm exposure through multiple channels:
/v1/exposure/vex/{symbol} and /v1/exposure/chex/{symbol} - VEX docs, CHEX docsVEX and CHEX require the Basic plan or higher (250 requests/day); the free tier covers GEX and levels only. Get your API key →
Vanna and charm are the second-order Greeks that separate surface-level options analysis from genuine understanding of dealer mechanics. Gamma tells you how dealers respond to price. Vanna tells you how they respond to volatility. Charm tells you how they respond to time. All three operate simultaneously, and ignoring any one of them leaves a gap in your market read.
The practical takeaways are straightforward. When implied volatility is about to drop - post-FOMC, post-earnings, post-CPI - check VEX to understand the direction and magnitude of vanna-driven flows. When a large expiration is approaching or 0DTE activity is heavy, check CHEX to understand the overnight and intraday hedging flows that time decay will force. Combine both with GEX to see whether gamma is stabilizing or amplifying those flows.
FlashAlpha computes VEX and CHEX across 6,000+ tickers in real time - infrastructure that no other retail-accessible platform provides. Whether you use the interactive tools, the REST API, or the dealer positioning dashboard, you now have access to the same second-order Greek analysis that institutional desks have relied on for decades.
by Tomasz Dobrowolski
by Tomasz Dobrowolski
by Tomasz Dobrowolski
Get fast visibility into market shifts with full-chain analytics over low-latency REST and MCP polling.
Screen millions of option pairs per second using your custom EV rules, filters, and setups.
Export structured signals to your own execution stack or broker integration - FlashAlpha delivers the analytics, you keep control of order routing.