vanna_curve
Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-09-27, from what-is-vanna-and-charm-exposure.
| moneyness_band | delta_shift_per_vol_point | pair_count |
|---|---|---|
| ITM 5-12% | -0.0093 | 646 |
| ITM 2-5% | -0.0122 | 1327 |
| ITM 0.5-2% | -0.0083 | 1219 |
| ATM 0.5%以内 | -0.0016 | 813 |
| OTM 0.5-2% | 0.0069 | 1157 |
| OTM 2-5% | 0.0188 | 1872 |
| OTM 5-12% | 0.0116 | 1166 |
- Rows × columns
- 7 × 3
- Computed
- Completeness
- No missing values
- Source
- US exchange, SIP and OPRA market data
- Licence
- Strasmore terms · free, no signup
What each column holds
| Column | Type | Range | Notes |
|---|---|---|---|
moneyness_band |
text | 7 distinct values (ATM 0.5%以内, ITM 0.5-2%, ITM 2-5%…) | |
delta_shift_per_vol_point |
number | -0.0122 to 0.0188 | |
pair_count |
number | 646 to 1,872 | count |
Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.
Run it yourself
This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.
WITH daily AS
(
SELECT
ticker,
expiration_date,
strike_price,
date,
toFloat64(delta) AS delta,
multiIf(toFloat64(implied_volatility) > 1.5,
toFloat64(implied_volatility),
toFloat64(implied_volatility) * 100) AS iv_pt,
toFloat64(underlying_close) AS spot,
toFloat64(strike_price) / toFloat64(underlying_close) - 1 AS moneyness
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND lower(toString(option_type)) LIKE 'c%'
AND date >= '2025-09-01'
AND date < '2026-09-01'
AND iv_converged = 1
AND volume > 0
AND days_to_expiry BETWEEN 20 AND 45
),
steps AS
(
SELECT
ticker,
date,
moneyness,
delta - lagInFrame(delta) OVER (PARTITION BY ticker, expiration_date, strike_price ORDER BY date) AS delta_change,
iv_pt - lagInFrame(iv_pt) OVER (PARTITION BY ticker, expiration_date, strike_price ORDER BY date) AS iv_change_pt,
spot / lagInFrame(spot) OVER (PARTITION BY ticker, expiration_date, strike_price ORDER BY date) - 1 AS spot_change,
dateDiff('day', lagInFrame(date) OVER (PARTITION BY ticker, expiration_date, strike_price ORDER BY date), date) AS gap_days
FROM daily
)
SELECT
multiIf(moneyness < -0.05, 'ITM 5-12%',
moneyness < -0.02, 'ITM 2-5%',
moneyness < -0.005, 'ITM 0.5-2%',
moneyness < 0.005, 'ATM 0.5%以内',
moneyness < 0.02, 'OTM 0.5-2%',
moneyness < 0.05, 'OTM 2-5%',
'OTM 5-12%') AS moneyness_band,
round(quantileDeterministic(0.5)(delta_change / iv_change_pt,
cityHash64(ticker, date)), 4) AS delta_shift_per_vol_point,
count() AS pair_count
FROM steps
WHERE gap_days = 1
AND abs(spot_change) < 0.002
AND abs(iv_change_pt) >= 0.4
AND abs(moneyness) <= 0.12
GROUP BY moneyness_band
HAVING count() >= 10
ORDER BY min(moneyness)
このデータをAIアシスタントで使う
このページのデータで、すぐにクエリできる状態で開きます。無料、アカウント不要。