git clone https://github.com/bimov/comp_math.git
cd comp_math
pip install -r requirements.txtДля получения графиков использовалась следующая команда:
python3 main.py --ticker AAPL --start 2017-01-01 --end 2019-12-31 --maturity 2020-01-31 --r 0.02 --n-s 60 --n-t 40 --strike-policy median| Параметр | Значение | Описание |
|---|---|---|
--ticker |
AAPL | Биржевой тикер актива |
--start |
2017-01-01 | Дата начала выборки котировок |
--end |
2019-12-31 | Дата окончания выборки котировок |
--maturity |
2020-01-31 | Дата экспирации T — день, когда опцион перестаёт действовать |
--r |
0.02 | Безрисковая процентная ставка (в долях годовых, 2%) |
--n-s |
60 | Количество узлов сетки по цене актива (S) |
--n-t |
40 | Количество узлов сетки по времени (t) |
--strike-policy |
median | Правило выбора страйка (K): медиана цен за период |
После построения сеток по цене базового актива S_i и времени до экспирации
τ_j решается уравнение Дюпира для цены колл-опциона C(S, τ) при заданной
локальной волатильности σ(τ) и безрисковой ставке r. Начальное условие для
τ = 0 задаётся как выплата опциона max(S − K, 0) и берётся напрямую из
сетки цен актива.
Дифференциальное уравнение приводится к равномерной сетке по S и τ, после
чего применяется неявная схема Крэнка—Николсона. На каждом временном шаге
строится трёхдиагональная система коэффициентов α, β, γ, соответствующих
дискретизации второй и первой производных по S, и решается методом прогонки
(алгоритм Томаса). Переход от шага τ_j к
τ_{j+1} вычисляется функцией _crank_nicolson_step, где половинное взвешивание
между текущим и будущим слоями обеспечивает устойчивость и вторую точность по
времени.
После запуска в папке out/ сохраняются:
price_series.png— график динамики цены активаbs_surface_3d.png— 3D-поверхность цены опциона C(S, t)bs_surface_heatmap.png— тепловая карта C(S, t) (Можно сказать, что тепловая карта это проекция 3D-поверхности C(S, t) на плоскостьbs_surface.csv— табличные данные рассчитанной поверхности
Мы решали обратную задачу финансовой математики: по наблюдаемым рыночным ценам опционов восстанавливаем локальную волатильность σ(S,t), которая согласуется с этими ценами.
Для европейских опционов локальная волатильность удовлетворяет уравнению: ∂C/∂T = (1/2) * σ²(K, T) * K² * (∂²C/∂K²) - r * K * (∂C/∂K) где:
- C - цена опциона колл
- T - время
- K - страйк
- r - безрисковая ставка
Вместо калибровки полной поверхности σ(S,τ) мы параметризуем задачу через интегрированную дисперсию: w(τ) = (1/τ) ∫₀ᵗ σ²(s) ds
Это преобразует бесконечномерную задачу в конечномерную оптимизацию.
- Временные узлы: τ₁, τ₂, ..., τₙ
- Искомая дисперсия: v(τᵢ) = σ²(τᵢ)
- Интегрированная дисперсия: w(τ)
Интегрированная дисперсия вычисляется методом трапеций:w(τᵢ) = (1/τᵢ) ∑[j=1→i] ½(vⱼ + vⱼ₋₁)(τⱼ - τⱼ₋₁)
Минимизируем расхождение между модельной и рыночной интегрированной дисперсией: minᵥ [RMS(w_model(τ) - w_market(τ)) + λ·RMS(v''(τ))]
где:
- Первый член: точность воспроизведения рыночных данных
- Второй член: регуляризация на гладкость
- Инициализация: начальное приближение волатильности
- Вычисление интегрированной дисперсии
- Решение прямой задачи Дюпира для текущей волатильности
- Обновление параметров методом L-BFGS-B
- Повторение до сходимости