Strasmore Research
Навчання Matt ConnorВід Matt Connor · Оновлено 2026-08-05

Як розраховують імпліцитну волатильність

Імпліцитну волатильність знаходять ітераціями за моделлю Black-Scholes. Дізнайтеся, як працює Python-алгоритм, чому дані різняться та де виникають помилки.

Імпліцитну волатильність розраховують ітераційно, а не за формулою. Не існує замкненої формули, яка перетворює ринкову ціну опціону назад на показник волатильності. Тому алгоритм підбирає значення волатильності, оцінює опціон за моделлю Black-Scholes, порівнює розрахункову ціну з котируванням і повторює цей процес, доки вони не збіжаться з точністю до цента. Далі наведено весь метод: функцію ціноутворення, цикл пошуку у стандартному Python без додаткових бібліотек і причини, через які два постачальники даних публікують різні значення для одного контракту.

Чому для implied volatility не існує замкненої формули

Black-Scholes працює в одному напрямку. Введіть ціну базового активу, strike, строк до експірації, процентну ставку та волатильність — і модель поверне теоретичну ціну. П’ять із цих шести величин можна спостерігати на ринку. Волатильність — ні. Це припущення про те, наскільки зміниться ціна акції між поточним моментом і датою експірації.

Трейдери розв’язують задачу у зворотному напрямку. Ціна вже відображається на екрані, а волатильність є невідомою величиною. Implied volatility — це таке значення волатильності, за якого ціна за Black-Scholes дорівнює ринковій ціні опціону. Sigma, тобто параметр волатильності, двічі входить до функції нормального розподілу — у d1 і d2, — і жодне перетворення не дає змоги ізолювати її. На цьому алгебра завершується. Далі застосовується числовий пошук. Що вимірює implied volatility пояснює інтерпретацію показника; на цій сторінці розглядається механіка розрахунку.

Дві властивості моделі спрощують пошук. Ціна call-опціону за моделлю зростає щоразу зі збільшенням волатильності, без винятків, і змінюється плавно. Величину, яка лише зростає, можна знайти, послідовно звужуючи інтервал пошуку навколо неї.

Розрахунок виконується окремо для кожного контракту

Результат — одне число для кожного контракту, а не одне число для кожної акції. Контракти на одну й ту саму акцію з однаковим строком до експірації дають різні результати. Усі опціони на Apple (AAPL), до експірації яких залишалося від 20 до 45 днів і які торгувалися 30 червня 2026 року, згруповані за strike як часткою ціни акції:

ЗапитОдне розв’язання на контракт: передбачена волатильність AAPL за страйковою зоною, 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)
Run this yourself

Якщо рухатися вздовж шкали strike, зона 0.80-0.90 дала значення 35.5%, зона 0.95-1.0028.1%, а зона 1.10-1.2027.3%. Одна компанія, одна торговельна сесія, 6 значень. Вигин цієї кривої має назву волатильнісний skew, і одна волатильність для всієї акції не може його відобразити.

Ціна Black–Scholes, якій має відповідати розв’язувач

S — ціна акції, K — strike, 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)

Це повна пряма модель. Передайте їй волатильність і отримайте ціну.

Як розраховують implied volatility: покроково

Метод бісекції варто вивчити першим. Він не може розійтися й не потребує математичного аналізу.

  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, strike $100, три місяці, ставки 4%, котировка $5,00
print(round(implied_vol(5.00, 100.0, 100.0, 0.25, 0.04), 4))

Запустіть python3 iv.py. Код виведе приблизно 0,226 — implied volatility близько 22,6% річних для цієї умовної котировки. На кожній ітерації діапазон зменшується вдвічі. Діапазон шириною 4,99 після двадцяти поділів стає вужчим за 0,00001, тому обмеження у 100 ітерацій ніколи не спрацьовує.

Чому метод Ньютона—Рафсона збігається швидше та де він дає збій

Бісекція відкидає інформацію, яку модель уже містить. Vega — це зміна ціни опціону на одиницю волатильності, і Black-Scholes обчислює її у замкненій формі. Метод Ньютона—Рафсона розглядає її як нахил: вимірює помилку ціноутворення, ділить її на 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          # нахилу більше немає, повертаємо задачу до бісекції
        step = (bs_call(S, K, T, r, sigma) - price) / v
        sigma -= step
        if sigma <= 0.0:
            return None          # крок вийшов за межі допустимого значення
        if abs(step) < 1e-6:
            return sigma
    return None

Поблизу at the money цей метод дає результат за три-чотири проходи, тоді як бісекції потрібно близько дюжини. Причина збоїв — у знаменнику: vega зменшується, коли strike віддаляється від ціни акції. Для тих самих контрактів AAPL середнє значення vega у кожній зоні показано у відсотках від значення для at the money:

ЗапитДе крок Ньютона дає збій: вега AAPL за страйковою зоною, 30 червня 2026 року
Точний 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 для at the money: 33.1% у зоні 0.80-0.90 і 31.6% у зоні 1.10-1.20. Ділення помилки ціноутворення на настільки мале число дає надзвичайно великий крок. Через це оцінка може опуститися нижче нуля, де модель уже не може надати змістовного результату. У промислових розв’язувачах обидва методи поєднують: спочатку задають інтервал, а потім уточнюють результат методом Ньютона. Vega містить опис самого грецького показника.

