نوسانپذیری ضمنی چگونه محاسبه میشود؟
نوسانپذیری ضمنی با فرمول مستقیم بهدست نمیآید. این مقاله روش تکراری حلگر، کد Python و دلایل اختلاف اعداد فروشندگان برای یک اختیار یکسان را توضیح میدهد.
نوسانپذیری ضمنی با تکرار محاسبه میشود، نه با یک فرمول مستقیم. هیچ عبارت بستهای وجود ندارد که قیمت بازار یک اختیار را دوباره به یک عدد برای نوسانپذیری تبدیل کند. بنابراین حلگر، نوسانپذیری را حدس میزند، قیمت اختیار را با مدل Black-Scholes محاسبه میکند، قیمت مدل را با قیمت اعلامشده مقایسه میکند و این روند را تا زمانی ادامه میدهد که دو قیمت، تا سطح یک سنت، با هم منطبق شوند. در ادامه، کل روش ارائه میشود: تابع قیمتگذاری، حلقه جستوجو در Python استاندارد و دلایل اینکه چرا دو فروشنده برای یک قرارداد یکسان، اعداد متفاوتی منتشر میکنند.
چرا نوسان ضمنی فرمول بسته ندارد
مدل Black-Scholes در یک جهت عمل میکند. قیمت لحظهای، قیمت اعمال، زمان باقیمانده تا سررسید، نرخ بهره و نوسان را به آن میدهید و قیمت نظری را دریافت میکنید. پنج مورد از این شش متغیر قابل مشاهدهاند. نوسان قابل مشاهده نیست. نوسان، فرضی درباره میزان حرکت سهم از زمان حال تا سررسید است.
معاملهگران مسئله را معکوس میکنند. قیمت روی صفحه معاملاتی دیده میشود و نوسان متغیر مجهول است. نوسان ضمنی، ورودی نوسانی است که قیمت محاسبهشده با Black-Scholes را با قیمت بازار اختیار برابر میکند. سیگما، یعنی مؤلفه نوسان، دو بار در تابع توزیع نرمال و در هر دو متغیر d1 و d2 قرار دارد و هیچ بازآرایی جبری نمیتواند آن را بهتنهایی جدا کند. جبر در همینجا متوقف میشود و جستوجوی عددی آغاز میشود. نوسان ضمنی چه چیزی را اندازهگیری میکند به تفسیر این مفهوم میپردازد؛ این صفحه سازوکار محاسبه را توضیح میدهد.
دو ویژگی مدل، این جستوجو را آسان میکنند. قیمت محاسباتی اختیار خرید با افزایش نوسان، بدون هیچ استثنایی، بالا میرود و این تغییر هموار است. مقداری که فقط افزایش مییابد، با محدود کردن بازهای در اطراف آن بهسادگی قابل محاصره است.
حلگر برای هر قرارداد یکبار اجرا میشود
خروجی برای هر قرارداد یک عدد است، نه برای هر سهم یک عدد. قراردادهای مربوط به یک سهم در یک بازه سررسید یکسان نیز با هم اختلاف دارند. همه اختیارهای Apple (AAPL) با 20 تا 45 روز باقیمانده تا سررسید که در 30 ژوئن 2026 معامله شدهاند، بر اساس قیمت اعمال بهعنوان کسری از قیمت سهم دستهبندی شدهاند:
کد دقیق SQL پشت هر عدد
WITH toFloat64(strike_price) / toFloat64(underlying_close) AS moneyness
SELECT multiIf(moneyness < 0.90, '0.80-0.90',
moneyness < 0.95, '0.90-0.95',
moneyness < 1.00, '0.95-1.00',
moneyness < 1.05, '1.00-1.05',
moneyness < 1.10, '1.05-1.10',
'1.10-1.20') AS strike_vs_spot,
round(100 * avg(toFloat64(implied_volatility)), 1) AS implied_vol_pct,
count() AS contract_count
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = toDate('2026-06-30')
AND days_to_expiry BETWEEN 20 AND 45
AND iv_converged = 1
AND volume > 0
AND moneyness BETWEEN 0.80 AND 1.20
GROUP BY strike_vs_spot
ORDER BY min(moneyness)با خواندن نردبان قیمتهای اعمال، ناحیه 0.80-0.90 به 35.5% و ناحیه 0.95-1.00 به 28.1% رسید؛ ناحیه 1.10-1.20 نیز به 27.3% رسید. یک شرکت، یک جلسه معاملاتی و 6 پاسخ. خمیدگی این منحنی نامی دارد: چولگی نوسان؛ و یک نوسانپذیری واحد برای هر سهم نمیتواند آن را ترسیم کند.
قیمت Black-Scholes که حلگر باید با آن منطبق شود
S قیمت سهم، K قیمت اعمال، T زمان باقیمانده تا سررسید برحسب سال، r نرخ بدون ریسک و N() توزیع تجمعی نرمال استاندارد است؛ یعنی احتمال آنکه یک نمونه از توزیع نرمال استاندارد پایینتر از نقطهای معین قرار گیرد. Python این بخش آخر را در math.erf در اختیار دارد؛ بنابراین خود مفسر برای این کار کافی است.
apt-get update && apt-get install -y python3
اگر کاربر root نیستید، هر دو دستور را در یک سیستم با پیشوند sudo اجرا کنید. سپس این کد را با نام iv.py ذخیره کنید:
import math
def norm_cdf(x):
return 0.5 * (1.0 + math.erf(x / math.sqrt(2.0)))
def bs_call(S, K, T, r, sigma):
if T <= 0.0 or sigma <= 0.0:
return max(S - K, 0.0)
d1 = (math.log(S / K) + (r + 0.5 * sigma * sigma) * T) / (sigma * math.sqrt(T))
d2 = d1 - sigma * math.sqrt(T)
return S * norm_cdf(d1) - K * math.exp(-r * T) * norm_cdf(d2)
این کل مدل پیشرو است. یک نوسانپذیری به آن بدهید و قیمت را دریافت کنید.
نحوه محاسبه نوسان ضمنی، گامبهگام
روش دوبخشی نخستین روشی است که باید یاد بگیرید. این روش واگرا نمیشود و به حساب دیفرانسیل و انتگرال نیاز ندارد.
- پاسخ را بین 0٫01 (1 درصد در سال) و 5٫0 (500 درصد) محدود کنید. هر اختیار معاملهشدهای در این دامنه قرار میگیرد.
- اختیار را با نقطه میانی این دامنه قیمتگذاری کنید.
- اگر قیمت مدل از مظنه بازار بالاتر بود، برآورد بیش از حد بالا بوده است؛ کران بالای دامنه را به نقطه میانی کاهش دهید. اگر قیمت مدل پایینتر بود، کران پایین را به نقطه میانی افزایش دهید.
- زمانی متوقف شوید که قیمت مدل حداکثر یک سنت با مظنه فاصله داشته باشد.
def implied_vol(price, S, K, T, r, lo=0.01, hi=5.0, tol=0.01):
for _ in range(100):
mid = 0.5 * (lo + hi)
diff = bs_call(S, K, T, r, mid) - price
if abs(diff) < tol:
return mid
if diff > 0.0:
hi = mid
else:
lo = mid
return 0.5 * (lo + hi)
# $100 stock, $100 strike, three months, 4% rates, $5.00 on the screen
print(round(implied_vol(5.00, 100.0, 100.0, 0.25, 0.04), 4))
python3 iv.py را اجرا کنید. خروجی حدود 0٫226 است؛ یعنی برای این مظنه فرضی، نوسان ضمنی سالانه نزدیک به 22٫6 درصد خواهد بود. در هر مرحله دامنه نصف میشود. دامنهای با عرض 4٫99 پس از بیست بار نصفشدن، از 0٫00001 باریکتر است؛ بنابراین سقف 100 تکرار هرگز محدودکننده نخواهد بود.
چرا روش نیوتن–رافسون سریعتر همگرا میشود و کجا از کار میافتد
روش دوبخشی اطلاعاتی را که مدل از قبل در اختیار دارد کنار میگذارد. Vega تغییر قیمت اختیار بهازای یک واحد تغییر در نوسانپذیری است و Black-Scholes آن را بهصورت بسته ارائه میکند. روش نیوتن–رافسون با وگا مانند شیب برخورد میکند: خطای قیمتگذاری را اندازه میگیرد، آن را بر وگا تقسیم میکند و حدس را به همان میزان تغییر میدهد.
def bs_vega(S, K, T, r, sigma):
d1 = (math.log(S / K) + (r + 0.5 * sigma * sigma) * T) / (sigma * math.sqrt(T))
return S * math.sqrt(T) * math.exp(-0.5 * d1 * d1) / math.sqrt(2.0 * math.pi)
def implied_vol_newton(price, S, K, T, r, sigma=0.5):
for _ in range(20):
v = bs_vega(S, K, T, r, sigma)
if v < 1e-8:
return None # no slope left, hand the job back to bisection
step = (bs_call(S, K, T, r, sigma) - price) / v
sigma -= step
if sigma <= 0.0:
return None # the step overshot into nonsense
if abs(step) < 1e-6:
return sigma
return None
در حوالی قیمت اعمال، این روش در سه یا چهار مرحله به جواب میرسد؛ درحالیکه روش دوبخشی به حدود دوازده مرحله نیاز دارد. نقطه شکست در مخرج کسر است: با فاصله گرفتن قیمت اعمال از قیمت سهم، وگا کاهش مییابد. برای همان قراردادهای AAPL، میانگین وگای هر ناحیه بهصورت درصدی از مقدار وگا در حالت at the money نشان داده شده است:
کد دقیق SQL پشت هر عدد
WITH toFloat64(strike_price) / toFloat64(underlying_close) AS moneyness,
(
SELECT avg(toFloat64(vega))
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = toDate('2026-06-30')
AND days_to_expiry BETWEEN 20 AND 45
AND iv_converged = 1
AND volume > 0
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.025
) AS atm_vega
SELECT multiIf(moneyness < 0.90, '0.80-0.90',
moneyness < 0.95, '0.90-0.95',
moneyness < 1.00, '0.95-1.00',
moneyness < 1.05, '1.00-1.05',
moneyness < 1.10, '1.05-1.10',
'1.10-1.20') AS strike_vs_spot,
round(100 * avg(toFloat64(vega)) / atm_vega, 1) AS vega_pct_of_atm,
count() AS contract_count
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = toDate('2026-06-30')
AND days_to_expiry BETWEEN 20 AND 45
AND iv_converged = 1
AND volume > 0
AND moneyness BETWEEN 0.80 AND 1.20
GROUP BY strike_vs_spot
ORDER BY min(moneyness)بالهای توزیع تنها کسری از حساسیت را دارند: 33.1% از وگای at the money در ناحیه 0.80-0.90 و 31.6% در ناحیه 1.10-1.20. تقسیم خطای قیمتگذاری بر چنین عدد کوچکی، گامی بسیار بزرگ ایجاد میکند و ممکن است حدس را به زیر صفر ببرد؛ جایی که مدل دیگر پاسخی برای ارائه ندارد. حلگرهای مورد استفاده در محیط عملیاتی معمولاً این دو روش را ترکیب میکنند: ابتدا بازه را محصور و سپس با روش نیوتن جواب را دقیق میکنند. وگا خودِ این یونانی را توضیح میدهد.
چرا دو منبع، نوسان ضمنی متفاوتی گزارش میکنند
مدل عمومی است و محاسبات نیز قطعی است؛ بنابراین اختلاف به ورودیها مربوط میشود.
- قیمت میانی در برابر آخرین قیمت. حلگر به یک قیمت نیاز دارد. قراردادی که با قیمت خرید 2٫00 دلار و قیمت فروش 2٫20 دلار مظنه میشود، قیمت میانی 2٫10 دلار دارد؛ اما آخرین معامله ممکن است 90 دقیقه پیش با قیمت 2٫02 دلار انجام شده باشد. در چنین قراردادی، اختلاف 10 سنتی قیمت بیش از یک واحد نوسان ارزش دارد.
- سود سهام و هزینه حمل. تابع بالا، قیمت یک اختیار خرید اروپایی روی سهمی را محاسبه میکند که سود سهام پرداخت نمیکند. پرداخت سود سهام پیش از سررسید، قیمت آتی را کاهش میدهد و هر میز معاملاتی تعدیل و نرخ خود را اعمال میکند.
- اعمال زودهنگام در اختیار آمریکایی. اختیارهای سهام منفرد در آمریکا را میتوان در هر روز اعمال کرد و این حق ارزشی دارد که فرمول اروپایی راهی برای لحاظکردن آن ندارد. حلگری که این موضوع را نادیده بگیرد، اختلاف را در نوسان منظور میکند. درختهای دوجملهای، ارزش حق اعمال را مستقیماً محاسبه میکنند.
- مظنههای قدیمی. ممکن است قراردادی با قیمت اعمال مشخص، آخرین بار روز سهشنبه معامله شده باشد اما همچنان مظنه داشته باشد؛ حلگر نیز هر مقداری را که دریافت کند، بهعنوان واقعیت در نظر میگیرد.
همگرایی، دو مورد آخر را آشکار میکند. جدول زیر هشت نماد شناختهشده را در 30 ژوئن 2026 بررسی میکند، قراردادهای معاملهشده با 20 تا 45 روز باقیمانده تا سررسید را میشمارد و هم نوسان در حالت at the money و هم سهم قراردادهایی را گزارش میکند که حل آنها به همگرایی رسیده است:
کد دقیق SQL پشت هر عدد
WITH abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) AS distance_from_spot
SELECT underlying_symbol AS symbol,
round(100 * avgIf(toFloat64(implied_volatility), iv_converged = 1 AND distance_from_spot < 0.05), 1) AS atm_iv_pct,
round(100 * countIf(iv_converged = 1) / count(), 1) AS solved_pct,
count() AS contract_count
FROM global_markets.options_greeks
WHERE date = toDate('2026-06-30')
AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'TSLA', 'SPY', 'KO', 'JNJ')
AND days_to_expiry BETWEEN 20 AND 45
AND volume > 0
GROUP BY symbol
HAVING countIf(iv_converged = 1 AND distance_from_spot < 0.05) > 0
ORDER BY atm_iv_pct DESCTSLA بالاترین نوسان در حالت at the money را در میان 8 نماد، با رقم 47.7%، ثبت کرد؛ درحالیکه این رقم برای SPY، که در پایین جدول قرار داشت، 14.4% بود. در زنجیره اختیار TSLA، برای 97.8% از قراردادهای معاملهشده پاسخ همگرا بهدست آمد. قراردادهای باقیمانده شامل قیمتهای اعمالی هستند که قیمت ارائهشده به حلگر برای آنها خارج از محدودهای قرار دارد که هر سطحی از نوسان بتواند بازتولید کند؛ از جمله مظنهای پایینتر از ارزش ذاتی یا بازاری دوطرفه و متقاطع. اینکه چنین رقمی بالا محسوب میشود یا نه، پرسش جداگانهای است: آیا IV معادل 30٪ بالا محسوب میشود به این موضوع میپردازد و حرکت مورد انتظار آن را به یک دامنه دلاری تبدیل میکند.
همان قرارداد، حلشده از نو در هر جلسه معاملاتی
هیچ مقداری از نوسان ضمنی ذخیره نمیشود. این مقدار بر اساس قیمتی که روی صفحه قرار دارد، دوباره محاسبه میشود. در ادامه، پرمعاملهترین قرارداد AAPL با سررسید 17 ژوئیه 2026 را از اول ژوئن تا زمان سررسید دنبال میکنیم. قیمت اعمال و تاریخ سررسید هیچکدام تغییر نکردند:
کد دقیق SQL پشت هر عدد
WITH (
SELECT ticker
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = toDate('2026-06-30')
AND expiration_date = toDate('2026-07-17')
AND iv_converged = 1
AND volume > 0
ORDER BY volume DESC
LIMIT 1
) AS pinned_contract
SELECT date,
round(100 * avg(toFloat64(implied_volatility)), 1) AS implied_vol_pct,
round(avg(days_to_expiry)) AS days_to_expiry
FROM global_markets.options_greeks
WHERE ticker = pinned_contract
AND date BETWEEN toDate('2026-06-01') AND toDate('2026-07-17')
AND iv_converged = 1
AND volume > 0
GROUP BY date
ORDER BY dateدر طول 29 جلسه معاملاتی، مقدار محاسبهشده در آغاز برابر با 25.1% بود و 46 روز تا سررسید باقی مانده بود؛ در پایان، این مقدار به 26.6% رسید و 4 روز باقی مانده بود. هر نقطه روی این خط، حاصل یکبار اجرای حلقه بالا با استفاده از مظنه همان جلسه معاملاتی است. صفحات هر نماد ما نیز همین محاسبه را منتشر میکنند: نوسان ضمنی AAPL این محاسبه را هر روز برای کل زنجیره اختیارها اجرا میکند؛ بنابراین خواننده میتواند هر رقم درجشده در آنجا را با کدی که در این صفحه آمده است، بازتولید کند.
پرسشهای متداول درباره محاسبه نوسان ضمنی
آیا نوسان ضمنی فرمول مشخصی دارد؟
خیر. مدل Black-Scholes نوسان را به قیمت نگاشت میکند، اما این نگاشت وارونۀ مقدماتی ندارد؛ زیرا سیگما دو بار درون توزیع نرمال ظاهر میشود. بنابراین هر عدد نوسان ضمنی که در اینجا یا هر جای دیگری میبینید، حاصل کار یک حلگر تکراری است.
این محاسبه به چند تکرار نیاز دارد؟
در هر مرحله از روش دوبخشی، بازۀ محصورکننده نصف میشود. بنابراین بازۀ 0٫01 تا 5٫0 پس از twenty مرحله به کمتر از 0٫00001 میرسد. تطبیق قیمت با مظنۀ بازار تا نزدیکترین سنت نیز معمولاً حدود دوازده تکرار زمان میبرد. روش نیوتن–رافسون در قراردادهای نزدیک به قیمت جاری، معمولاً طی سه یا چهار مرحله به جواب میرسد؛ اما در شرایطی که vega پایین باشد، گامهای آن ممکن است رفتار ناپایداری داشته باشند.
چرا کارگزار من و یک فروشندۀ داده، نوسان ضمنی متفاوتی نشان میدهند؟
آنها ورودیهای متفاوتی به حلگر دادهاند. تفاوتهای رایج شامل مظنۀ میانی در برابر آخرین معامله، فرض مربوط به نرخ بهره و سود تقسیمی، و این موضوع است که آیا مدل اساساً اعمال زودهنگام اختیار آمریکایی را در نظر میگیرد یا نه. در اختیار معاملهای با قیمت اعمال کممعامله، یک مظنۀ قدیمی بهتنهایی میتواند پاسخ را چند واحد جابهجا کند.
آیا اختیارهای خرید و فروش با قیمت اعمال یکسان، نوسان ضمنی یکسانی دارند؟
از نظر نظری، بله. رابطۀ برابری اختیار خریدوفروش، این دو را در قیمت اعمال و سررسید یکسان به هم مرتبط میکند. در عمل، مظنههای این دو اختیار بهطور مستقل تعیین میشوند و اعداد محاسبهشده کمی با هم تفاوت دارند. این موضوع یکی دیگر از دلایلی است که میانگینهای کل زنجیرۀ اختیار در میان فروشندگان مختلف با یکدیگر تفاوت دارند.
آیا میتوانم نوسان ضمنی را بدون دادههای بازار محاسبه کنم؟
بله، برای یک مظنۀ فرضی. کد بالا قیمت، قیمت اعمال، قیمت دارایی پایه، زمان باقیمانده تا سررسید و نرخ بهره را از مقادیری که کاربر بهصورت دستی وارد میکند، دریافت میکند. تطبیق عدد یک فروشندۀ داده با قیمت زنده، بخش دشوارتر کار است؛ زیرا برای این کار باید دقیقاً از همان ورودیهایی استفاده شود که فروشنده به کار برده است.
هر پنل در اینجا SQL مربوط به خود را ذخیره میکند. یکی از پنلها را باز کنید و سپس همین محاسبه را روی یک زنجیرۀ زندۀ اختیار در پایانه Strasmore اجرا کنید.