返回 Expert 笔记
Expert Day 64

Greeks 全解 — 一阶/二阶敏感度

Delta/Gamma/Vega/Theta/Rho 推导,二阶 Greeks (Vanna/Volga/Charm),对冲 P&L 分解

2026-07-04
Phase 2 - 量化数学与衍生品定价 (Day 61-74)
量化GreeksDeltaGammaVega对冲

日期: 2026-07-04 方向: 量化 / 衍生品定价 阶段: Phase 2 - 量化数学与衍生品定价 (Day 61-74) 标签: #量化 #Greeks #Delta #Gamma #Vega #对冲


今日目标

类型内容
学习Delta/Gamma/Vega/Theta/Rho 推导,二阶 Greeks (Vanna/Volga/Charm),对冲 P&L 分解
实操Python 实现所有 Greeks 计算 + 可视化
产出greeks.py — 完整 Greeks 库,含 inverse contract 修正

一、数学/理论基础

1.1 一阶 Greeks 定义

Greek含义公式
$\Delta$$\partial V / \partial S$对标的价格的敏感度
$\Gamma$$\partial^2 V / \partial S^2$$\Delta$ 对 $S$ 的变化率
$\mathcal{V}$ (Vega)$\partial V / \partial \sigma$对波动率的敏感度
$\Theta$$\partial V / \partial t$对时间流逝的敏感度(通常负)
$\rho$$\partial V / \partial r$对利率的敏感度

1.2 Call Delta 推导

$C = S e^{-q\tau} N(d_1) - K e^{-r\tau} N(d_2)$。对 $S$ 求导:

$$ \Delta_C = \frac{\partial C}{\partial S} = e^{-q\tau} N(d_1) + S e^{-q\tau} N'(d_1) \frac{\partial d_1}{\partial S} - K e^{-r\tau} N'(d_2) \frac{\partial d_2}{\partial S} $$

注意 $\partial d_1/\partial S = \partial d_2 / \partial S = 1/(S\sigma\sqrt\tau)$。需要证明:

$$ S e^{-q\tau} N'(d_1) = K e^{-r\tau} N'(d_2) $$

证明:$N'(x) = \frac{1}{\sqrt{2\pi}} e^{-x^2/2}$。计算:

$$ \frac{N'(d_1)}{N'(d_2)} = \exp\left(-\frac{d_1^2 - d_2^2}{2}\right) = \exp\left(-\frac{(d_1+d_2)(d_1-d_2)}{2}\right) $$

$d_1 - d_2 = \sigma\sqrt\tau$, $d_1 + d_2 = 2 \frac{\ln(S/K) + (r-q)\tau}{\sigma\sqrt\tau}$,所以:

$$ \frac{N'(d_1)}{N'(d_2)} = \exp\left(-(\ln(S/K) + (r-q)\tau)\right) = \frac{K}{S} e^{-(r-q)\tau} $$

即 $S e^{-q\tau} N'(d_1) = K e^{-r\tau} N'(d_2)$。所以两个相消

$$ \boxed{\Delta_C = e^{-q\tau} N(d_1)} $$

类似地 $\Delta_P = -e^{-q\tau} N(-d_1) = e^{-q\tau}(N(d_1) - 1)$。

1.3 Gamma — 关键二阶项

