Implied Volatility کیسے calculate کی جاتی ہے؟
Implied volatility کا closed-form formula نہیں۔ جانیں solver option price سے اسے iteration کے ذریعے کیسے نکالتا ہے، Python code کیسے کام کرتا ہے، اور مختلف numbers کی وجوہات۔
Implied volatility iteration کے ذریعے calculate کی جاتی ہے، کسی براہِ راست formula سے نہیں۔ کوئی closed-form expression ایسا نہیں جو option کی market price کو واپس volatility number میں تبدیل کر سکے۔ اس لیے solver ایک volatility کا اندازہ لگاتا ہے، Black-Scholes کے ذریعے option کی price نکالتا ہے، اس model price کا quote سے موازنہ کرتا ہے، اور یہ عمل اس وقت تک دہراتا ہے جب دونوں prices میں penny تک مطابقت نہ آ جائے۔ آگے مکمل طریقہ بیان کیا گیا ہے: pricing function، standard library Python میں search loop، اور وہ وجوہ جن کی بنا پر دو vendors ایک ہی contract کے لیے مختلف numbers شائع کرتے ہیں۔
Implied volatility کا کوئی closed-form formula کیوں نہیں
Black-Scholes ایک ہی سمت میں کام کرتا ہے۔ اسے spot price، strike، expiry تک باقی وقت، interest rate اور volatility دیں، تو یہ theoretical price واپس کرتا ہے۔ ان چھ مقداروں میں سے پانچ observable ہیں۔ Volatility observable نہیں ہوتی۔ یہ اس بات کا مفروضہ ہے کہ موجودہ وقت سے expiry تک stock کتنی دور تک حرکت کرے گا۔
Traders اس مسئلے کو الٹی سمت میں حل کرتے ہیں۔ Price اسکرین پر موجود ہوتی ہے، جبکہ volatility نامعلوم ہوتی ہے۔ Implied volatility وہ volatility input ہے جو Black-Scholes price کو option کی market price کے برابر کر دیتا ہے۔ Sigma، یعنی volatility term، normal distribution function کے اندر d1 اور d2، دونوں میں، دو مرتبہ شامل ہوتی ہے، اور کوئی algebraic rearrangement اسے الگ نہیں کر سکتا۔ Algebra یہاں رک جاتا ہے۔ اس کے بعد numerical search کام کرتی ہے۔ Implied volatility کیا measure کرتی ہے میں اس کی تشریح دی گئی ہے؛ یہ صفحہ طریقۂ کار پر مرکوز ہے۔
Model کی دو خصوصیات search کو آسان بناتی ہیں۔ Volatility بڑھنے پر call کی model price ہر بار بڑھتی ہے، اور اس میں کوئی استثنا نہیں ہوتا۔ یہ تبدیلی smooth ہوتی ہے۔ جو quantity صرف بڑھتی ہو، اس کے گرد bracket کو بتدریج تنگ کر کے مطلوبہ قدر معلوم کی جا سکتی ہے۔
حل کنندہ ہر contract کے لیے ایک بار چلتا ہے
Output ہر stock کے لیے ایک نہیں بلکہ ہر contract کے لیے ایک number ہوتا ہے، اور ایک ہی stock کے contracts، جو اسی expiry window میں ہوں، ایک دوسرے سے مختلف نتائج دیتے ہیں۔ Apple (AAPL) کے وہ تمام options جن کی مدت 20 سے 45 دن باقی تھی اور جن میں June 30, 2026 کو trading ہوئی، share price کے مقابلے میں strike کو fraction کے طور پر ظاہر کرتے ہوئے strike کے لحاظ سے گروپ کیے گئے:
ہر عدد کے پیچھے موجود درست 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)strike ladder کو اوپر سے نیچے پڑھنے پر 0.80-0.90 zone کا حل 35.5%، جبکہ 0.95-1.00 zone کا حل 28.1% آیا، اور 1.10-1.20 zone کا حل 27.3% آیا۔ ایک company، ایک session، 6 جوابات۔ اس curve کے خم کا ایک نام ہے: volatility skew، اور کسی ایک stock کے لیے ایک ہی volatility اسے ظاہر نہیں کر سکتی۔
وہ Black-Scholes price جس سے solver کو match کرنا ہے
S سے مراد share price، K سے strike price، T سے expiry تک سالوں میں باقی وقت، r سے risk-free rate، اور N() سے standard normal cumulative distribution ہے۔ اس کا مطلب یہ ہے کہ standard normal draw کے کسی دیے گئے point سے نیچے آنے کا امکان۔ Python میں یہ آخری حصہ math.erf میں موجود ہے، اس لیے صرف interpreter کافی ہے۔
apt-get update && apt-get install -y python3
اگر آپ root نہیں ہیں تو کسی machine پر دونوں commands کے آغاز میں 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)
یہ مکمل forward model ہے۔ اسے volatility دیں اور یہ price واپس دے گا۔
Implied volatility کا حساب، مرحلہ وار
Bisection وہ طریقہ ہے جسے سب سے پہلے سیکھنا چاہیے۔ یہ diverge نہیں ہوتا اور اس کے لیے calculus کی ضرورت بھی نہیں ہوتی۔
- جواب کو 0.01 (سالانہ 1%) اور 5.0 (500%) کے درمیان محدود کریں۔ ہر traded option اسی range کے اندر ہوتا ہے۔
- اس range کے midpoint پر option کی قیمت نکالیں۔
- اگر model price market quote سے زیادہ ہو تو اندازہ بہت زیادہ تھا: range کی اوپری حد کو midpoint تک نیچے لے آئیں۔ اگر model price کم ہو تو نچلی حد کو اوپر لے جائیں۔
- اس وقت رکیں جب model price، quote سے ایک cent کے اندر آ جائے۔
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 دکھاتا ہے، یعنی اس فرضی quote کے لیے سالانہ implied volatility تقریباً 22.6% ہے۔ ہر iteration میں range نصف رہ جاتی ہے۔ 4.99 چوڑی range کو بیس مرتبہ نصف کرنے کے بعد اس کی چوڑائی 0.00001 سے بھی کم ہو جاتی ہے، اس لیے 100 iterations کی حد کبھی رکاوٹ نہیں بنتی۔
Newton-Raphson زیادہ تیزی سے کیوں converge کرتا ہے، اور کہاں ناکام ہوتا ہے
Bisection اس معلومات کو نظرانداز کرتا ہے جو model پہلے ہی فراہم کر رہا ہوتا ہے۔ Vega volatility میں فی unit تبدیلی کے مقابل option کی price میں تبدیلی ہے، اور Black-Scholes اسے closed form میں فراہم کرتا ہے۔ Newton-Raphson اسے slope کے طور پر استعمال کرتا ہے: pricing error ناپیں، اسے vega سے تقسیم کریں، اور guess کو اتنی ہی مقدار سے آگے بڑھائیں۔
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
At the money کے قریب یہ طریقہ Bisection کے درجن بھر passes کے مقابلے میں تین یا چار passes میں نتیجہ دے دیتا ہے۔ ناکامی کا سبب denominator میں ہوتا ہے: strike price، share price سے جتنا دور جائے، vega اتنا ہی کم ہو جاتا ہے۔ یہی AAPL contracts ہیں، جن میں ہر zone کا average vega، at the money reading کے فیصد کے طور پر دکھایا گیا ہے:
ہر عدد کے پیچھے موجود درست 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)Wings میں sensitivity کا صرف ایک حصہ باقی رہتا ہے: 33.1% at the money vega، 0.80-0.90 zone میں، اور 31.6%، 1.10-1.20 zone میں۔ اتنی چھوٹی رقم سے pricing error کو تقسیم کرنے پر step بہت بڑا بن جاتا ہے۔ اس کے نتیجے میں guess صفر سے نیچے جا سکتا ہے، جہاں model کے پاس مزید کوئی قابلِ استعمال جواب نہیں ہوتا۔ Production solvers دونوں طریقوں کو ساتھ استعمال کرتے ہیں: پہلے bracketing کی جاتی ہے، پھر Newton سے نتیجے کو polish کیا جاتا ہے۔ Vega خود greek کی وضاحت کرتا ہے۔
دو ذرائع مختلف implied volatility کیوں رپورٹ کرتے ہیں
Model عوامی ہے اور arithmetic طے شدہ ہے، اس لیے اختلاف inputs میں پیدا ہوتا ہے۔
- Mid اور last میں فرق۔ Solver کو ایک قیمت درکار ہوتی ہے۔ اگر کسی contract کا bid $2.00 اور offer $2.20 ہو تو midpoint $2.10 ہوگا، جبکہ last print نوے منٹ پہلے $2.02 کا ہو سکتا ہے۔ ایسے contract میں قیمت کے دس cents، volatility کے ایک point سے زیادہ اہم ہوتے ہیں۔
- Dividends اور carry۔ اوپر دیا گیا function ایسے stock پر European call کی قیمت نکالتا ہے جو کوئی dividend ادا نہیں کرتا۔ expiry سے پہلے dividend کی ادائیگی forward price کو کم کرتی ہے، اور ہر desk اپنی adjustment اور اپنی rate استعمال کرتا ہے۔
- American early exercise۔ US single-stock options کو کسی بھی دن exercise کیا جا سکتا ہے، اور اس حق کی قدر ہوتی ہے جسے European formula میں شامل کرنے کی گنجائش نہیں۔ جو solver اس حق کو نظرانداز کرے، وہ فرق کو volatility میں منتقل کر دیتا ہے۔ Binomial trees exercise کے حق کی قیمت براہِ راست نکالتے ہیں۔
- Stale quotes۔ منگل کو last trade ہونے والا strike اب بھی quote دکھا سکتا ہے، اور solver اسے موصول ہونے والی قیمت کو درست سمجھ کر استعمال کرتا ہے۔
Convergence سے آخری دو مسائل نمایاں ہو جاتے ہیں۔ ذیل کا panel June 30, 2026 کو آٹھ معروف ناموں کا جائزہ لیتا ہے، 20 سے 45 دن باقی رہنے والے traded contracts گنتا ہے، اور at the money volatility کے ساتھ ان contracts کا تناسب بھی رپورٹ کرتا ہے جن میں solve converged ہوا:
ہر عدد کے پیچھے موجود درست 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 نے 47.7% پر 8 ناموں میں سب سے زیادہ at the money reading دی، جبکہ سب سے کم reading SPY کی 14.4% تھی۔ TSLA chain میں traded contracts میں سے 97.8% نے converged answer دیا۔ باقی strikes ایسے ہیں جہاں solver کو دی گئی قیمت اس حد سے باہر ہے جسے کوئی بھی volatility reproduce نہیں کر سکتی، یا quote intrinsic value سے کم ہے، یا market crossed ہے۔ ایسی شرح کو زیادہ سمجھا جائے یا نہیں، یہ الگ سوال ہے: کیا 30% IV زیادہ ہے اس موضوع کا جائزہ لیتا ہے، جبکہ expected move اسے dollar range میں تبدیل کرتا ہے۔
وہی contract، ہر session میں دوبارہ حل کیا گیا
Implied volatility کے بارے میں کچھ بھی محفوظ نہیں کیا جاتا۔ اسے اسکرین پر موجود قیمت کی بنیاد پر ہر بار دوبارہ calculate کیا جاتا ہے۔ ذیل میں AAPL کا سب سے زیادہ traded contract دیا گیا ہے، جس کی expiry July 17, 2026 ہے۔ اسے June 1 سے expiry تک follow کیا گیا ہے۔ strike price میں کوئی تبدیلی نہیں ہوئی، اور expiry بھی وہی رہی:
ہر عدد کے پیچھے موجود درست 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 date29 sessions کے دوران اس طرح حاصل ہونے والی reading 25.1% پر کھلی، جبکہ expiry تک 46 دن باقی تھے، اور 26.6% پر ختم ہوئی، جب 4 دن باقی تھے۔ اس line کا ہر point اوپر بیان کیے گئے loop کو اس session کے quote پر ایک بار چلانے کا نتیجہ ہے۔ ہماری per-ticker pages بھی یہی solve شائع کرتی ہیں: AAPL implied volatility پوری chain پر روزانہ یہ عمل چلاتا ہے، اس لیے قاری اس page پر موجود code کے ذریعے وہاں دکھائے گئے کسی بھی figure کو reproduce کر سکتا ہے۔
Implied volatility calculation سے متعلق عام سوالات
کیا implied volatility کے لیے کوئی formula موجود ہے؟
نہیں۔ Black-Scholes volatility کو price سے مربوط کرتا ہے، لیکن اس mapping کا کوئی elementary inverse نہیں، کیونکہ sigma normal distribution کے اندر دو مرتبہ ظاہر ہوتا ہے۔ یہاں یا کہیں بھی آپ کو ملنے والی ہر implied volatility iterative solver سے حاصل ہوتی ہے۔
calculation میں کتنی iterations لگتی ہیں؟
ہر bisection pass bracket کو نصف کر دیتا ہے۔ اس لیے 0.01 سے 5.0 کی range بیس passes میں 0.00001 سے کم رہ جاتی ہے، جبکہ کسی quote کو قریب ترین cent تک match کرنے میں عموماً تقریباً ایک درجن passes لگتے ہیں۔ Newton-Raphson، near the money صورتِ حال میں تین یا چار iterations میں نتیجے تک پہنچ جاتا ہے، لیکن جہاں vega کم ہو وہاں اس کے steps غیر مستحکم ہو سکتے ہیں۔
میرے broker اور data vendor کی implied volatility مختلف کیوں دکھائی دیتی ہے؟
دونوں نے solver میں مختلف inputs دیے۔ عام فرق mid quote اور last trade کے درمیان، rate اور dividend assumption میں، اور اس بات میں ہوتا ہے کہ model American early exercise کو بالکل handle کرتا ہے یا نہیں۔ Thin strike پر صرف stale quote ہی جواب کو کئی points تک بدل سکتا ہے۔
کیا ایک ہی strike پر calls اور puts کی implied volatility یکساں ہوتی ہے؟
نظری طور پر ہاں۔ Put-call parity انہیں مشترک strike اور expiry پر باہم مربوط کرتی ہے۔ عملی طور پر دونوں quotes الگ الگ طے ہوتے ہیں، اس لیے solved numbers میں معمولی فرق آ سکتا ہے۔ یہی ایک اور وجہ ہے کہ پوری option chain کے averages مختلف vendors کے درمیان بدلتے رہتے ہیں۔
کیا میں market data کے بغیر implied volatility calculate کر سکتا ہوں؟
ہاں، hypothetical quote کے لیے۔ اوپر دیا گیا code ایک price، strike، spot، expiry تک باقی وقت اور rate لیتا ہے، جو سب دستی طور پر درج کیے جاتے ہیں۔ کسی live vendor number سے match کرنا مشکل حصہ ہے، کیونکہ اس کے لیے وہی inputs درکار ہوتے ہیں جو vendor نے استعمال کیے تھے۔
یہاں موجود ہر panel اپنے پیچھے استعمال ہونے والی SQL محفوظ رکھتا ہے۔ کسی panel کو کھولیں، پھر Strasmore terminal پر live chain کے خلاف یہی solve چلائیں۔