Глава 144: Физически-информированные нейронные сети для модели стохастической волатильности Хестона
Обзор
Модель Блэка-Шоулза предполагает постоянную волатильность — упрощение, которое рушится при столкновении с реальными рыночными данными. Поверхности подразумеваемой волатильности демонстрируют улыбки, перекосы и временные структуры, которые однозначно указывают: волатильность сама по себе стохастична. Модель Хестона (1993) учитывает это, позволяя дисперсии следовать собственному среднеревертирующему стохастическому процессу. Однако решение PDE Хестона по всей области (S, v, t) вычислительно затратно, особенно для калибровки в реальном времени.
Физически-информированные нейронные сети (PINN) предлагают элегантное решение: обучить нейронную сеть аппроксимировать V(S, v, t), одновременно обеспечивая выполнение PDE Хестона как мягкого ограничения в функции потерь. Результат — бессеточный, дифференцируемый решатель, который генерирует цены опционов, греки и целые поверхности волатильности за миллисекунды.
Ключевая идея: Встраивая PDE Хестона непосредственно в функцию потерь нейронной сети, мы получаем решатель, который соблюдает безарбитражные ограничения, обрабатывает сложные граничные условия и обобщается по всей области (S, v, t) — всё без конечно-разностной сетки.
Торговая стратегия
Основная стратегия: Использование PINN-решателя Хестона для ценообразования опционов в реальном времени, построения поверхности волатильности и вычисления греков. Выявление неправильно оцененных опционов путём сравнения PINN-калиброванных теоретических цен с рыночными котировками.
Факторы преимущества:
- Ценообразование за доли миллисекунды позволяет обнаруживать арбитраж в реальном времени по страйкам и экспирациям
- Гладкие, дифференцируемые греки (включая перекрёстные греки Ванна, Волга) улучшают хеджирование
- Модель Хестона отражает кластеризацию и среднюю реверсию волатильности, наблюдаемые на крипторынках
- Калибровка по всей поверхности волатильности одновременно (не по отдельным страйкам)
Целевые активы: Опционы на фондовые индексы (SPX) и криптовалютные опционы на Bybit (BTC, ETH)
Модель стохастической волатильности Хестона
Почему постоянная волатильность не работает
Модель Блэка-Шоулза предполагает:
dS = mu*S dt + sigma*S dW_1где sigma постоянна. Это даёт плоскую подразумеваемую волатильность по страйкам — что противоречит каждому когда-либо наблюдаемому опционному рынку. Реальные рынки демонстрируют:
- Улыбка волатильности: OTM путы и коллы дороже ATM
- Перекос волатильности: OTM путы дороже OTM коллов (особенно для акций)
- Временная структура: Краткосрочные опционы показывают более крутые улыбки
- Кластеризация волатильности: Периоды высокой волатильности порождают высокую волатильность
Динамика Хестона
Хестон (1993) моделирует цену актива и его дисперсию как связанную систему:
dS(t) = mu * S(t) * dt + sqrt(v(t)) * S(t) * dW_1(t)
dv(t) = kappa * (theta - v(t)) * dt + sigma * sqrt(v(t)) * dW_2(t)где:
- S(t): Спот-цена
- v(t): Мгновенная дисперсия (v = sigma^2_local)
- kappa: Скорость среднего возврата дисперсии
- theta: Долгосрочный уровень дисперсии
- sigma: Волатильность дисперсии (вол-от-вола)
- rho: Корреляция между dW_1 и dW_2 (обычно rho < 0 для акций)
- mu: Дрифт (при риск-нейтральной мере mu = r - q)
Структура корреляции:
E[dW_1 * dW_2] = rho * dtОтрицательная корреляция (rho < 0) создаёт эффект рычага: когда акция падает, волатильность растёт — создавая характерный перекос волатильности.
Условие Феллера
Для того чтобы процесс дисперсии оставался строго положительным:
2*kappa*theta > sigma^2 (условие Феллера)Когда оно выполняется, v(t) никогда не касается нуля. При нарушении дисперсия может достичь нуля, но немедленно отражается — процесс CIR остаётся корректно определённым, но требует тщательного численного подхода.
Типичные диапазоны параметров:
| Параметр | Акции | Крипто (BTC) |
|---|---|---|
| kappa | 1-5 | 2-10 |
| theta | 0.02-0.10 | 0.30-1.50 |
| sigma (вол-от-вола) | 0.2-0.8 | 0.5-3.0 |
| rho | от -0.8 до -0.3 | от -0.5 до 0.2 |
| v_0 | 0.01-0.10 | 0.20-1.00 |
Примечание: Крипторынки демонстрируют значительно более высокий вол-от-вола и более слабую (иногда положительную) корреляцию.
PDE Хестона
При риск-нейтральной мере европейская цена опциона V(S, v, t) удовлетворяет:
dV/dt + (1/2)*v*S^2*(d^2V/dS^2) + rho*sigma*v*S*(d^2V/dSdv) + (1/2)*sigma^2*v*(d^2V/dv^2) + r*S*(dV/dS) + kappa*(theta - v)*(dV/dv) - r*V = 0Это двумерное параболическое PDE по переменным (S, v) со временем t.
| Член | Выражение | Значение |
|---|---|---|
| Временной распад | dV/dt | Изменение стоимости опциона со временем |
| Диффузия спота | (1/2)vS^2*(d^2V/dS^2) | Эффект гаммы от движений спота |
| Смешанная диффузия | rhosigmavS(d^2V/dSdv) | Перекрёстный эффект: корреляция спот-дисперсия |
| Диффузия дисперсии | (1/2)sigma^2v*(d^2V/dv^2) | Эффект волги от движений дисперсии |
| Дрифт спота | rS(dV/dS) | Риск-нейтральный дрифт спота |
| Дрифт дисперсии | kappa*(theta-v)*(dV/dv) | Среднеревертирующее притяжение дисперсии |
| Дисконтирование | -r*V | Безрисковое дисконтирование |
Граничные условия
PDE требует граничных условий на вычислительной области [0, S_max] x [0, v_max] x [0, T]:
Терминальное условие (при t = T):
V(S, v, T) = max(S - K, 0) (колл)V(S, v, T) = max(K - S, 0) (пут)При S = 0:
V(0, v, t) = K * e^{-r(T-t)} (пут: дисконтированный страйк)V(0, v, t) = 0 (колл)При S -> бесконечность:
V(S, v, t) ~ S * e^{-q(T-t)} (колл: стремится к форварду)V(S, v, t) -> 0 (пут)При v = 0 (граница Феллера): PDE вырождается. Граничное условие принимает вид:
dV/dt + r*S*(dV/dS) + kappa*theta*(dV/dv) - r*V = 0При v -> бесконечность:
dV/dv -> 0 (Нейман: значение нечувствительно к дальнейшему увеличению vol)Архитектура PINN для PDE Хестона
Дизайн сети
PINN принимает трёхмерный вход (S, v, t) и выдаёт цену опциона V:
Входной слой: (S, v, t) из R^3 | +-------+-------+ | Нормализация | <- Масштабирование входов в [0, 1] | S~ = S/S_max | | v~ = v/v_max | | t~ = t/T | +-------+-------+ | +-------+-------+ | Dense(3, 128) | | Tanh | +-------+-------+ | +-------+-------+ | Dense(128,128) | | Tanh | x 4-6 скрытых слоёв | + Residual | +-------+-------+ | +-------+-------+ | Dense(128, 1) | | Softplus | <- Гарантирует V > 0 +-------+-------+ | Выход: V^(S, v, t)Выбор архитектуры:
- Активация: Tanh (гладкая, бесконечно дифференцируемая — необходимо для вторых производных)
- Выходная активация: Softplus обеспечивает неотрицательность цен
- Residual-связи: Стабилизируют обучение для более глубоких сетей
- Нормализация входов: Критически важна для балансировки градиентов по масштабам S, v, t
Инженерия входных признаков
Для лучшей обусловленности используем логарифм спота и нормализованные входы:
x = log(S / K) # Лог-монейность (центрировано на ATM)v_norm = v / v_max # Нормализованная дисперсияtau = (T - t) / T # Нормализованное время до экспирацииКонструирование функции потерь
Функция потерь PINN имеет четыре компонента:
L_total = lambda_pde * L_pde + lambda_bc * L_bc + lambda_ic * L_ic + lambda_data * L_data1. Потеря остатка PDE
Выбираем N_pde коллокационных точек (S_i, v_i, t_i) во внутренней области и вычисляем остаток PDE используя автоматическое дифференцирование:
def heston_pde_residual(model, S, v, t, params): """Вычисление остатка PDE Хестона в коллокационных точках.""" S.requires_grad_(True) v.requires_grad_(True) t.requires_grad_(True)
V = model(S, v, t)
# Первые производные V_t = grad(V, t) V_S = grad(V, S) V_v = grad(V, v)
# Вторые производные V_SS = grad(V_S, S) V_vv = grad(V_v, v) V_Sv = grad(V_S, v) # Смешанная производная
kappa, theta, sigma, rho, r = params
residual = (V_t + 0.5 * v * S**2 * V_SS + rho * sigma * v * S * V_Sv + 0.5 * sigma**2 * v * V_vv + r * S * V_S + kappa * (theta - v) * V_v - r * V)
return torch.mean(residual**2)2. Потери граничных условий
def boundary_loss(model, K, r, T, params): """Обеспечение выполнения граничных условий.""" loss = 0.0
# Терминальное условие: V(S, v, T) = max(S - K, 0) S_term = torch.linspace(0, S_max, N_bc) v_term = torch.linspace(0, v_max, N_bc) S_grid, v_grid = torch.meshgrid(S_term, v_term) t_T = torch.full_like(S_grid, T) V_pred = model(S_grid, v_grid, t_T) V_exact = torch.maximum(S_grid - K, torch.zeros_like(S_grid)) loss += torch.mean((V_pred - V_exact)**2)
return loss3. Обработка смешанной производной
Смешанная производная d^2V/dSdv требует аккуратного вычисления с autograd:
def mixed_derivative(V, S, v): """Вычисление d^2V/dSdv двумя последовательными вызовами grad.""" V_S = torch.autograd.grad(V, S, grad_outputs=torch.ones_like(V), create_graph=True, retain_graph=True)[0] V_Sv = torch.autograd.grad(V_S, v, grad_outputs=torch.ones_like(V_S), create_graph=True, retain_graph=True)[0] return V_SvКлюч — create_graph=True: это строит граф вычислений для самой производной, позволяя дифференцирование более высокого порядка.
Стратегия мультимасштабной коллокации
Цены опционов сильно варьируются по области (S, v, t). Вблизи страйка (S ~ K) и при экспирации (t ~ T) градиенты крутые. Используем адаптивную коллокацию:
def generate_collocation_points(S_max, v_max, T, K, N_total): """Генерация мультимасштабных коллокационных точек.""" N_uniform = N_total // 2 N_atm = N_total // 4 N_low_v = N_total // 4
# Равномерный фон S_unif = torch.rand(N_uniform) * S_max v_unif = torch.rand(N_uniform) * v_max t_unif = torch.rand(N_uniform) * T
# Плотно около ATM (S ~ K) S_atm = K + 0.2 * K * torch.randn(N_atm) S_atm = torch.clamp(S_atm, 0, S_max) v_atm = torch.rand(N_atm) * v_max t_atm = torch.rand(N_atm) * T
# Плотно при низкой дисперсии S_low = torch.rand(N_low_v) * S_max v_low = torch.rand(N_low_v) * v_max * 0.3 t_low = torch.rand(N_low_v) * T
S = torch.cat([S_unif, S_atm, S_low]) v = torch.cat([v_unif, v_atm, v_low]) t = torch.cat([t_unif, t_atm, t_low])
return S, v, tПолуаналитическое ценообразование по Хестону
Подход через характеристическую функцию
Модель Хестона имеет полузамкнутое решение через характеристическую функцию. Цена колла:
C(S, v, t) = S * P_1 - K * e^{-r*tau} * P_2где P_1 и P_2 вычисляются через обратные преобразования Фурье с характеристической функцией, зависящей от параметров Хестона.
Греки через автоматическое дифференцирование
Одно из самых мощных свойств PINN: греки получаются бесплатно через autograd.
def compute_greeks(model, S, v, t): """Вычисление всех греков через autograd.""" S = S.requires_grad_(True) v = v.requires_grad_(True) t = t.requires_grad_(True)
V = model(S, v, t)
# Греки первого порядка Delta = torch.autograd.grad(V, S, create_graph=True)[0] Vega = torch.autograd.grad(V, v, create_graph=True)[0] Theta = torch.autograd.grad(V, t, create_graph=True)[0]
# Греки второго порядка Gamma = torch.autograd.grad(Delta, S, create_graph=True)[0] Vanna = torch.autograd.grad(Delta, v, create_graph=True)[0] # d^2V/dSdv Volga = torch.autograd.grad(Vega, v, create_graph=True)[0] # d^2V/dv^2
return { 'delta': Delta, 'gamma': Gamma, 'theta': Theta, 'vega': Vega, 'vanna': Vanna, 'volga': Volga }Почему Ванна и Волга важны
Ванна (d^2V/dSdv): Измеряет, как Дельта изменяется с волатильностью. Критически важна для:
- Хеджирования в среде со стохастической волатильностью
- Понимания того, как движения спота влияют на экспозицию к волатильности
- Управления рисками корреляции вол-спот
Волга (d^2V/dv^2): Измеряет выпуклость цены опциона по дисперсии. Важна для:
- Динамики улыбки волатильности
- Ценообразования экзотических опционов с экспозицией к вол-от-вола
- Понимания “премии за улыбку”
Применение к криптовалютам (Bybit)
Почему Хестон для крипто?
Рынки криптовалютных опционов демонстрируют экстремальные характеристики волатильности:
- Более высокий вол-от-вола (sigma): Дисперсия BTC может вырасти в 10 раз за часы
- Более слабый эффект рычага: rho ближе к 0 или даже положительный
- Более быстрая средняя реверсия (kappa): Всплески волатильности быстро откатываются
- Более высокая базовая дисперсия (theta): Годовая волатильность BTC ~ 60-80% vs SPX ~ 15-20%
- Компоненты скачков: Одного Хестона может быть недостаточно (расширение Бейтса)
Сравнение: PINN vs полуаналитический Хестон
+---------------------+---------------+--------------+--------------+| Свойство | Характерист. | Конечные | PINN || | функция | разности | |+---------------------+---------------+--------------+--------------+| Одна оценка цены | ~1 мс | ~100 мс | ~0.01 мс || Полная поверхность | ~10 с | ~10 с | ~1 мс || Греки | Конечн. разн. | Интерполяция | Autograd || Точность | Машинная точн.| Завис. сетки | ~1e-4 || Стоимость обучения | N/A | N/A | Минуты-часы || Бессеточный | Да | Нет | Да || Экзотические опц. | Ограниченно | Да | Да |+---------------------+---------------+--------------+--------------+Структура проекта
144_pinn_heston_model/+-- README.md <- Этот файл (англ.)+-- README.ru.md <- Русский перевод+-- readme.simple.md <- Простое объяснение (англ.)+-- readme.simple.ru.md <- Простое объяснение (рус.)+-- python/| +-- __init__.py| +-- requirements.txt| +-- heston_pinn.py <- Архитектура PINN| +-- train.py <- Цикл обучения| +-- data_loader.py <- Рыночные данные (акции + Bybit)| +-- heston_analytical.py <- Полуаналитическое ценообразование| +-- calibration.py <- Калибровка Хестона к рыночным IV| +-- greeks.py <- Греки через autograd| +-- visualize.py <- Поверхности и графики| +-- backtest.py <- Бэктест торговли волатильностью+-- rust_pinn_heston/ +-- Cargo.toml +-- src/ | +-- lib.rs <- Ядро PINN для Хестона | +-- bin/ | +-- train.rs | +-- price_options.rs | +-- fetch_data.rs | +-- calibrate.rs +-- examples/ +-- basic_pricing.rsЗапуск кода
Python
cd 144_pinn_heston_model/pythonpip install -r requirements.txtpython train.py --epochs 10000 --lr 1e-3python calibration.py --source bybit --symbol BTCpython greeks.py --spot 100 --strike 100 --expiry 0.25python visualize.py --show-smile --show-surfacepython backtest.py --strategy vol_arb --period 30dRust
cd 144_pinn_heston_model/rust_pinn_hestoncargo run --bin fetch_data -- --symbol BTCUSDT --exchange bybitcargo run --bin train -- --epochs 5000 --hidden-dim 128cargo run --bin price_options -- --spot 50000 --strike 50000 --expiry 0.25cargo run --bin calibrate -- --source bybit --symbol BTCКлючевые выводы
-
Модель Хестона отражает стохастическую волатильность с пятью параметрами (kappa, theta, sigma, rho, v_0) и генерирует реалистичные улыбки/перекосы волатильности
-
PINN решает PDE Хестона без сетки, создавая дифференцируемую аппроксимацию V(S, v, t), которая уважает физику
-
Смешанная производная d^2V/dSdv — ключевая техническая сложность, естественно решаемая автоматическим дифференцированием
-
Греки получаются бесплатно через обратное распространение, включая сложные перекрёстные греки (Ванна, Волга)
-
Крипторынки требуют более высоких параметров вол-от-вола и более быстрых скоростей среднего возврата
-
Калибровка может быть ускорена дифференцированием через PINN по параметрам модели
-
Приложения реального времени становятся возможными: после обучения PINN вычисляет за микросекунды
Ссылки
-
Heston, S. L. (1993). “A Closed-Form Solution for Options with Stochastic Volatility.” The Review of Financial Studies, 6(2), 327-343.
-
Raissi, M., Perdikaris, P., & Karniadakis, G. E. (2019). “Physics-Informed Neural Networks.” Journal of Computational Physics, 378, 686-707.
-
Gatheral, J. (2006). The Volatility Surface: A Practitioner’s Guide. Wiley.