Greeks 全解 — 一阶/二阶敏感度
Delta/Gamma/Vega/Theta/Rho 推导,二阶 Greeks (Vanna/Volga/Charm),对冲 P&L 分解
日期: 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。
六、常见陷阱
-
Vega 单位混乱:教科书 Vega per "1.0 IV",市场惯例 per "1% IV"。代码中显式标记。
-
Theta 单位:per-year vs per-day,差 365 倍。
-
Inverse contract Delta:直接用 USD-quoted Delta 对冲会算错对冲量。
-
Gamma 在到期日的离散:临到期 ATM Gamma 数值不稳定,需用更小的 $S$ 步长。
-
Vanna 符号:$\text{Vanna}{\text{call}} = \text{Vanna}{\text{put}}$,但许多教材对符号约定不一致。统一用 $\partial^2 V/\partial S \partial \sigma$。
-
Volga 在 ATM 接近 0:$d_1 d_2 \approx 0$ ATM。Volga 主要在 OTM 显著。
七、关键速查
| Greek | Call | Put |
|---|---|---|
| $\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 哪里错了。