没人能观察到的输入
在布莱克-斯科尔斯公式中,现价、行权价、利率和时间都是已知的,波动率却不是:它是市场对未来波动的预期,每天都在变。因此期权价格严重依赖一个必须猜的数,而对它的敏感度 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 callvega 是为什么用隐含波动率报价由于波动率是唯一观察不到的输入,价格又对它如此敏感,交易员把公式倒过来用:根据期权的市场价格,解出能复现该价格的波动率。这个数字就是隐含波动率,是期权跨行权价和日期报价与比较的方式,而 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 分