Как рассчитывается подразумеваемая волатильность
Подразумеваемая волатильность не имеет аналитического решения. Узнайте, как итерационный метод извлекает ее из цены опциона, изучите код на Python и разберите типичные ошибки расчетов.
1.10-1.20
Implied volatility (подразумеваемая волатильность) рассчитывается методом итераций, а не по формуле. Не существует аналитического выражения, позволяющего напрямую вычислить значение волатильности из рыночной цены опциона. Поэтому алгоритм подбирает волатильность, оценивает опцион по модели Black-Scholes, сравнивает полученную цену с рыночной котировкой и повторяет процесс до тех пор, пока значения не совпадут с точностью до цента. Ниже описан полный метод: функция оценки, цикл поиска на стандартном языке Python и причины, по которым разные поставщики данных публикуют отличающиеся значения для одного и того же контракта.
Метод расчета
Для определения implied volatility используется численный метод, так как цена опциона является монотонной функцией волатильности. Алгоритм начинает с предположения о значении волатильности, подставляет его в модель Black-Scholes и вычисляет теоретическую цену. Затем он сравнивает эту цену с текущей рыночной котировкой. Если теоретическая цена выше рыночной, алгоритм снижает волатильность; если ниже — повышает. Этот процесс продолжается до тех пор, пока разница между модельным значением и рыночной ценой не станет пренебрежимо малой.
Техническая реализация
Почему данные поставщиков различаются
Различия в публикуемых значениях implied volatility между провайдерами возникают по нескольким причинам. Во-первых, это выбор рыночной цены для расчета: одни используют цену последней сделки (last print), другие — середину спреда (mid-price) между bid и ask. Во-вторых, разные модели могут учитывать или не учитывать дивиденды, а также использовать различные методы оценки безрисковой процентной ставки. Наконец, точность итерационного алгоритма и критерий остановки цикла (допуск по погрешности) также влияют на итоговый результат, что приводит к расхождениям в котировках у разных аналитических сервисов.
Почему для подразумеваемой волатильности не существует формулы в замкнутом виде
Модель Black-Scholes работает в одном направлении. Если задать спотовую цену, цену исполнения, время до экспирации, процентную ставку и волатильность, она выдаст теоретическую цену. Пять из этих шести величин наблюдаемы. Волатильность — нет. Это допущение о том, насколько сильно изменится цена акции с текущего момента до экспирации.
Трейдеры решают обратную задачу. Цена видна на экране, а волатильность неизвестна. Подразумеваемая волатильность — это значение волатильности, при котором теоретическая цена по Black-Scholes совпадает с рыночной ценой опциона. Сигма, параметр волатильности, входит в функцию нормального распределения дважды — в d1 и d2, и путем алгебраических преобразований выделить её невозможно. Алгебра здесь бессильна. В дело вступают численные методы поиска. В разделе Что измеряет подразумеваемая волатильность рассматривается интерпретация этого показателя, а на данной странице описывается механизм его расчета.
Два свойства модели упрощают поиск. Теоретическая цена call-опциона растет при любом увеличении волатильности, без исключений, и этот процесс происходит плавно. Величину, которая только возрастает, можно найти методом сужения диапазона.
Алгоритм запускается один раз для каждого контракта
Результатом является одно число на контракт, а не на акцию, при этом контракты на одну и ту же акцию с одинаковым сроком экспирации дают разные значения. Рассмотрим все опционы на Apple (AAPL) со сроком до погашения от двадцати до сорока пяти дней, которыми торговали тридцатого июня две тысячи двадцать шестого года, сгруппированные по страйку как доле цены акции:
Точный 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 ответов. Изгиб этой кривой имеет название — волатильный перекос, и его невозможно описать одним значением волатильности для акции.
Цена по модели Блэка-Шоулза, которую должен воспроизвести решатель
S — это цена акции, K — цена исполнения (страйк), T — время до экспирации в годах, r — безрисковая процентная ставка, а N() — кумулятивная функция стандартного нормального распределения, означающая вероятность того, что значение стандартной нормальной величины окажется ниже заданной точки. Python содержит этот последний компонент в math.erf, поэтому достаточно одного интерпретатора.
apt-get update && apt-get install -y python3
Добавьте префикс sudo к обеим командам, если вы работаете на машине не от имени суперпользователя (root). Затем сохраните это как 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)
Это прямая модель в полном виде. Передайте ей волатильность, чтобы получить цену.
Пошаговый расчет подразумеваемой волатильности
Метод бисекции — первый, который стоит изучить. Он не расходится и не требует вычислений с использованием математического анализа.
- Ограничьте искомое значение диапазоном от ноль целых одной сотой (один процент годовых) до пяти целых (пятьсот процентов). Любой торгуемый опцион находится внутри этого интервала.
- Рассчитайте цену опциона для середины этого диапазона.
- Если модельная цена выше рыночной котировки, значит, оценка была завышена: сместите верхнюю границу диапазона к середине. Если ниже — сместите нижнюю границу вверх.
- Остановитесь, когда модельная цена окажется в пределах одного цента от рыночной котировки.
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 долларов, страйк 100 долларов, три месяца, ставки 4 процента, цена на экране 5 долларов
print(round(implied_vol(5.00, 100.0, 100.0, 0.25, 0.04), 4))
Запустите python3 iv.py. Программа выведет значение около ноль целых двухсот двадцати шести тысячных, что соответствует подразумеваемой волатильности около двадцати двух целых шести десятых процента годовых для данной гипотетической котировки. Каждый проход делит диапазон пополам, а интервал шириной четыре целых девяносто девять сотых, разделенный пополам двадцать раз, становится уже, чем ноль целых одна стотысячная, поэтому ограничение в сто итераций никогда не будет достигнуто.
Почему метод Ньютона-Рафсона сходится быстрее и в каких случаях он дает сбой
Метод бисекции отбрасывает информацию, которой модель уже располагает. Vega — это изменение цены опциона на единицу волатильности, и модель Блэка-Шоулза позволяет рассчитать её в явном виде. Метод Ньютона-Рафсона рассматривает её как наклон: измеряется ошибка ценообразования, делится на 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
Для опционов «около денег» (near the money) решение находится за три или четыре итерации против дюжины при использовании бисекции. Ошибка метода кроется в знаменателе: vega уменьшается по мере удаления страйка от цены базового актива. Рассмотрим те же контракты на AAPL, где средняя vega для каждой зоны показана как процент от значения для опциона «на деньгах»:
Точный 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% от vega опциона «на деньгах» в зоне 0.80-0.90 и 31.6% в зоне 1.10-1.20. Деление ошибки ценообразования на столь малое число приводит к огромному шагу, который может увести значение ниже нуля, где модель теряет смысл. В промышленных решениях эти два метода комбинируют: сначала определяют границы, а затем уточняют результат методом Ньютона. В статье Vega рассматривается сам этот грек.
Почему два источника показывают разную подразумеваемую волатильность
Модель является публичной, а математический аппарат — устоявшимся, поэтому расхождения кроются во входных данных.
- Средняя цена против последней сделки. Для расчета требуется одна цена. Если котировка контракта составляет $2.00 на покупку и $2.20 на продажу, средняя цена равна $2.10, тогда как последняя сделка могла пройти по цене $2.02 девяносто минут назад. В таком контракте разница в десять центов по цене важнее, чем пункт волатильности.
- Дивиденды и стоимость переноса позиции. Приведенная выше функция оценивает европейский call-опцион на акцию без дивидендов. Дивиденд до истечения срока снижает форвардную цену, и каждый торговый отдел применяет собственные корректировки и свою ставку.
- Досрочное исполнение американских опционов. Опционы на отдельные акции в США могут быть исполнены в любой день, и это право имеет стоимость, которую европейская формула не учитывает. Алгоритм, игнорирующий этот фактор, переносит разницу в значение волатильности. Биномиальные модели оценивают право на исполнение напрямую.
- Устаревшие котировки. Страйк, по которому последняя сделка прошла во вторник, все еще имеет котировку, и алгоритм принимает любые полученные данные за истину.
Конвергенция делает последние два фактора заметными. В таблице ниже представлены восемь известных компаний на тридцатое июня две тысячи двадцать шестого года, подсчитано количество торгуемых контрактов со сроком до экспирации от двадцати до сорока пяти дней, а также указана волатильность для опционов 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%, против 14.4% у SPY, находящегося в конце списка. В цепочке TSLA 97.8% торгуемых контрактов дали сходящееся решение. Остальное — это страйки, где цена, поданная в алгоритм, находится за пределами значений, которые может воспроизвести любая волатильность, либо это котировка ниже внутренней стоимости, либо скрещенный рынок (crossed market). Является ли такое число высоким — отдельный вопрос: считается ли 30% IV высокой рассматривает это, а ожидаемое движение переводит это значение в долларовый диапазон.
Один и тот же контракт, пересчитываемый каждую сессию
Данные о подразумеваемой волатильности не сохраняются. Она пересчитывается исходя из текущей рыночной цены на экране. Ниже представлен наиболее активно торгуемый контракт AAPL с экспирацией 17 июля 2026 года, отслеживаемый с 1 июня до даты истечения. Цена исполнения (strike) и дата экспирации оставались неизменными:
Точный 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 рассчитывается ежедневно по всей цепочке опционов, поэтому читатель может воспроизвести любой показатель с помощью кода, приведенного на этой странице.
Часто задаваемые вопросы о расчете подразумеваемой волатильности
Существует ли формула для подразумеваемой волатильности?
Нет. Модель Блэка-Шоулза связывает волатильность с ценой, и это отображение не имеет элементарной обратной функции, так как сигма дважды входит в нормальное распределение. Любое значение подразумеваемой волатильности, которое вы встречаете здесь или где-либо еще, получено с помощью итерационного численного метода.
Сколько итераций требуется для расчета?
Каждый шаг метода бисекции сокращает интервал вдвое, поэтому диапазон от ноль целых одной сотой до пяти сокращается до менее чем ноль целых одной стотысячной за двадцать проходов, а для приведения расчетного значения к рыночной котировке с точностью до цента обычно требуется около дюжины. Метод Ньютона-Рафсона справляется за три или четыре итерации вблизи страйка, однако его шаги могут быть нестабильными там, где вега мала.
Почему у моего брокера и поставщика данных разные значения подразумеваемой волатильности?
Они использовали разные входные данные для алгоритма. Типичные расхождения возникают из-за использования средней котировки (mid) вместо последней сделки, различий в ставках и дивидендных допущениях, а также из-за того, учитывает ли модель возможность досрочного исполнения американских опционов. На неликвидном страйке одна только устаревшая котировка может изменить результат на несколько пунктов.
Дают ли call и put на одном страйке одинаковую подразумеваемую волатильность?
Теоретически да, паритет пут-колл связывает их на одном страйке и сроке экспирации. На практике котировки по ним устанавливаются независимо, и полученные значения немного различаются, что является еще одной причиной, по которой средние показатели по всей опционной цепочке варьируются у разных поставщиков.
Могу ли я рассчитать подразумеваемую волатильность без рыночных данных?
Да, для гипотетической котировки. Приведенный выше код принимает цену, страйк, спот, время до экспирации и ставку, введенные вручную. Самая сложная часть — получить значение, совпадающее с данными поставщика: для этого нужно использовать те же входные параметры, что применял сам поставщик.
Каждая панель здесь содержит SQL-запрос, на котором она основана. Откройте любую из них и запустите аналогичный расчет для актуальной цепочки опционов в терминале Strasmore.