Чому два джерела показують різну implied volatility

Модель є відкритою, а розрахунок узгоджений, тому розбіжність виникає у вхідних даних.

  • Mid проти last. Розрахунку потрібна одна ціна. Якщо котирування контракту становить $2.00 bid і $2.20 offer, midpoint дорівнює $2.10, тоді як last print може становити $2.02 і бути зафіксованим 90 хвилин тому. Для такого контракту різниця в ціні на десять центів важить більше, ніж один пункт волатильності.
  • Дивіденди та carry. Наведена вище функція оцінює European call на акцію, яка не виплачує дивідендів. Дивіденд до дати експірації знижує форвардну ціну, а кожен trading desk застосовує власне коригування та власну ставку.
  • Дострокове виконання American options. Опціони на окремі акції у США можна виконати в будь-який день, і це право має вартість, для якої у European formula немає окремого компонента. Розрахунок, який її ігнорує, переносить різницю у волатильність. Binomial trees безпосередньо оцінюють право на виконання.
  • Застарілі котирування. Для strike, за яким остання угода відбулася у вівторок, котирування все ще може відображатися, і розрахунок вважає достовірним будь-яке отримане значення.

Збіжність робить останні два чинники помітними. Наведена нижче панель охоплює вісім відомих компаній станом на 30 червня 2026 року, підраховує кількість контрактів, за якими від дати експірації залишалося від 20 до 45 днів, і показує як volatility at the money, так і частку контрактів, для яких розрахунок зійшовся:

ЗапитПередбачена волатильність при грошах і збіжність розв’язувача: вісім інструментів, 30 червня 2026 року
Точний 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 мало найвище значення volatility at the money серед 8 назв — 47.7%, тоді як для 14.4%, що опинився внизу рейтингу, показник становив SPY. У ланцюжку TSLA для 97.8% торгованих контрактів було отримано результат зі збіжністю. Решта припадає на strike, де передана в розрахунок ціна виходить за межі значень, які може відтворити будь-яка волатильність, або на котирування, нижче за intrinsic value, чи crossed market. Чи є таке значення високим — окреме питання: чи є IV на рівні 30% високою розглядає його, а очікуваний рух переводить його в діапазон у доларах.

Той самий контракт, перерахований на кожній сесії

У ціні implied volatility нічого не зберігається. Її перераховують на основі ціни, що відображається на екрані. Нижче показано контракт AAPL із найбільшим обсягом торгів, термін дії якого спливає 17 липня 2026 року, у динаміці від 1 червня до дати експірації. Strike і дата експірації не змінювалися:

ЗапитОдин контракт 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
Run this yourself

Протягом 29 сесій розраховане значення становило 25.1% на початку періоду, коли до експірації залишалося 46 днів, і завершило період на рівні 26.6%, коли залишалося 4 дні. Кожна точка на цій лінії — окремий запуск наведеного вище циклу на основі котирувань відповідної сесії. На сторінках окремих тикерів ми публікуємо такий самий розрахунок: implied volatility AAPL обчислюється щодня для всього ланцюжка опціонів, тому читач може відтворити будь-яке значення за допомогою коду на цій сторінці.

FAQ про розрахунок implied volatility

Чи існує формула для implied volatility?

Ні. Black-Scholes пов’язує волатильність із ціною, але цей зв’язок не має елементарної оберненої функції, оскільки sigma двічі входить до нормального розподілу. Тому кожне значення implied volatility, яке ви бачите тут або деінде, отримують за допомогою ітераційного алгоритму.

Скільки ітерацій займає розрахунок?

Під час кожної бісекції діапазон удвічі звужується. Тому діапазон від 0.01 до 5.0 стає меншим за 0.00001 за двадцять ітерацій, а зіставлення з котируванням із точністю до найближчого цента зазвичай потребує близько десятка ітерацій. Метод Ньютона—Рафсона дає результат за три-чотири ітерації для опціонів поблизу at-the-money, але його кроки можуть бути нестабільними там, де vega мала.

Чому мій брокер і постачальник даних показують різну implied volatility?

Вони передали алгоритму різні вхідні дані. Найчастіші відмінності стосуються mid quote і останньої угоди, припущень щодо ставки та дивідендів, а також того, чи враховує модель дострокове виконання American options. Для страйку з низькою ліквідністю навіть застаріле котирування може змінити результат на кілька процентних пунктів.

Чи мають call- і put-опціони з однаковим strike однакову implied volatility?

Теоретично так: put-call parity пов’язує їх за однакових strike та expiry. На практиці два котирування формуються незалежно, тому розраховані значення трохи відрізняються. Це ще одна причина, чому середні значення для всього option chain різняться між постачальниками даних.

Чи можу я розрахувати implied volatility без ринкових даних?

Так, для гіпотетичного котирування. Наведений вище код приймає ціну, strike, spot, час до expiry та ставку, які вводяться вручну. Складніше відтворити поточне значення постачальника даних: для цього потрібні ті самі вхідні дані, які використав постачальник.


Кожна панель тут зберігає SQL-запит, на основі якого її побудовано. Відкрийте панель і запустіть такий самий розрахунок для актуального option chain у терміналі Strasmore.

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