σμ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.11·~45分钟中级

Vega

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

没人能观察到的输入

在布莱克-斯科尔斯公式中,现价、行权价、利率和时间都是已知的,波动率却不是:它是市场对未来波动的预期,每天都在变。因此期权价格严重依赖一个必须猜的数,而对它的敏感度 vega(dC/dsigma)常常是期权账簿最大的风险。在布莱克-斯科尔斯中它是 S * pdf(d1) * sqrt(T),看涨看跌相同且为正:波动率越高,期权总是越值钱。

import math

def norm_pdf(x):
    return math.exp(-0.5 * x * x) / math.sqrt(2 * math.pi)

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

def vega(spot, strike, rate, sigma, t):
    return spot * norm_pdf(d1(spot, strike, rate, sigma, t)) * math.sqrt(t)

print(round(vega(100, 100, 0.05, 0.2, 1), 4))             # 37.524   per change of 1.00 in sigma (100 volatility points)
print(round(vega(100, 100, 0.05, 0.2, 1) / 100, 4))       # 0.3752   per volatility point: sigma from 20% to 21%

vega 在哪里最大

平值期权的 vega 最大,因为那里结果最不确定、额外的波动率影响最大;深度实值或虚值期权的 vega 会消退(行权价 80:23.8,100:37.5,120:21.6)。与 gamma 不同,vega 随到期时间增长:三个月 19.6,一年 37.5,四年 62.5,因为存续期越长,波动率发挥作用的时间越多。所以长期期权最容易受波动率变化影响,而短期期权最容易受 gamma 影响。

for strike in (80, 100, 120):
    print("strike", strike, round(vega(100, strike, 0.05, 0.2, 1), 3))
# strike 80 23.806
# strike 100 37.524
# strike 120 21.601
for t in (0.25, 1, 4):
    print("t", t, round(vega(100, 100, 0.05, 0.2, t), 3))
# t 0.25 19.644
# t 1 37.524
# t 4 62.451       vega grows with time to expiry

测量并使用它

波动率以百分点报价,所以风险部门报告每点 vega:vega / 100,即波动率从 20% 升到 21% 时的价格变化。像市场恐慌那样波动率跳升 10 个点,会使平值期权变动约 0.375 * 10 = 3.75,接近其价格的 36%。与 delta、gamma 一样,可以通过扰动为任何模型测量 vega:分别用 sigma + h 和 sigma - h 定价,再取中心差分。对于大幅变动,线性估计略有偏差,因为价格对波动率也是弯曲的。

def bs_call(spot, strike, rate, sigma, t):
    d_1 = d1(spot, strike, rate, sigma, t)
    return spot * 0.5 * (1 + math.erf(d_1 / math.sqrt(2))) - strike * math.exp(-rate * t) * 0.5 * (1 + math.erf((d_1 - sigma * math.sqrt(t)) / math.sqrt(2)))

def numerical_vega(price_function, sigma, bump):
    return (price_function(sigma + bump) - price_function(sigma - bump)) / (2 * bump)

price = lambda s: bs_call(100, 100, 0.05, s, 1)
print(round(numerical_vega(price, 0.2, 1e-4), 4))                # 37.524   the same as the formula

per_point = vega(100, 100, 0.05, 0.2, 1) / 100
print(round(per_point * 10, 3), round(price(0.30) - price(0.20), 3))    # 3.752 3.781   linear estimate vs exact, for +10 points
# Vega of a put equals vega of a call: build the put price from parity and bump the volatility
put_price = lambda s: bs_call(100, 100, 0.05, s, 1) - 100 + 100 * math.exp(-0.05)
print(round(numerical_vega(put_price, 0.2, 1e-4), 4))       # 37.524   the same number as for the call
vega 是为什么用隐含波动率报价由于波动率是唯一观察不到的输入,价格又对它如此敏感,交易员把公式倒过来用:根据期权的市场价格,解出能复现该价格的波动率。这个数字就是隐含波动率,是期权跨行权价和日期报价与比较的方式,而 vega 说明价格误差会在多大程度上转化为波动率误差:后面的主题正是要建立这些。
  • Vega = S * pdf(d1) * sqrt(T):为正,看涨看跌相同,平值最大,并随期限增长。
  • 按每个波动率点报告(vega / 100);数值上 (f(sigma + h) - f(sigma - h)) / (2h) 适用于任何模型。
  • 价格变化 ≈ 每点 vega * 点数:波动率跳升与股价波动同样重要;隐含波动率就是市场的报价。

下一节:Theta 与 Rho,对时间和利率的敏感度。

实验:评分内容

  • 用 vega 衡量对波动率的敏感度25 分
  • 用 vega_per_point 给出每个波动率点的 vega25 分
  • 用 numerical_vega 扰动波动率25 分
  • 用 price_change_from_vol 预测波动率变动的影响25 分
资源管理器 · lab-76-1
▾ lab-76-1
…
bash · 浏览器内
learner@quantcraft:~/lab-76-1$
Python 尚未加载PythonLn 1, Col 1Spaces: 4UTF-8

要重置此主题吗?

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

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

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

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

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