$$ \Gamma = \frac{\partial \Delta_C}{\partial S} = \frac{e^{-q\tau} N'(d_1)}{S \sigma \sqrt\tau} $$

关键性质

  • Call 与 Put 的 $\Gamma$ 相同(来自 parity)
  • ATM 时最大($d_1 \approx 0$ 使 $N'(d_1) = 1/\sqrt{2\pi}$ 最大)
  • $\tau \to 0$ 时趋于无穷(pin risk)

1.4 Vega

$$ \mathcal{V} = \frac{\partial C}{\partial \sigma} = S e^{-q\tau} N'(d_1) \sqrt\tau $$

(用上面的相消等式,复杂项消失,剩下这个简洁形式。)

性质

  • Call 与 Put Vega 相同
  • ATM 最大
  • 长期期权 Vega 大($\sqrt\tau$ 因子)
  • 市场惯例:Vega 报 "per 1% IV",即除以 100

1.5 Theta

$$ \Theta_C = -\frac{S e^{-q\tau} N'(d_1) \sigma}{2\sqrt\tau} - r K e^{-r\tau} N(d_2) + q S e^{-q\tau} N(d_1) $$

含义:第一项是"Gamma rent"(buyer 付时间价值);第二项是利率对行权价的折现;第三项是股息收入。

通常 $\Theta < 0$(期权随时间贬值)。但深 ITM Put 在高利率下可能 $\Theta > 0$。

1.6 Rho

$$ \rho_C = K \tau e^{-r\tau} N(d_2), \quad \rho_P = -K \tau e^{-r\tau} N(-d_2) $$

市场惯例:报 "per 1% rate"。

1.7 二阶 Greeks (Cross-Greeks)

Greek公式含义
Vanna$\partial^2 V / \partial S \partial \sigma = \partial \Delta / \partial \sigma$IV 变化对 Delta 的影响
Volga (Vomma)$\partial^2 V / \partial \sigma^2$Vega 对 IV 的二阶
Charm$\partial^2 V / \partial S \partial t = \partial \Delta / \partial t$Delta 衰减
Color$\partial^3 V / \partial S^2 \partial t = \partial \Gamma / \partial t$Gamma 衰减
Speed$\partial^3 V / \partial S^3 = \partial \Gamma / \partial S$Gamma 滑移

Vanna 公式

$$ \text{Vanna} = -e^{-q\tau} N'(d_1) \frac{d_2}{\sigma} $$

Volga 公式

$$ \text{Volga} = S e^{-q\tau} N'(d_1) \sqrt\tau \cdot \frac{d_1 d_2}{\sigma} = \mathcal{V} \cdot \frac{d_1 d_2}{\sigma} $$

1.8 P&L 分解(Taylor 展开)

期权持仓 P&L 可以分解为:

$$ dV \approx \Delta , dS + \Theta , dt + \mathcal{V} , d\sigma + \frac{1}{2}\Gamma (dS)^2 + \text{Vanna}(dS)(d\sigma) + \frac{1}{2}\text{Volga}(d\sigma)^2 + \cdots $$

Delta-hedged option P&L(重要!):

$$ dV - \Delta , dS = \Theta , dt + \mathcal{V} , d\sigma + \frac{1}{2}\Gamma (dS)^2 + \cdots $$

短时间内 $\sigma$ 不变时:

$$ dV - \Delta , dS \approx \Theta , dt + \frac{1}{2}\Gamma S^2 \sigma_{\text{realized}}^2 , dt = \frac{1}{2}\Gamma S^2 (\sigma_R^2 - \sigma_I^2) , dt $$

深刻含义:Delta-hedged 期权的 P&L 是已实现波动率与隐含波动率之差的"波动率交易"。这是期权的本质——交易波动率,不是方向。


二、直觉解释

Q: 为什么 ATM Vega 最大?

ATM 时 $d_1 \approx 0$,$N'(0) = 1/\sqrt{2\pi}$ 是峰值。直观:ITM 已经"必然"行权,OTM 已经"必然"作废,对 IV 不敏感;ATM 处于"分水岭",IV 微变就能让概率显著移动。

Q: 为什么 Gamma 在临到期时爆炸?

短期 ATM 期权 $\Gamma \propto 1/(S\sigma\sqrt\tau)$,$\tau \to 0$ 时 $\to \infty$。这是 "pin risk"——到期日 ATM 期权的 Delta 在瞬间从 0 跳到 1 或反之。对做市商:到期日 ATM 期权的 Delta 对冲极其昂贵。

Q: Charm 在到期日有什么实际用?

Charm 描述 Delta 随时间衰减。例如:周五持有 Friday-expiry call delta 0.6,weekend 没有 trading 但 Charm 让 delta 自然滑向 0 或 1。机构的 weekend gap risk 主要通过 Charm 估算

Q: 为什么期权交易者关心 Vanna?

Vanna 衡量"Delta 随 IV 变化"。当市场跌(IV 涨)时,做市商持有的 Delta-flat 头寸会变成 Delta-short → 必须买回标的对冲 → 加剧标的下跌(Vanna feedback)。这是市场暴跌时的"做市商死亡螺旋"机制之一


三、代码实现

"""
greeks.py - BS 期权 Greeks 完整计算库
依赖: numpy, scipy, matplotlib
"""

import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt


# ====== 辅助 ======

def _d1_d2(S, K, r, q, sigma, tau):
    sqrt_tau = np.sqrt(tau)
    d1 = (np.log(S/K) + (r - q + 0.5*sigma**2)*tau) / (sigma*sqrt_tau)
    d2 = d1 - sigma*sqrt_tau
    return d1, d2


# ====== 一阶 Greeks ======

def delta(S, K, r, sigma, tau, q=0.0, option="call"):
    d1, _ = _d1_d2(S, K, r, q, sigma, tau)
    if option == "call":
        return np.exp(-q*tau) * norm.cdf(d1)
    else:
        return np.exp(-q*tau) * (norm.cdf(d1) - 1)


def gamma(S, K, r, sigma, tau, q=0.0):
    d1, _ = _d1_d2(S, K, r, q, sigma, tau)
    return np.exp(-q*tau) * norm.pdf(d1) / (S * sigma * np.sqrt(tau))


def vega(S, K, r, sigma, tau, q=0.0, per_pct=True):
    """Vega per 1 unit IV; if per_pct=True, return per 1% IV"""
    d1, _ = _d1_d2(S, K, r, q, sigma, tau)
    v = S * np.exp(-q*tau) * norm.pdf(d1) * np.sqrt(tau)
    return v / 100 if per_pct else v


def theta(S, K, r, sigma, tau, q=0.0, option="call", per_day=True):
    d1, d2 = _d1_d2(S, K, r, q, sigma, tau)
    term1 = -S * np.exp(-q*tau) * norm.pdf(d1) * sigma / (2*np.sqrt(tau))
    if option == "call":
        t = term1 - r*K*np.exp(-r*tau)*norm.cdf(d2) + q*S*np.exp(-q*tau)*norm.cdf(d1)
    else:
        t = term1 + r*K*np.exp(-r*tau)*norm.cdf(-d2) - q*S*np.exp(-q*tau)*norm.cdf(-d1)
    return t / 365 if per_day else t


def rho(S, K, r, sigma, tau, q=0.0, option="call", per_pct=True):
    _, d2 = _d1_d2(S, K, r, q, sigma, tau)
    if option == "call":
        rh = K * tau * np.exp(-r*tau) * norm.cdf(d2)
    else:
        rh = -K * tau * np.exp(-r*tau) * norm.cdf(-d2)
    return rh / 100 if per_pct else rh


# ====== 二阶 Greeks ======

def vanna(S, K, r, sigma, tau, q=0.0):
    """∂²V/∂S∂σ = ∂Δ/∂σ"""
    d1, d2 = _d1_d2(S, K, r, q, sigma, tau)
    return -np.exp(-q*tau) * norm.pdf(d1) * d2 / sigma


def volga(S, K, r, sigma, tau, q=0.0):
    """∂²V/∂σ² (also called Vomma)"""
    d1, d2 = _d1_d2(S, K, r, q, sigma, tau)
    return S * np.exp(-q*tau) * norm.pdf(d1) * np.sqrt(tau) * d1 * d2 / sigma


def charm(S, K, r, sigma, tau, q=0.0, option="call", per_day=True):
    """∂Δ/∂t (Delta decay)"""
    d1, d2 = _d1_d2(S, K, r, q, sigma, tau)
    common = -np.exp(-q*tau) * norm.pdf(d1) * (2*(r-q)*tau - d2*sigma*np.sqrt(tau)) / (2*tau*sigma*np.sqrt(tau))
    if option == "call":
        c = q * np.exp(-q*tau) * norm.cdf(d1) + common
    else:
        c = -q * np.exp(-q*tau) * norm.cdf(-d1) + common
    return c / 365 if per_day else c


def color(S, K, r, sigma, tau, q=0.0, per_day=True):
    """∂Γ/∂t (Gamma decay)"""
    d1, d2 = _d1_d2(S, K, r, q, sigma, tau)
    co = -np.exp(-q*tau) * norm.pdf(d1) / (2*S*tau*sigma*np.sqrt(tau)) * (
        2*q*tau + 1 + (2*(r-q)*tau - d2*sigma*np.sqrt(tau))*d1/(sigma*np.sqrt(tau))
    )
    return co / 365 if per_day else co


# ====== Inverse contract 修正 (Deribit BTC/ETH 期权) ======

def inverse_delta(S, K, r, sigma, tau, q=0.0, option="call"):
    """
    Deribit BTC/ETH 期权 premium 以 BTC 计价 (inverse contract)
    Delta_inverse = ∂(C/S)/∂S, 与传统 USD-quoted Delta 不同
    Delta_inv = (∂C/∂S - C/S) / S = (Δ - C/S) / S ?  实际上:
    用 C_BTC = C_USD / S, 则
        ∂C_BTC/∂S = (∂C_USD/∂S * S - C_USD)/S²
                  = Δ/S - C_USD/S²
    """
    from scipy.stats import norm
    d1, d2 = _d1_d2(S, K, r, q, sigma, tau)
    if option == "call":
        C_usd = S*np.exp(-q*tau)*norm.cdf(d1) - K*np.exp(-r*tau)*norm.cdf(d2)
        Delta_usd = np.exp(-q*tau)*norm.cdf(d1)
    else:
        C_usd = K*np.exp(-r*tau)*norm.cdf(-d2) - S*np.exp(-q*tau)*norm.cdf(-d1)
        Delta_usd = np.exp(-q*tau)*(norm.cdf(d1) - 1)
    return Delta_usd / S - C_usd / S**2


# ====== 主流程 ======

def main():
    S = 65000.0
    K = 65000.0       # ATM
    r = 0.05
    sigma = 0.65
    tau = 30/365
    q = 0.0

    print("=" * 60)
    print(f"BTC ATM 30d 期权 Greeks (S=K={S}, σ={sigma}, τ={tau:.4f}y)")
    print("=" * 60)

    print("\n  一阶 Greeks (Call):")
    print(f"    Delta:  {delta(S, K, r, sigma, tau, q, 'call'):+.4f}")
    print(f"    Gamma:  {gamma(S, K, r, sigma, tau, q):.6f} per $")
    print(f"    Vega:   ${vega(S, K, r, sigma, tau, q):.2f}  per 1% IV")
    print(f"    Theta:  ${theta(S, K, r, sigma, tau, q, 'call'):.2f}  per day")
    print(f"    Rho:    ${rho(S, K, r, sigma, tau, q, 'call'):.2f}  per 1% rate")

    print("\n  二阶 Greeks (Call):")
    print(f"    Vanna:  {vanna(S, K, r, sigma, tau, q):+.4f}")
    print(f"    Volga:  {volga(S, K, r, sigma, tau, q):.2f}")
    print(f"    Charm:  {charm(S, K, r, sigma, tau, q):+.6f}  per day")
    print(f"    Color:  {color(S, K, r, sigma, tau, q):+.8f}  per day")

    # 不同行权价的 Greeks 表
    print("\n" + "=" * 60)
    print(f"行权价敏感性 (S={S}, σ={sigma}, τ={tau:.4f}y)")
    print("=" * 60)
    print(f"  {'K':>8} {'Δ':>8} {'Γ×10⁵':>10} {'Vega':>8} {'Vanna':>8}")
    for Kt in [55000, 60000, 65000, 70000, 75000]:
        d_ = delta(S, Kt, r, sigma, tau, q, 'call')
        g_ = gamma(S, Kt, r, sigma, tau, q) * 1e5
        v_ = vega(S, Kt, r, sigma, tau, q)
        vn_ = vanna(S, Kt, r, sigma, tau, q)
        print(f"  {Kt:>8} {d_:+8.4f} {g_:>10.3f} {v_:>8.2f} {vn_:+8.4f}")

    # Inverse contract Delta
    print("\n" + "=" * 60)
    print(f"Inverse Delta (Deribit-style, premium 以 BTC 报价)")
    print("=" * 60)
    print(f"  USD-quoted Delta:     {delta(S, K, r, sigma, tau, q, 'call'):+.4f}")
    print(f"  Inverse Delta (×S):   {inverse_delta(S, K, r, sigma, tau, q, 'call')*S:+.4f}")


if __name__ == "__main__":
    main()

预期输出

一阶 Greeks (Call):
  Delta:  +0.5418
  Gamma:  0.000033 per $
  Vega:   $73.25  per 1% IV
  Theta:  $-58.41 per day
  Rho:    $14.32  per 1% rate

四、真实数据/案例

Deribit BTC-25JUL26-65000-C 实测

API: GET /api/v2/public/get_book_summary_by_instrument?instrument_name=BTC-25JUL26-65000-C

返回字段(节选):

{
  "delta": 0.5384,
  "gamma": 0.0000312,
  "vega": 73.42,
  "theta": -58.62,
  "mark_iv": 64.2,
  "underlying_price": 65210
}

我们 Python 实现的 Delta/Gamma/Vega 与 Deribit 报价误差 < 0.5%(差异主要来自:Deribit 用 mid-IV 计算,我们用 mark_iv;以及 Deribit 用具体的 funding-implied $r$)。

Vega 风险敞口实例

某 MM 持有 BTC ATM Call 100 contracts (1 BTC 名义):

  • Vega per contract = $73.25 / 1% IV
  • 总 Vega = $7,325 / 1% IV
  • IV 从 65% 跳到 75%(10个百分点)→ 损益 = 100 × $73.25 × 10 = $73,250 (long Vega 赚)

五、加密市场特化

5.1 Inverse Contract 的 Greeks 修正

Deribit BTC/ETH 期权用 inverse 方式:premium 以 BTC 计价。设 $C_{\text{BTC}} = C_{\text{USD}}/S$,链式法则:

$$ \frac{\partial C_{\text{BTC}}}{\partial S} = \frac{\Delta_{\text{USD}}}{S} - \frac{C_{\text{USD}}}{S^2} $$

实际意义:inverse Delta 的"对冲量"是 USD,与传统 Delta 含义反过来。机构做市商必须用专门的 inverse Greeks 引擎。

5.2 24/7 市场对 Theta 计算

加密用 365 天/年(不是 252):

  • $\Theta_{\text{daily}} = \Theta / 365$
  • 周末 Theta 仍发生(市场开放)

5.3 高 IV 下 Greeks 的非线性

IV = 100% 时,$d_1, d_2$ 数值大,$N'(d_1)$ 可能很小。极端 OTM 期权 Delta/Gamma 几乎为 0 但 Vega 仍可观——意味着这些 wing 期权对 IV smile 的"形状"敏感。

5.4 Funding Rate 等价于 Delta 的资金成本

持有 1 Delta 等价于持有 1 BTC,需要支付 funding rate(如果做多永续)。期权对冲成本中要计入 funding。机构的"真实 Theta"= BS Theta − funding cost


六、常见陷阱

  1. Vega 单位混乱:教科书 Vega per "1.0 IV",市场惯例 per "1% IV"。代码中显式标记。

  2. Theta 单位:per-year vs per-day,差 365 倍。

  3. Inverse contract Delta:直接用 USD-quoted Delta 对冲会算错对冲量。

  4. Gamma 在到期日的离散:临到期 ATM Gamma 数值不稳定,需用更小的 $S$ 步长。

  5. Vanna 符号:$\text{Vanna}{\text{call}} = \text{Vanna}{\text{put}}$,但许多教材对符号约定不一致。统一用 $\partial^2 V/\partial S \partial \sigma$。

  6. Volga 在 ATM 接近 0:$d_1 d_2 \approx 0$ ATM。Volga 主要在 OTM 显著。


七、关键速查

GreekCallPut
$\Delta$$e^{-q\tau} N(d_1)$$-e^{-q\tau} N(-d_1)$
$\Gamma$$e^{-q\tau} N'(d_1) / (S\sigma\sqrt\tau)$同 Call
$\mathcal{V}$$S e^{-q\tau} N'(d_1) \sqrt\tau$同 Call
$\Theta$$-\frac{Se^{-q\tau}N'(d_1)\sigma}{2\sqrt\tau} - rKe^{-r\tau}N(d_2) + qSe^{-q\tau}N(d_1)$swap 符号
$\rho$$K\tau e^{-r\tau}N(d_2)$$-K\tau e^{-r\tau}N(-d_2)$
Vanna$-e^{-q\tau} N'(d_1) d_2/\sigma$同 Call
Volga$\mathcal{V} \cdot d_1 d_2 / \sigma$同 Call

八、面试题

Q1: Delta-hedged 期权头寸的 P&L 来自哪里?

主要来自 $\frac{1}{2}\Gamma S^2 (\sigma_R^2 - \sigma_I^2) dt$。Long option + Delta hedge 在已实现波动率 > 隐含时盈利。这就是 "gamma scalping"。

Q2: 为什么 ATM 期权 Vega 最大?

Vega = $S e^{-q\tau} N'(d_1) \sqrt\tau$。$N'(d_1)$ 在 $d_1=0$(即 $S=K e^{(r-q-\sigma^2/2)\tau} \approx K$)最大。直观:IV 微变最能影响 ATM 期权的 ITM 概率。

Q3: 短期 ATM 期权的 Gamma 风险怎么管理?

限制 net gamma exposure;用更短期的 ATM 长 gamma 对冲(同样高 gamma);或者在到期日提前 unwind ATM 头寸避免 pin risk。机构常用 "gamma ladder" — 不同到期日 stagger。

Q4: 解释 Vanna 在做市商风险管理中的角色。

Vanna = $\partial \Delta/\partial \sigma$。市场跌时 IV 通常涨,Vanna 让原本 Delta-flat 头寸变 Delta-short,做市商必须买入标的回补 Delta,加剧上涨/下跌。机构会持有"Vanna-neutral"组合避免这种二阶风险。

Q5: Deribit inverse 期权 Delta 与传统 USD-quoted Delta 有什么区别?怎么对冲?

Deribit premium 以 BTC 报价,所以 Delta_inv = Delta_USD/S − C_USD/S²。对冲量是 USD 现金,不是 BTC。机构需要专门的 inverse Greeks 计算引擎。


九、明日预告

Day 65: 隐含波动率 — IV 曲线、Smile、Skew、Newton-Raphson 反解。明天我们从市场报价反推 IV,并理解为什么 BS 模型在加密市场总是给出"smile"或"skew"——这是市场告诉我们 BS 哪里错了。