Strasmore Research
學習 Matt Connor作者: Matt Connor · 更新於 2026-08-05

隱含波動率如何計算?從選擇權價格反推

了解隱含波動率為何沒有封閉解公式,並用 Black-Scholes 與 Python 迭代求解市場價格,掌握報價差異與常見陷阱。

隱含波動率是透過反覆迭代計算,而非套用公式得出。沒有任何封閉形式的表達式,能將選擇權的市場價格反推為波動率數值。因此,求解器會先猜測一個波動率,以 Black-Scholes 模型計算選擇權價格,再將模型價格與市場報價比較,並重複這個過程,直到兩者精確到小數點後兩位。以下將完整說明這套方法,包括定價函數、使用 Python 標準函式庫撰寫的搜尋迴圈,以及兩家資料供應商為何會對同一份合約公布不同數值。

為什麼隱含波動率沒有封閉解公式

Black-Scholes 模型的計算方向是單向的。輸入現貨價格、履約價格、到期時間、利率與波動率,模型就會回傳理論價格。這六項數值中,有五項可以觀察得到。波動率則無法直接觀察。它代表對股票從現在到到期日可能波動幅度的假設。

交易員會將問題反向處理。市場畫面上已有價格,未知數則是波動率。隱含波動率是使 Black-Scholes 價格等於選擇權市場價格的波動率輸入值。Sigma,也就是波動率項,會在常態分配函數中出現兩次,分別位於 d1 與 d2 之中,因此無法透過代數變形將其單獨解出。代數推導到此為止。接下來改用數值搜尋。隱含波動率衡量什麼說明其意義;本頁則介紹計算方法。

模型的兩項特性讓搜尋過程相對簡單。買權的模型價格會隨波動率上升而上升,沒有例外,而且變化平滑。對於只會上升的數值,可以逐步縮小其所在的區間來找到答案。

每份契約各自執行一次求解

輸出結果是每份契約一個數字,而不是每檔股票一個數字;同一檔股票、同一到期期間的契約,彼此得出的結果也不一致。以下是2026年6月30日成交、剩餘20至45天的所有 Apple(AAPL)選擇權,並依履約價占股價的比例分組:

查詢每份合約一次求解:AAPL 依履約價區間的隱含波動率,2026年6月30日
每個數據背後的精確 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)
Run this yourself

沿著履約價梯度讀取結果,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)

這就是完整的正向模型。輸入波動率,就能得到價格。

如何逐步計算隱含波動率

二分法是最適合先學的方法。它不會發散,也不需要微積分。

  1. 將答案夾在 0.01(年化1%)與 5.0(500%)之間。所有有交易的選擇權都落在這個範圍內。
  2. 以該區間的中點計算選擇權價格。
  3. 若模型價格高於市場報價,表示猜測值過高:將區間上限下調至中點。若模型價格低於市場報價,則將區間下限上調至中點。
  4. 當模型價格與報價的差距小於一美分時停止。
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次迭代的上限不會成為限制。

為何 Newton-Raphson 收斂較快,以及它在哪些情況下失效

二分法會丟棄模型已經提供的資訊。Vega 是波動率每變動一單位所造成的選擇權價格變化,Black-Scholes 可用封閉形式計算。Newton-Raphson 將其視為斜率:先量出定價誤差,再除以 vega,並依該幅度調整估計值。

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

在價平附近,Newton-Raphson 三、四次迭代即可收斂;二分法則需要十多次。失效原因在分母:履約價越偏離股價,vega 就越小。以下是相同的 AAPL 契約,並將各區間的平均 vega 顯示為價平 vega 的百分比:

查詢牛頓步驟失常之處:AAPL 依履約價區間的 Vega,2026年6月30日
每個數據背後的精確 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)
Run this yourself

兩側尾端的敏感度僅是價平 vega 的一小部分:在 0.80-0.90 區間為價平 vega 的 33.1%,在 1.10-1.20 區間則為 31.6%。將定價誤差除以如此小的數字,會產生極大的步長,可能使估計值跌至零以下;一旦如此,模型便無法提供有效結果。實務上的求解器會結合兩種方法:先用區間夾逼,再用 Newton-Raphson 微調。Vega介紹這項希臘字母指標本身。

為何兩個來源會回報不同的隱含波動率

