Paano Kinakalkula ang Implied Volatility
Alamin kung paano hinahanap ang implied volatility mula sa option price gamit ang iteration, Black-Scholes, Python solver, at mga posibleng pagkakaiba ng vendor.
Kinakalkula ang implied volatility sa pamamagitan ng iteration, hindi ng formula. Walang closed-form expression na direktang nagko-convert sa market price ng isang option pabalik sa volatility number. Kaya nagtatantiya ang solver ng volatility, pine-price ang option gamit ang Black-Scholes, ikinukumpara ang model price sa quote, at inuulit ito hanggang magtugma ang dalawa hanggang sa pinakamalapit na sentimo. Narito ang buong pamamaraan: ang pricing function, ang search loop sa standard library Python, at ang mga dahilan kung bakit magkaibang numero ang inilalathala ng dalawang vendor para sa parehong contract.
Bakit walang closed-form formula ang implied volatility
Isang direksiyon ang takbo ng Black-Scholes. Ibigay ang spot price, strike price, panahon hanggang expiry, interest rate, at volatility, at ibabalik nito ang teoretikal na presyo. Observable ang lima sa anim na quantity na ito. Hindi observable ang volatility. Isa itong assumption kung gaano kalaki ang magiging galaw ng stock mula ngayon hanggang expiry.
Binabaligtad ng mga trader ang problema. Nasa screen ang presyo, at ang volatility ang unknown. Ang implied volatility ay ang volatility input na nagpapantay sa presyo ng Black-Scholes at market price ng option. Ang Sigma, ang volatility term, ay nasa loob ng normal distribution function nang dalawang beses—sa d1 at d2—at walang algebraic rearrangement na makapagbubukod dito. Dito nagtatapos ang algebra. Numerical search ang kasunod. Saklaw ng Sinusukat ng implied volatility ang interpretasyon; saklaw ng page na ito ang mekanismo.
Dalawang katangian ng model ang nagpapadali sa paghahanap. Tumataas ang model price ng call sa tuwing tumataas ang volatility, nang walang exception, at maayos ang galaw nito. Kapag ang isang quantity ay patuloy lamang na tumataas, maaaring hanapan ito ng solusyon sa pamamagitan ng pagsikip ng bracket sa paligid nito.
Isinasagawa ang solver nang isang beses para sa bawat contract
Isang numero ang output para sa bawat contract, hindi isang numero para sa bawat stock. Hindi rin magkakatugma ang mga contract para sa iisang stock na nasa parehong expiry window. Narito ang bawat Apple (AAPL) option na may natitirang 20 hanggang 45 araw at na-trade noong June 30, 2026, na inayos ayon sa strike bilang fraction ng presyo ng share:
Ang eksaktong SQL sa likod ng bawat numero
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)Sa pag-akyat sa strike ladder, ang 0.80-0.90 zone ay nagbigay ng 35.5%, habang ang 0.95-1.00 zone ay nagbigay ng 28.1% at ang 1.10-1.20 zone ay nagbigay ng 27.3%. Isang kumpanya, isang session, 6 sagot. May pangalan ang liko sa curve na ito: ang volatility skew. Hindi ito mailalarawan ng iisang volatility para sa bawat stock.
Ang Black-Scholes price na kailangang itugma ng solver
Ang S ay ang presyo ng share, ang K ang strike, ang T ang panahon hanggang expiry sa taon, ang r ang risk-free rate, at ang N() ang standard normal cumulative distribution. Ibig sabihin, ito ang probability na ang isang standard normal draw ay mas mababa sa itinakdang punto. Nasa math.erf ang bahaging ito sa Python, kaya sapat na ang interpreter mismo.
apt-get update && apt-get install -y python3
Idagdag ang sudo sa unahan ng bawat command kung hindi ikaw ang root sa machine. Pagkatapos, i-save ito bilang 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)
Iyan na ang buong forward model. Magbigay rito ng volatility at makakakuha ka ng price.
Paano kinakalkula ang implied volatility, sunod-sunod na hakbang
Ang bisection ang unang paraang dapat matutuhan. Hindi ito nagdi-diverge at hindi nangangailangan ng calculus.
- I-bracket ang sagot sa pagitan ng 0.01 (1% bawat taon) at 5.0 (500%). Lahat ng traded option ay nasa loob ng range na ito.
- I-price ang option gamit ang midpoint ng bracket.
- Kung mas mataas ang model price kaysa sa market quote, masyadong mataas ang estimate: ibaba ang upper bound ng bracket sa midpoint. Kung mas mababa ito, itaas ang lower bound.
- Huminto kapag ang model price ay nasa loob ng isang sentimo mula sa quote.
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))
Patakbuhin ang python3 iv.py. Magpi-print ito ng humigit-kumulang 0.226, o implied volatility na halos 22.6% bawat taon para sa hypothetical quote na iyon. Sa bawat iteration, nahahati sa dalawa ang bracket. Ang range na 4.99 ay magiging mas makitid sa 0.00001 kapag nahati nang dalawampung beses, kaya hindi maaabot ang 100-iteration ceiling.
Bakit mas mabilis mag-converge ang Newton-Raphson, at kung saan ito pumapalya
Itinatapon ng bisection ang impormasyong hawak na ng model. Ang Vega ay pagbabago sa presyo ng option sa bawat unit ng volatility, at ibinibigay ito ng Black-Scholes sa closed form. Itinuturing ito ng Newton-Raphson bilang slope: sinusukat ang pricing error, hinahati ito sa vega, at ina-adjust ang estimate nang ganoon kalaki.
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 # wala nang slope, ibalik ang trabaho sa bisection
step = (bs_call(S, K, T, r, sigma) - price) / v
sigma -= step
if sigma <= 0.0:
return None # lumampas ang step at naging hindi na makabuluhan
if abs(step) < 1e-6:
return sigma
return None
Kapag near the money, nakukuha nito ang resulta sa tatlo o apat na pass, kumpara sa humigit-kumulang isang dosena sa bisection. Nasa denominator ang failure mode: kumikipot ang vega habang lumalayo ang strike sa presyo ng share. Ang parehong AAPL contracts, kasama ang average vega ng bawat zone bilang porsyento ng at the money reading:
Ang eksaktong SQL sa likod ng bawat numero
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)Maliit na bahagi lamang ng sensitivity ang nasa wings: 33.1% ng at the money vega sa 0.80-0.90 zone, at 31.6% sa 1.10-1.20 zone. Kapag hinati ang pricing error sa napakaliit na numerong ito, nagreresulta ito sa napakalaking step. Maaari nitong itulak ang estimate sa ibaba ng zero, kung saan wala nang masasabi ang model. Pinagsasama ng mga production solver ang dalawang method: nagba-bracket muna, saka pinipino ang resulta gamit ang Newton. Ipinaliliwanag sa Vega ang mismong greek.
Why two sources report different implied volatility
The model is public and the arithmetic is settled, so the disagreement lives in the inputs.
- Mid versus last. The solver needs one price. A contract quoted $2.00 bid and $2.20 offered has a $2.10 midpoint, while the last print might be $2.02 from ninety minutes ago. On a contract like that, ten cents of price is worth more than a point of volatility.
- Dividends and carry. The function above prices a European call on a stock paying nothing. A dividend before expiry lowers the forward price, and each desk applies its own adjustment and its own rate.
- American early exercise. US single stock options can be exercised any day, and that right holds value the European formula has nowhere to put. A solver that ignores it pushes the difference into volatility. Binomial trees price the exercise right directly.
- Stale quotes. A strike that last traded on Tuesday still shows a quote, and the solver treats whatever it is handed as the truth.
Convergence makes the last two visible. The panel below takes eight household names on June 30, 2026, counts traded contracts with 20 to 45 days left, and reports both the at the money volatility and the share of contracts where the solve converged:
Ang eksaktong SQL sa likod ng bawat numero
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 carried the highest at the money reading of the 8 names at 47.7%, against 14.4% for SPY at the bottom. On the TSLA chain, 97.8% of traded contracts produced a converged answer. The remainder are strikes where the price handed to the solver sits outside what any volatility can reproduce, a quote under intrinsic value or a crossed market. Whether a number like that counts as high is a separate question: is 30% IV high takes it up, and the expected move converts it into a dollar range.
Ang parehong kontrata, muling kinakalkula sa bawat session
Walang naka-store na anuman tungkol sa implied volatility. Muling kinakalkula ito batay sa presyong nasa screen. Nasa ibaba ang pinakamaraming na-trade na AAPL contract na mag-e-expire sa July 17, 2026, na sinubaybayan mula June 1 hanggang sa expiry. Hindi nagbago ang strike at hindi rin nagbago ang expiry:
Ang eksaktong SQL sa likod ng bawat numero
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 dateSa loob ng 29 sessions, nagsimula ang nakalkulang reading sa 25.1% na may 46 araw bago ang expiry at nagtapos sa 26.6% na may natitirang 4 araw. Bawat punto sa linyang iyon ay isang pagtakbo ng loop sa itaas gamit ang quote para sa session na iyon. Inilalathala ng aming mga page para sa bawat ticker ang parehong kalkulasyon: araw-araw itong pinapatakbo ng implied volatility ng AAPL sa buong chain, kaya maaaring i-reproduce ng mambabasa ang anumang figure doon gamit ang code sa page na ito.
FAQ sa pagkalkula ng implied volatility
May formula ba para sa implied volatility?
Wala. Itinatapat ng Black-Scholes ang volatility sa presyo, ngunit walang elementary inverse ang mapping na iyon dahil dalawang beses lumilitaw ang sigma sa loob ng normal distribution. Bawat numerong implied volatility na nakikita mo rito o saanman ay nagmumula sa isang iterative solver.
Ilang iteration ang kailangan ng kalkulasyon?
Sa bawat bisection pass, hinahati sa kalahati ang bracket. Kaya ang range na 0.01 hanggang 5.0 ay lumiit nang mas mababa sa 0.00001 matapos ang twenty passes. Karaniwang humigit-kumulang isang dosenang pass ang kailangan upang maitugma ang quote sa pinakamalapit na sentimo. Nakakakuha naman ng sagot ang Newton-Raphson sa tatlo o apat na iteration kapag near the money, ngunit maaaring maging hindi maayos ang mga hakbang nito kapag maliit ang vega.
Bakit magkaiba ang ipinapakitang implied volatility ng broker ko at ng isang data vendor?
Magkakaibang input ang ipinakain nila sa solver. Kabilang sa karaniwang pagkakaiba ang mid quote kumpara sa last trade, ang ipinagpalagay na rate at dividend, at kung isinasaalang-alang ba ng model ang American early exercise. Sa isang strike na thinly traded, maaari nang magbago nang ilang puntos ang resulta dahil lamang sa stale quote.
Pareho ba ang implied volatility ng calls at puts na may parehong strike?
Sa teorya, oo. Pinag-uugnay sila ng put-call parity sa parehong strike at expiry. Sa aktuwal, magkahiwalay na itinatakda ang dalawang quote, kaya bahagyang nagkakaiba ang mga numerong nakukuha sa solver. Isa pa ito sa mga dahilan kung bakit nagkakaiba ang chain-wide averages sa pagitan ng mga vendor.
Maaari ko bang kalkulahin ang implied volatility nang walang market data?
Oo, para sa isang hypothetical quote. Tumatanggap ang code sa itaas ng price, strike, spot, time to expiry, at rate na mano-manong inilalagay. Mas mahirap itugma ang isang live vendor number dahil kailangan nito ang parehong mga input na ginamit ng vendor.
Naka-store rito ang SQL sa likod ng bawat panel. Magbukas ng isa, pagkatapos ay patakbuhin ang parehong solve laban sa isang live chain sa Strasmore terminal.