المُدخل الذي لا يمكن ملاحظته
في صيغة بلاك-شولز السعر الفوري وسعر التنفيذ والمعدل والزمن معلومة. أما التقلب فلا: إنه توقع السوق للحركة المستقبلية، ويتغير كل يوم. فيعتمد سعر الخيار كثيرًا على رقم يجب تخمينه، والحساسية له، فيغا، 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). وبخلاف غاما تكبر فيغا مع الزمن حتى الاستحقاق: 19.6 لثلاثة أشهر و37.5 لسنة و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%. وقفزة بعشر نقاط في التقلب، كما في ذعر السوق، تحرّك الخيار عند النقود بنحو 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): موجبة ومتماثلة للكول والبوت، وأكبر ما تكون عند النقود وتنمو مع الزمن. - اذكرها لكل نقطة تقلب (
vega / 100)؛ وعدديًا يصلح(f(sigma + h) - f(sigma - h)) / (2h)لأي نموذج. - تغير السعر ~
vega_per_point * النقاط: قفزة التقلب تهم قدر حركة السهم؛ والتقلب الضمني هو سعر السوق المعلن.
التالي: ثيتا ورو، الحساسيتان للزمن ولأسعار الفائدة.
المختبر: ما الذي يُقيَّم
- قِس الحساسية للتقلب باستخدام
vega25 نقطة - اذكر فيغا لكل نقطة تقلب باستخدام
vega_per_point25 نقطة - اقلق التقلب باستخدام
numerical_vega25 نقطة - تنبأ بأثر تحرك التقلب باستخدام
price_change_from_vol25 نقطة