模型是公開的,計算方式也已確定,因此差異出在輸入值。

  • 中間價與最後成交價。 求解器需要一個價格。某契約的買價為2.00美元、賣價為2.20美元時,中間價是2.10美元;但最後成交價可能是九十分鐘前的2.02美元。對這類契約而言,價格差十美分對波動率的影響,可能大於一個百分點。
  • 股息與持有成本。 上述函數計算的是不支付股息股票的歐式買權價格。到期前若有股息,遠期價格會下調;各交易團隊採用的調整方式與利率也各不相同。
  • 美式提前履約。 美國個股選擇權可在任何交易日履約,這項權利具有價值,但歐式公式無法納入。忽略提前履約權利的求解器,會把差異反映在波動率上。二項樹模型則直接為履約權利定價。
  • 過時報價。 某履約價的選擇權即使最後在週二成交,市場上仍可能顯示報價;求解器會將收到的任何價格視為正確輸入。

收斂結果會讓後兩項因素更明顯。下方面板以2026年6月30日的八檔大型知名股票為樣本,計算剩餘20至45天到期的成交契約數,並同時列出價平波動率,以及求解成功收斂的契約比例:

查詢價平隱含波動率與求解器收斂情形,8檔標的,2026年6月30日
每個數據背後的精確 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 DESC
Run this yourself

TSLA的價平波動率在47.7%檔股票中最高,為8;排名最低的SPY則為14.4%。在TSLA的選擇權鏈中,97.8%的成交契約得到收斂解。其餘契約的履約價,是因為交給求解器的價格落在任何波動率都無法重現的範圍之外,或是報價低於內含價值,或存在買賣價倒掛。這樣的數字是否算高,是另一個問題:30%的IV算高嗎會進一步討論,而預期波動幅度則會將其換算成美元區間。

同一份合約,每個交易日重新求解

隱含波動率不會被儲存。系統會根據螢幕上顯示的價格重新計算。以下追蹤的是交易最活躍、到期日為2026年7月17日的 AAPL 合約,期間自6月1日持續至到期日。履約價和到期日都未曾變動:

查詢一份 AAPL 合約:每個交易日重新求解至2026年7月17日到期
每個數據背後的精確 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
Run this yourself

29 個交易日中,求解結果以 25.1% 開盤,當時距離到期還有 46 天;最後以 26.6% 收盤,剩餘 4 天。該曲線上的每一個點,都是根據當日報價執行上述迴圈後得到的一次求解結果。我們的個股代號頁面也會發布相同的求解結果:AAPL 隱含波動率每天針對完整期權鏈執行計算,因此讀者可以利用本頁的程式碼重現其中任何數值。

隱含波動率計算常見問答

隱含波動率有公式可以直接計算嗎?

沒有。Black-Scholes 模型可將波動率映射為價格,但這個映射沒有初等反函數,因為 sigma 會在常態分布中出現兩次。你在這裡或其他地方看到的每一個隱含波動率數值,都是透過疊代求解器計算出來的。

這項計算需要疊代多少次?

每次二分法疊代都會將區間縮小一半。因此,0.01至5.0的區間經過二十次疊代後,會縮小至0.00001以下;若要將結果與報價精確到最接近的美分,通常約需十多次。接近平值時,Newton-Raphson 法通常三、四次就能得到結果,但在 vega 較小的區域,疊代步驟可能失常。

為什麼我的券商和資料供應商顯示的隱含波動率不同?

因為它們輸入求解器的參數不同。常見差異包括中間報價與最新成交價、利率與股息假設,以及模型是否處理美式選擇權的提前履約。在成交量低的履約價上,僅是一筆過時報價,就可能使結果相差數個百分點。

相同履約價的買權與賣權,隱含波動率會相同嗎?

理論上會。買賣權平價關係會將相同履約價與到期日的兩者連結起來。實務上,兩種報價是分別設定的,因此反推出來的數值會有些微差異。這也是不同供應商的整條選擇權鏈平均值會有所不同的另一個原因。

沒有市場資料,也能計算隱含波動率嗎?

可以,但只能針對假設報價計算。上方程式碼接受手動輸入的價格、履約價、現貨價格、距到期時間與利率。若要重現即時資料供應商的數值,難度較高,因為必須使用供應商採用的相同輸入參數。


這裡的每個面板都會儲存背後的 SQL。開啟其中一個面板,然後在 Strasmore 終端機上,針對即時選擇權鏈執行相同的求解程序。

#implied volatility#options#black-scholes#python#how-to