誰にも観測できない入力
ブラック=ショールズの式で、現物価格、行使価格、金利、期間は分かっています。ボラティリティは分からず、将来の値動きについての市場の期待で、毎日変わります。そのためオプション価格は、推測するしかない数に大きく依存し、それへの感応度であるベガ 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%ベガが最大になる場所
ベガはアット・ザ・マネーのオプションで最大になります。結果が最も不確実で、追加のボラティリティの影響が最も大きいからで、深いイン・ザ・マネーやアウト・オブ・ザ・マネーでは小さくなります(行使価格80:23.8、100:37.5、120:21.6)。ガンマと違い、ベガは満期までの期間とともに大きくなります。3か月で19.6、1年で37.5、4年で62.5です。期間が長いほどボラティリティが効く時間が増えるからです。したがって長期のオプションはボラティリティの変化に最も敏感で、短期のオプションはガンマに最も敏感です。
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 / 100、ボラティリティが20%から21%になったときの価格変化)で示します。市場の動揺のようにボラティリティが10ポイント跳ね上がると、アット・ザ・マネーのオプションは約 0.375 * 10 = 3.75、価格の36%近く動きます。デルタやガンマと同様に、どんなモデルのベガも、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- ベガ =
S * pdf(d1) * sqrt(T)。正で、コールとプットで同じ、アット・ザ・マネーで最大、期間とともに増える - ボラティリティ1ポイントあたり(
vega / 100)で示す。数値的には(f(sigma + h) - f(sigma - h)) / (2h)がどのモデルにも使える - 価格変化 ≈
ポイントあたりベガ * ポイント数。ボラティリティの跳ね上がりは株の値動きと同じくらい重要で、インプライド・ボラティリティが市場の提示
次はシータとローです。時間と金利への感応度を学びます。
ラボ:採点される内容
vegaでボラティリティへの感応度を測る25点vega_per_pointでボラティリティ1ポイントあたりのベガを示す25点numerical_vegaでボラティリティを少し動かして測る25点price_change_from_volでボラティリティ変動の影響を予測する25点