charm_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.
| dte_band | itm_delta_drift | otm_delta_drift | pair_count |
|---|---|---|---|
| 残り0-2日 | 0.0399 | -0.0455 | 124 |
| 残り3-5日 | 0.0194 | -0.0114 | 488 |
| 残り6-10日 | 0.007 | -0.0149 | 1067 |
| 残り11-20日 | 0.0038 | -0.0137 | 847 |
| 残り21-45日 | 0.0004 | -0.0077 | 1760 |
| 残り46-90日 | -0.0008 | -0.0039 | 1131 |
- Rows × columns
- 6 × 4
- 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 |
|---|---|---|---|
dte_band |
text | 6 distinct values (残り0-2日, 残り11-20日, 残り21-45日…) | |
itm_delta_drift |
number | -0.0008 to 0.0399 | |
otm_delta_drift |
number | -0.0455 to -0.0039 | |
pair_count |
number | 124 to 1,760 | 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,
days_to_expiry,
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 <= 90
),
steps AS
(
SELECT
ticker,
date,
moneyness,
days_to_expiry,
delta - lagInFrame(delta) OVER (PARTITION BY ticker, expiration_date, strike_price ORDER BY date) AS delta_change,
abs(iv_pt - lagInFrame(iv_pt) OVER (PARTITION BY ticker, expiration_date, strike_price ORDER BY date)) AS iv_move_pt,
abs(spot / lagInFrame(spot) OVER (PARTITION BY ticker, expiration_date, strike_price ORDER BY date) - 1) AS spot_move,
dateDiff('day', lagInFrame(date) OVER (PARTITION BY ticker, expiration_date, strike_price ORDER BY date), date) AS gap_days
FROM daily
)
SELECT
multiIf(days_to_expiry <= 2, '残り0-2日',
days_to_expiry <= 5, '残り3-5日',
days_to_expiry <= 10, '残り6-10日',
days_to_expiry <= 20, '残り11-20日',
days_to_expiry <= 45, '残り21-45日',
'残り46-90日') AS dte_band,
round(quantileDeterministicIf(0.5)(delta_change, cityHash64(ticker, date), moneyness < -0.005), 4) AS itm_delta_drift,
round(quantileDeterministicIf(0.5)(delta_change, cityHash64(ticker, date), moneyness > 0.005), 4) AS otm_delta_drift,
count() AS pair_count
FROM steps
WHERE gap_days = 1
AND spot_move < 0.002
AND iv_move_pt < 0.5
AND abs(moneyness) BETWEEN 0.005 AND 0.03
GROUP BY dte_band
HAVING countIf(moneyness < -0.005) >= 10
AND countIf(moneyness > 0.005) >= 10
ORDER BY min(days_to_expiry)
このデータをAIアシスタントで使う
このページのデータで、すぐにクエリできる状態で開きます。無料、アカウント不要。