σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft Academy学习路线
Ctrl K
AO
+1.2k 位学习者
登录加入 ↗
学习路线
AO
+1.2k 位学习者
登录
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Python 学习路线›模块 4 · 固定收益与期权定价›主题 4.9·~45分钟中级

Delta

路线进度模块 4/11 · 主题 9/16
4.9 Delta
—实验得分— / 100总 XP—连续天数—

对股价的敏感度

持有期权的交易员需要知道股价变动时账户会怎样。Delta 就是答案:股价每变动一个单位,期权价格的变化,即 dC/dS。看涨期权的 delta 在 0 到 1 之间,看跌在 -1 到 0 之间。在布莱克-斯科尔斯模型中,看涨 delta 就是 N(d1),看跌 delta 是 N(d1) - 1。delta 为 0.64 的平值一年期看涨期权,在股价上涨一美元时约增值 64 美分。delta 也大致可以理解为期权到期时处于实值的概率。

import math

def norm_cdf(x):
    return 0.5 * (1 + math.erf(x / math.sqrt(2)))

def d1(spot, strike, rate, sigma, t):
    return (math.log(spot / strike) + (rate + 0.5 * sigma ** 2) * t) / (sigma * math.sqrt(t))

def call_delta(spot, strike, rate, sigma, t):
    return norm_cdf(d1(spot, strike, rate, sigma, t))

for spot in (80, 90, 100, 110, 120):
    delta = call_delta(spot, 100, 0.05, 0.2, 1)
    print(spot, round(delta, 4), round(delta - 1, 4))      # the call delta and the put delta
# 80 0.2219 -0.7781
# 90 0.4298 -0.5702
# 100 0.6368 -0.3632
# 110 0.7958 -0.2042
# 120 0.8965 -0.1035     deep in the money: the call moves almost one for one with the stock

通过扰动来测量 delta

闭式公式只存在于简单期权。对任何定价模型,都可以数值估计 delta:在股价略高和略低两处给期权定价,再除以间距。中心差分 (f(S + h) - f(S - h)) / (2h) 比单侧差分更精确,对抛物线甚至是精确的。同一个函数对蒙特卡洛价格或二叉树都适用,所以这种「扰动后重新定价」是获得敏感度的通用办法。h 要小,但不能小到舍入噪声占主导(取股价的 1% 是典型的起点)。

def bs_call(spot, strike, rate, sigma, t):
    d_1 = d1(spot, strike, rate, sigma, t)
    return spot * norm_cdf(d_1) - strike * math.exp(-rate * t) * norm_cdf(d_1 - sigma * math.sqrt(t))

def numerical_delta(price_function, spot, bump):
    return (price_function(spot + bump) - price_function(spot - bump)) / (2 * bump)

price = lambda s: bs_call(s, 100, 0.05, 0.2, 1)          # any function of the spot price will do
print(round(numerical_delta(price, 100, 0.01), 6))        # 0.636831
print(round(call_delta(100, 100, 0.05, 0.2, 1), 6))       # 0.636831   the same as the formula

用 delta 对冲

Delta 把期权头寸变成等价的股票头寸。一份标的 100 股、delta 为 0.64 的看涨合约,在小幅变动中相当于持有 64 股。要消除风险敞口就取相反的头寸:持有 10 份看涨合约多头,就卖出 10 * 100 * 0.6368 = 637 股。对冲后的组合是 delta 中性的:股价小幅波动时其价值几乎不变。对冲只对当前价格正确,所以股价和 delta 变化时必须调整。调整多频繁,是风险与交易成本之间的权衡。

def hedge_shares(contracts, delta, multiplier=100):
    return -contracts * multiplier * delta

delta = call_delta(100, 100, 0.05, 0.2, 1)
print(round(hedge_shares(10, delta), 1))            # -636.8   long 10 call contracts: sell about 637 shares
print(round(hedge_shares(-10, delta), 1))           # 636.8    short 10 call contracts: buy about 637 shares

# After a $1 move the options gain about delta * 1 each and the shares lose about the same
print(round(bs_call(101, 100, 0.05, 0.2, 1) - bs_call(100, 100, 0.05, 0.2, 1), 4))    # 0.6461   close to delta, not exactly
# Delta as expiry approaches: at the money it stays near 0.5, in the money it goes to 1, out of the money to 0
for t in (1, 0.25, 0.02):
    print(t, [round(call_delta(spot, 100, 0.05, 0.2, t), 4) for spot in (90, 100, 110)])
# 1 [0.4298, 0.6368, 0.7958]
# 0.25 [0.1898, 0.5695, 0.8704]
# 0.02 [0.0001, 0.5197, 0.9997]
delta 会变化,对冲会失效Delta 只是一阶效应。在 100 处 delta 为 0.64 的看涨期权,在 110 处是 0.80,在 90 处是 0.43,所以在 100 处设定的对冲在大幅变动后就不对了,而且 delta 也随时间漂移(虚值期权的 delta 在临近到期时向 0 融化)。delta 变化的速度就是下一个敏感度:gamma。
  • 看涨 delta N(d1) 在 (0, 1);看跌 delta N(d1) - 1 在 (-1, 0):一份期权对应的股票数量。
  • 数值 delta (f(S + h) - f(S - h)) / (2h) 适用于任何定价模型;h 要小,但要大于舍入噪声。
  • 对冲股数 = -合约数 * 乘数 * delta 使组合对小幅变动 delta 中性;delta 变化时需再平衡。

下一节:Gamma,delta 本身的敏感度,说明对冲多快就会过时。

实验:评分内容

  • 用 call_delta 衡量看涨期权对股价的敏感度25 分
  • 用 put_delta 推出看跌期权的 delta25 分
  • 用 numerical_delta 通过扰动价格来测 delta25 分
  • 用 hedge_shares 使仓位中性25 分
资源管理器 · lab-74-1
▾ lab-74-1
…
bash · 浏览器内
learner@quantcraft:~/lab-74-1$
Python 尚未加载PythonLn 1, Col 1Spaces: 4UTF-8

要重置此主题吗?

lab-74-1 中的所有内容将恢复为初始文件,终端也会被清空。你当前的解答将丢失,且无法撤销。

将被重置
  • main.py → 初始代码
  • 终端历史与测试输出
  • 未提交的更改
将被保留
  • 实验最高得分
  • 你的 XP 与连续天数
  • 讲解进度与笔记

登录后即可运行你的代码。

所有讲解均可免费阅读。创建账户或登录后,即可运行代码、运行测试并提交此实验。

  • 浏览器内 IDE 与 bash 终端,无需安装
  • 即时评分、XP 以及你在学习路线中的位置
创建账户登录
或
使用 GitHub 继续