バンナとチャームとは:IVと時間で動くデルタ
バンナはIVが動いたとき、チャームは時間が過ぎたときにディーラーのデルタが変わる度合いです。スポットがほとんど動かない日でもヘッジ需要が生まれる仕組みを、ガンマエクスポージャーの先にある二つの感応度として分けて整理し、SPYの日次グリークスから近似した数値と、ひとつの満期を追った実例で確かめます。
バンナとチャームは、ガンマの一歩先にある感応度です。バンナはインプライド・ボラティリティ(IV)が動いたときにディーラーのデルタがどれだけ変わるかを測り、チャームは時間が1日過ぎるだけでデルタがどれだけ変わるかを測ります。株価がほとんど動かない日にヘッジのフローが出てくる場面では、たいていこの二つが動いています。
ガンマエクスポージャーの復習
ガンマエクスポージャー(GEX)は、スポットが1単位動いたときにディーラー全体のデルタがどれだけ変わるかを、建玉の分布から積み上げた指標です。出発点は「スポットが動いた」ことにあります。そのため、スポットがほとんど動かないセッションのヘッジ需要は、GEXの計算式の外側に置かれます。その空白を埋めるのがバンナとチャームです。ヘッジそのものの手順は デルタヘッジの仕組み で扱っています。
デルタはスポットだけの関数ではありません。同じ契約のデルタは、IVが変わっても、日付が変わっただけでも変わります。偏微分で並べると役割の違いがはっきりします。
- ガンマ: デルタのスポットに対する感応度
- バンナ: デルタのIVに対する感応度(スポットに対するベガの感応度でもあります)
- チャーム: デルタの時間経過に対する感応度
ひとつ先に断っておくと、バンナとチャームは日次のグリークス系列に列として入っていません。デルタとIVの日次の差分から近似するしかなく、以下のパネルはすべてその近似です。近似の中身は末尾のデータ注記に書きました。
バンナ:IVが1ポイント動くとデルタはどう動くか
バンナには読み方が二つあります。IVが動いたときのデルタの変化として読む方法と、スポットが動いたときのベガの変化として読む方法です。同じ二階微分なので値は一致します。ディーラーの立場では前者が実務に直結します。IVが変われば、スポットが同じでもヘッジすべき株数が変わるからです。
次のパネルはSPYのコールについて、1契約ごとに前営業日と比べた変化を集計したものです。スポットの変化が0.2%未満、IVの変化が0.4ポイント以上の組み合わせだけを残し、デルタの変化をIVの変化(ポイント)で割った中央値を出しています。残存日数は20日から45日に絞りました。
| 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 |
各数値の背後にある正確なSQL
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)7 本のバンドを、行使価格の低い側から順に並べています。一番下の ITM 5-12% では、IVが1ポイント動いたときのデルタ変化が -0.0093 です。反対の端の OTM 5-12% では 0.0116 になります。注目したいのは大きさより符号です。ATMを挟んで向きが入れ替わるので、同じIVの低下が、行使価格の位置によって反対方向のヘッジ需要になります。
イベントの後にIVが数ポイント落ちる局面(IVクラッシュ)では、スポットが1ティックも動かないままこの分のデルタが動きます。仮の例として、IVが1ポイント下がるとデルタが0.01減るコールを1万枚持っていれば、株式換算で1万枚×100株×0.01=1万株のずれが出ます。向きと規模は在庫の向きで決まるので、符号を一方向に決めつけることはできません。行使価格ごとにIVの水準が違う点は ボラティリティ・スキュー と合わせて読むと見通しが良くなります。
チャーム:1日過ぎるだけで動くデルタ
チャームは時間軸の感応度です。ITMのコールのデルタは満期が近づくほど1に寄り、OTMのコールは0に寄ります。行き先が決まっているので、向きは日替わりではありません。次のパネルではスポットの変化が0.2%未満、IVの変化が0.5ポイント未満の静かな組み合わせだけを残し、行使価格がスポットから0.5%から3%離れた契約に限って、1日あたりのデルタ変化の中央値を残存日数別に出しました。
| 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 |
各数値の背後にある正確なSQL
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)残り0-2日 のバンドでは、ITM側のデルタが1日で 0.0399、OTM側が -0.0455 動いています。符号は反対で、向きは満期に向かって固定されています。一番残存の長い 残り46-90日 になると、ITM側の1日あたりは -0.0008 まで小さくなります。残存が短いバンドほど1日あたりの変化が大きく、満期週に近づくほど、板を見ていなくてもずれていく量が増えます。グリークスが時間とともに形を変える全体像は グリークスの時間変化 にまとめています。
満期をひとつ追う:符号が両側に割れる場面
米国株オプションの月次満期は原則として第3金曜日で、その日が休場のときは前営業日にずれます。2026年6月は第3金曜日の6月19日がジューンティーンス(奴隷解放記念日)の休場にあたり、月次満期は木曜の6月18日でした。この満期について、6月のセッションを1日ずつたどり、最終セッションのスポットより下の行使価格のコールと、上の行使価格のコールに分けて平均デルタを取りました。どちらも同じ銘柄、同じ満期です。
| session_date | session_label | below_spot_call_delta | above_spot_call_delta | delta_gap |
|---|---|---|---|---|
| 2026-06-01 | 6月1日 | 0.81 | 0.367 | 0.444 |
| 2026-06-02 | 6月2日 | 0.89 | 0.406 | 0.484 |
| 2026-06-03 | 6月3日 | 0.735 | 0.256 | 0.479 |
| 2026-06-04 | 6月4日 | 0.796 | 0.302 | 0.494 |
| 2026-06-05 | 6月5日 | 0.601 | 0.072 | 0.529 |
| 2026-06-08 | 6月8日 | 0.651 | 0.07 | 0.581 |
| 2026-06-09 | 6月9日 | 0.627 | 0.06 | 0.566 |
| 2026-06-10 | 6月10日 | 0.425 | 0.024 | 0.401 |
| 2026-06-11 | 6月11日 | 0.725 | 0.067 | 0.659 |
| 2026-06-12 | 6月12日 | 0.797 | 0.046 | 0.752 |
| 2026-06-15 | 6月15日 | 0.907 | 0.155 | 0.752 |
| 2026-06-16 | 6月16日 | 0.916 | 0.072 | 0.844 |
各数値の背後にある正確なSQL
WITH
(
SELECT argMax(toFloat64(underlying_close), date)
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date >= '2026-06-15'
AND date <= '2026-06-19'
) AS expiry_spot
SELECT
toString(date) AS session_date,
concat(toString(toMonth(date)), '月', toString(toDayOfMonth(date)), '日') AS session_label,
round(avgIf(toFloat64(delta), toFloat64(strike_price) < expiry_spot * 0.99), 3) AS below_spot_call_delta,
round(avgIf(toFloat64(delta), toFloat64(strike_price) > expiry_spot * 1.01), 3) AS above_spot_call_delta,
round(avgIf(toFloat64(delta), toFloat64(strike_price) < expiry_spot * 0.99)
- avgIf(toFloat64(delta), toFloat64(strike_price) > expiry_spot * 1.01), 3) AS delta_gap
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND lower(toString(option_type)) LIKE 'c%'
AND expiration_date = '2026-06-18'
AND date >= '2026-06-01'
AND date <= '2026-06-19'
AND iv_converged = 1
AND volume > 0
AND abs(toFloat64(strike_price) / expiry_spot - 1) < 0.04
GROUP BY date
HAVING countIf(toFloat64(strike_price) < expiry_spot * 0.99) >= 3
AND countIf(toFloat64(strike_price) > expiry_spot * 1.01) >= 3
ORDER BY date6月1日 の時点では、下側と上側の平均デルタの差は 0.444 です。6月16日 には下側が 0.916、上側が 0.072 で、差は 0.844 まで開いています。スポットが同じ水準にとどまっていても、日が過ぎるだけで同じ満期のデルタが両端に寄っていく形です。ヘッジの向きに言い換えると、下側の行使価格に張り付いた建玉と上側の建玉では、チャームから来る調整の符号が逆になります。どちらの側に建玉が偏っているかで、満期週に集計されるフローの符号が入れ替わります。ひとつの満期の内側で符号が割れるという点が、GEXの一本の曲線からは見えにくい部分です。
スポットが動かない日はどれくらいあるのか
バンナとチャームが実務で意味を持つのは、スポットが動かない日が珍しくないからです。次のパネルは、SPYのATM近辺のIV水準と終値を日次で並べ、前営業日からの株価変化が0.25%未満だったセッション数と、そのうちATM IVが1ポイント以上動いたセッション数を月別に数えたものです。
| month | month_label | quiet_spot_sessions | quiet_spot_iv_shift_sessions | iv_shift_share_pct |
|---|---|---|---|---|
| 2025-09 | 2025年9月 | 6 | 0 | 0 |
| 2025-10 | 2025年10月 | 7 | 0 | 0 |
| 2025-11 | 2025年11月 | 5 | 0 | 0 |
| 2025-12 | 2025年12月 | 5 | 0 | 0 |
| 2026-01 | 2026年1月 | 9 | 0 | 0 |
| 2026-02 | 2026年2月 | 5 | 0 | 0 |
| 2026-03 | 2026年3月 | 4 | 1 | 25 |
| 2026-04 | 2026年4月 | 7 | 1 | 14.3 |
| 2026-05 | 2026年5月 | 7 | 1 | 14.3 |
| 2026-06 | 2026年6月 | 3 | 0 | 0 |
| 2026-07 | 2026年7月 | 9 | 0 | 0 |
| 2026-08 | 2026年8月 | 8 | 0 | 0 |
各数値の背後にある正確なSQL
WITH atm AS
(
SELECT
date,
max(toFloat64(underlying_close)) AS spot,
round(avg(toFloat64(implied_volatility)) * 100, 3) AS atm_iv_pct
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
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
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.02
GROUP BY date
),
steps AS
(
SELECT
date,
100 * (spot / lagInFrame(spot) OVER (ORDER BY date) - 1) AS spot_move_pct,
atm_iv_pct - lagInFrame(atm_iv_pct) OVER (ORDER BY date) AS iv_move_pt,
dateDiff('day', lagInFrame(date) OVER (ORDER BY date), date) AS gap_days
FROM atm
)
SELECT
formatDateTime(toStartOfMonth(date), '%Y-%m') AS month,
concat(toString(toYear(date)), '年', toString(toMonth(date)), '月') AS month_label,
countIf(abs(spot_move_pct) < 0.25) AS quiet_spot_sessions,
countIf(abs(spot_move_pct) < 0.25 AND abs(iv_move_pt) >= 1) AS quiet_spot_iv_shift_sessions,
round(100 * countIf(abs(spot_move_pct) < 0.25 AND abs(iv_move_pt) >= 1)
/ countIf(abs(spot_move_pct) < 0.25), 1) AS iv_shift_share_pct
FROM steps
WHERE gap_days BETWEEN 1 AND 5
GROUP BY month, month_label
HAVING countIf(abs(spot_move_pct) < 0.25) > 0
ORDER BY month2026年8月 では、株価が0.25%未満しか動かなかったセッションが 8 日あり、そのうち 0 日でATM IVが1ポイント以上動いています。割合では 0% です。12 か月分を並べると、静かな日の多さと、その内側でIVが動いた日の比率が月ごとにどれだけ振れるかが見えます。ガンマだけを見ている枠組みでは、この種のセッションは「何も起きていない日」に分類されます。バンナの側から見ると、ヘッジ需要が動いた日として数えられます。
SQ週と月次満期のリズム
日本の読者にとって、チャームのカレンダーは日経225オプションのSQ(特別清算指数)に重なります。SQ算出日は毎月第2金曜日で、3月、6月、9月、12月は先物も同時に清算されるメジャーSQです。米国の月次満期は第3金曜日なので、ひと月の中に規模の大きい満期が二度来ます。チャームの効き方は残存日数で決まるため、フローは算出日当日ではなく、その手前の数営業日に積み上がります。上のチャームのパネルで残存の短いバンドの1日あたりの変化が大きくなっているのは、この前倒しの形と同じものを別の切り口で見たものです。
バンナの方はカレンダーに紐づきません。決算や指標発表でIVが動いた日に現れ、静かな地合いでも発生します。満期の直前にIVが落ちる週は、チャームとバンナが同じ数日に重なります。この二つを分けて見ておくと、スポットの値動きだけでは説明の付かないヘッジフローを、どちらの軸から来たものとして整理できます。
データの導出と注意
- バンナとチャームは元データの列ではありません。日次のデルタとIVの差分から近似しています。デルタの1日の変化には、スポットの変化、IVの変化、時間の経過が同時に混ざります。
- バンナのパネルはスポットの変化を0.2%未満に抑えた組み合わせのうちIVが動いたものに絞り、チャームのパネルはスポットとIVの両方が小さい組み合わせに絞ることで、寄与を分けています。完全な分離ではありません。数値は方向と桁を見るためのものです。
- IVは小数表記でもパーセント表記でも同じ結果になるよう、ポイント単位にそろえてから前日差を取っています。
- 使っているのは
iv_convergedが1で、その日の出来高が1枚以上ある行だけです。IVの計算が収束していない行は入っていません。 - 中央値は
quantileDeterministicで計算しているので、同じ期間を再集計しても同じ値になります。 - どのパネルも1契約あたりの感応度の形を見ています。建玉の内訳とディーラー在庫の向きは公開されていないため、金額換算のフローや符号はここからは決まりません。
FAQ
バンナとチャームの違いは何ですか
バンナはIVが動いたときのデルタの変化、チャームは時間が経過したときのデルタの変化です。前者はボラティリティ軸、後者は時間軸の感応度で、どちらもスポットが動かないままヘッジの必要量を変えます。
バンナやチャームはデータとして配信されていますか
一般的な日次グリークスにはデルタ、ガンマ、ベガ、セータが入っていますが、バンナとチャームは列として含まれないことが多く、この記事でもデルタとIVの差分から近似しました。近似の前提は上のデータ注記に書いています。
IVが下がるとディーラーは買い手になりますか
一方向には決まりません。バンナの符号は行使価格の位置で反転し、さらに在庫の向きによって売買の方向が入れ替わります。上のパネルが示すのは感応度の符号までで、フローの方向を出すには建玉の偏りの情報が別に必要です。
チャームの影響が大きいのはいつですか
残存日数が短いときです。上のチャームのパネルでは、残り日数が最も短いバンドの1日あたりのデルタ変化が、最も長いバンドより大きくなっています。SQ週や米国の月次満期の手前に効き方が集中します。
各パネルの下には、その数字を出したSQLがそのまま入っています。別の銘柄や別の満期で同じ集計を試したいときは、Strasmoreのターミナルで同じ質問を日本語のまま投げられます。