Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

バンナとチャームとは: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日に絞りました。

クエリSPYコール:IV1ポイントあたりのデルタ変化(行使価格別)
moneyness_banddelta_shift_per_vol_pointpair_count
ITM 5-12%-0.0093646
ITM 2-5%-0.01221327
ITM 0.5-2%-0.00831219
ATM 0.5%以内-0.0016813
OTM 0.5-2%0.00691157
OTM 2-5%0.01881872
OTM 5-12%0.01161166
各数値の背後にある正確な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日あたりのデルタ変化の中央値を残存日数別に出しました。

クエリ静かな日の1日あたりデルタ変化(残存日数別、SPYコール)
dte_banditm_delta_driftotm_delta_driftpair_count
残り0-2日0.0399-0.0455124
残り3-5日0.0194-0.0114488
残り6-10日0.007-0.01491067
残り11-20日0.0038-0.0137847
残り21-45日0.0004-0.00771760
残り46-90日-0.0008-0.00391131
各数値の背後にある正確な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日ずつたどり、最終セッションのスポットより下の行使価格のコールと、上の行使価格のコールに分けて平均デルタを取りました。どちらも同じ銘柄、同じ満期です。

クエリ2026年6月18日満期のSPYコール:最終スポットの上下で分かれたデルタ
session_datesession_labelbelow_spot_call_deltaabove_spot_call_deltadelta_gap
2026-06-016月1日0.810.3670.444
2026-06-026月2日0.890.4060.484
2026-06-036月3日0.7350.2560.479
2026-06-046月4日0.7960.3020.494
2026-06-056月5日0.6010.0720.529
2026-06-086月8日0.6510.070.581
2026-06-096月9日0.6270.060.566
2026-06-106月10日0.4250.0240.401
2026-06-116月11日0.7250.0670.659
2026-06-126月12日0.7970.0460.752
2026-06-156月15日0.9070.1550.752
2026-06-166月16日0.9160.0720.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 date
自分で実行する

6月1日 の時点では、下側と上側の平均デルタの差は 0.444 です。6月16日 には下側が 0.916、上側が 0.072 で、差は 0.844 まで開いています。スポットが同じ水準にとどまっていても、日が過ぎるだけで同じ満期のデルタが両端に寄っていく形です。ヘッジの向きに言い換えると、下側の行使価格に張り付いた建玉と上側の建玉では、チャームから来る調整の符号が逆になります。どちらの側に建玉が偏っているかで、満期週に集計されるフローの符号が入れ替わります。ひとつの満期の内側で符号が割れるという点が、GEXの一本の曲線からは見えにくい部分です。

スポットが動かない日はどれくらいあるのか

バンナとチャームが実務で意味を持つのは、スポットが動かない日が珍しくないからです。次のパネルは、SPYのATM近辺のIV水準と終値を日次で並べ、前営業日からの株価変化が0.25%未満だったセッション数と、そのうちATM IVが1ポイント以上動いたセッション数を月別に数えたものです。

クエリ株価がほぼ動かなかった日とIVが1ポイント以上動いた日(SPY、月別)
monthmonth_labelquiet_spot_sessionsquiet_spot_iv_shift_sessionsiv_shift_share_pct
2025-092025年9月600
2025-102025年10月700
2025-112025年11月500
2025-122025年12月500
2026-012026年1月900
2026-022026年2月500
2026-032026年3月4125
2026-042026年4月7114.3
2026-052026年5月7114.3
2026-062026年6月300
2026-072026年7月900
2026-082026年8月800
各数値の背後にある正確な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 month
自分で実行する

2026年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のターミナルで同じ質問を日本語のまま投げられます。

#vanna#charm#gamma exposure#dealer hedging#volatility