Дельта-хеджирование, профиль Gamma и валютные поверхности волатильности: математика деривативов в FX

9 минут чтения •


Оглавление

Оглавление

Классическая теория ценообразования деривативов Блэка-Шоулза опирается на предпосылку о непрерывном самофинансируемом ребалансировании портфеля без транзакционных издержек. В реальной торговле опционами на валютном рынке (FX) деск сталкивается с дискретностью исполнения, нелинейными скачками спота, зависимостью от базовой валюты учета (Numeraire) и постоянным дрейфом поверхности волатильности (Volatility Surface).

Ниже представлен формальный математический разбор механики дельта-хеджирования, взаимосвязи греков первого и второго порядков, особенностей валютных опционов на развивающихся рынках (Emerging Markets) и аналитического учета эффектов Sticky Strike против Sticky Delta по материалам второй лекции продвинутого курса CMF (CMF Advanced Options Trading: Lecture 2 – Delta, Gamma & FX Vol Surfaces).

Финансовый дисклеймер. Материал носит исключительно академический и исследовательский характер и не является индивидуальной инвестиционной рекомендацией, офертой или призывом к совершению финансовых сделок. Торговля деривативами и опционами сопряжена с высоким уровнем риска потери капитала. Описанные алгоритмы и математические модели предназначены для демонстрации теории количественных финансов и требуют собственной верификации перед любым практическим применением.

Первоисточник и контекст курса

  1. Оригинал лекции: CMF Options School, Advanced Options Trading: Lecture 2 – Delta, Gamma & FX Vol Surfaces (YouTube: FBpRVcWEYV0, 41:20).
  2. Предметная область: Количественные финансы (Quantitative Finance), деривативы валютного рынка (FX Options), греки второго порядка (Gamma, Vanna) и структуры волатильности на рынках с асимметричным страновым риском.

1. Аналитическая геометрия греков: Gamma как плотность, Delta как интеграл

В модели Гармана-Кольхагена (Garman-Kohlhagen, модификация Блэка-Шоулза для двух процентных ставок) цена европейского Call-опциона на валютную пару $S_t$ (где базовая валюта — Foreign, валюта котировки — Domestic) определяется как:

$$C(S_t, t) = S_t e^{-r_f \tau} \mathcal{N}(d_1) - K e^{-r_d \tau} \mathcal{N}(d_2)$$

где:

Параметры $d_1$ и $d_2$ определяются стандартными уравнениями:

$$d_1 = \frac{\ln(S_t / K) + \left(r_d - r_f + \frac{1}{2}\sigma^2\right)\tau}{\sigma \sqrt{\tau}}$$

$$d_2 = d_1 - \sigma \sqrt{\tau}$$

Производные первого и второго порядка

Дельта ($\Delta$) измеряет чувствительность премии опциона к изменению спот-курса базового актива:

$$\Delta_{\text{call}} = \frac{\partial C}{\partial S_t} = e^{-r_f \tau} \mathcal{N}(d_1)$$

$$\Delta_{\text{put}} = \frac{\partial P}{\partial S_t} = -e^{-r_f \tau} \mathcal{N}(-d_1)$$

Гамма ($\Gamma$) представляет собой вторую производную премии по споту и первую производную от Дельты:

$$\Gamma = \frac{\partial^2 C}{\partial S_t^2} = \frac{\partial \Delta}{\partial S_t} = \frac{e^{-r_f \tau} \phi(d_1)}{S_t \sigma \sqrt{\tau}}$$

Из определения производной следует фундаментальное интегральное соотношение:

$$\Delta(S_t) = \int_{-\infty}^{S_t} \Gamma(u) , du$$

Геометрическая асимметрия при сокращении срока до экспирации

Профиль Gamma имеет колоколообразную форму (Bell curve) с максимумом около цены страйка $S_t \approx K e^{-(r_d - r_f - \frac{1}{2}\sigma^2)\tau}$.

       Gamma (Bell Curve)                    Delta (S-Curve)
          ▲                                    ▲
          │      ┌─┐                           │              ┌────── 1.0 (ITM)
          │    ┌─┘ └─┐                         │            ┌─┘
          │  ┌─┘     └─┐                       │        ┌───┘  Δ ≈ 0.5 (ATM)
          │┌─┘         └─┐                     │    ┌───┘
          └───────▲───────► Spot               └───-▲────────────────► Spot
                Strike                               Strike
             (OTM ◄-► ITM)                        (0.0 ◄-► 1.0)

При приближении даты экспирации ($\tau \to 0$):

  1. Пик Гаммы: распределение $\Gamma(S_t)$ вырождается в $\delta$-функцию Дирака, сосредоточенную в точке страйка $K$.
  2. Крутизна Дельты: S-образная кривая Дельты трансформируется в ступенчатую функцию Хевисайда $\theta(S_t - K)$.
  3. Pin Risk и нестабильность хеджа: Если на момент экспирации спот колеблется вблизи страйка, мгновенная смена $\Delta$ от $0$ до $1$ требует дискретной покупки или продажи $100%$ объема базового актива. Это вызывает экстремальное проскальзывание и затраты на спред.

2. Специфика FX-опционов: нумерайр и асимметрия риска при девальвации

В отличие от фондовых опционов, где базовый актив является акцией, а расчеты идут в фиатной валюте (USD), в валютных деривативах оба актива являются валютами.

Рассмотрим котировку пары USD/TRY (доллар США против турецкой лиры) или USD/BRL:

Выбор базовой валюты учета (Numeraire)

Дельта-хеджирование требует выставления встречной позиции на спотовом рынке:

Если капитал фонда или маржинальный счет номинирован в национальной валюте (TRY), а спот возрастает втрое (катастрофическая девальвация национальной валюты), номинальная стоимость позиции в TRY растет пропорционально $S_t$. При этом величина встречного хеджа должна учитывать не только дельту, но и эффект изменения стоимости самого залога:

$$\text{PnL}_{\text{total}} = \Delta C - \Delta_{\text{hedge}} \Delta S_t + \frac{1}{2} \Gamma (\Delta S_t)^2 + \Theta \Delta t$$

Если позиция шорт-гамма ($\Gamma < 0$, продажа опционов вне денег):


3. Архитектура состояний опционной позиции

Жизненный цикл опционной позиции и динамика дельта-хеджирования формализуются следующей диаграммой состояний:

stateDiagram-v2
    [*] --> Deep_OTM: Инициализация позиции (S << K)
    
    Deep_OTM --> Near_ATM: Спот движется к страйку (Gamma растет)
    Near_ATM --> Deep_OTM: Спот падает (Delta -> 0, Gamma -> 0)
    
    Near_ATM --> Pin_Risk_Zone: Экспирация tau -> 0 при S ≈ K
    Near_ATM --> Deep_ITM: Спот пробивает страйк (S >> K)
    
    Deep_ITM --> Near_ATM: Коррекция спота вниз
    Deep_ITM --> Exercise_Settlement: Экспирация ITM (Delta -> 1.0)
    
    Pin_Risk_Zone --> Rebalance_Spike: Дискретный скачок спота
    Rebalance_Spike --> Pin_Risk_Zone: Исполнение ордера ребалансировки
    
    Pin_Risk_Zone --> Expired_Worthless: Экспирация S < K (Delta -> 0)
    Pin_Risk_Zone --> Exercise_Settlement: Экспирация S > K (Delta -> 1)
    
    Expired_Worthless --> [*]
    Exercise_Settlement --> [*]

Режимы нахождения позиции

  1. Deep OTM ($S \ll K$): $\Delta \to 0$, $\Gamma \to 0$. Позиция не требует регулярного спот-хеджирования, портфель нечувствителен к локальным колебаниям.
  2. Near ATM ($S \approx K$): $\Gamma = \max$, наклон кривой Дельты максимален. Ребалансировка спот-хеджа происходит непрерывно при выходе за коридор толерантности $\pm \epsilon_{\Delta}$.
  3. Pin Risk Zone ($\tau \to 0, S \approx K$): Зона критического риска. Малейшее движение цены переводит дельту из $0$ в $1$, генерируя взрывные транзакционные издержки.
  4. Deep ITM ($S \gg K$): $\Delta \to e^{-r_f \tau} \approx 1$, $\Gamma \to 0$. Опцион ведет себя как линейный синтетический форвардный контракт.

4. Поверхность волатильности: Put Skew против Call Skew

В классической модели Блэка-Шоулза предполагается, что подразумеваемая волатильность $\sigma$ константна по всем страйкам и экспирациям. В реальности наблюдается выраженная улыбка или наклон волатильности (Volatility Skew):

$$\sigma = \sigma(K, \tau) \quad \text{или} \quad \sigma = \sigma(\Delta, \tau)$$

Сравнение наклона волатильности на фондовом и валютном рынках

ПараметрФондовый индекс (S&P 500, Nasdaq)Валюта EM (USD/TRY, USD/BRL, USD/ZAR)
Доминирующий рискВнезапный обвал котировок (Market Crash)Катастрофическая девальвация нацвалюты
Форма SkewОтрицательный наклон (Put Skew)Положительный наклон (Call Skew)
Подразумеваемая волатильность$\sigma(K_{\text{put}}) \gg \sigma(K_{\text{call}})$$\sigma(K_{\text{call}}) \gg \sigma(K_{\text{put}})$
Поведение инвесторовХеджирование длинных портфелей путамиПокупка OTM Call на доллар против девальвации
Асимметрия распределенияОтрицательная асимметрия (Negative skewness)Положительная асимметрия (Fat right tail)
       Equity Put Skew (SPX)                    FX Emerging Call Skew (USD/EM)
   IV                                       IV
    ▲                                        ▲
    │ ╲                                      │             ╱
    │  ╲                                     │            ╱
    │   ╲───┐                                │       ┌───╱
    │       └───                             │    ───┘
    └─────────────────► Strike               └─────────────────► Strike
       Put (Crash)    Call                      Put         Call (Devaluation)

На развивающихся рынках премия за риск взрывного ослабления локальной валюты закладывается трейдерами в OTM Call-опционы на иностранную валюту, что создает крутой восходящий наклон кривой подразумеваемой волатильности.


5. Sticky Strike против Sticky Delta и эффективная Дельта

При смещении спот-курса $S_t \to S_t + \Delta S$ поверхность волатильности не остается статичной. Практика квант-десков различает два крайних приближения динамики улыбки:

1. Sticky Strike (Фиксированный страйк)

Предполагается, что волатильность жестко привязана к абсолютному значению страйка $K$:

$$\left. \frac{\partial \sigma}{\partial S_t} \right|_{K = \text{const}} = 0$$

В этом режиме стандартная дельта Блэка-Шоулза является несмещенной оценкой локальной чувствительности цены: $\Delta_{\text{eff}} = \frac{\partial C}{\partial S_t}$.

2. Sticky Delta / Sticky Moneyness (Фиксированная дельта)

Предполагается, что волатильность привязана к монейнессу $m = \frac{S_t}{K}$ или к дельте опциона $\Delta$. При росте спота кривая волатильности смещается вправо вслед за ценой базового актива:

$$\sigma(S_t, K) = f\left(\frac{S_t}{K}\right) \implies \frac{\partial \sigma}{\partial S_t} = \frac{1}{K} f’\left(\frac{S_t}{K}\right) = \frac{\partial \sigma}{\partial K} \frac{S_t}{K} \frac{1}{S_t} \approx \frac{\partial \sigma}{\partial K}$$

Коррекция эффективной дельты (Vanna-эффект)

По правилу дифференцирования сложной функции полная производная премии опциона по спот-курсу равна:

$$\Delta_{\text{eff}} = \frac{d C}{d S_t} = \frac{\partial C}{\partial S_t} + \frac{\partial C}{\partial \sigma} \cdot \frac{\partial \sigma}{\partial S_t} = \Delta_{\text{BS}} + \mathcal{V} \cdot \frac{\partial \sigma}{\partial S_t}$$

где:

На рынке USD/EM с крутым положительным Call Skew ($\frac{\partial \sigma}{\partial K} > 0$):

$$\Delta_{\text{eff}} > \Delta_{\text{BS}}$$

Маркет-мейкер, игнорирующий сдвиг поверхности волатильности и хеджирующий позицию по «сырой» дельте $\Delta_{\text{BS}}$, систематически недохеджирует восходящее движение и несет скрытые убытки от короткой ванны (Short Vanna).


6. Практическая реализация: симуляция динамического хеджирования на Python

Ниже приведена модульная реализация расчета аналитических греков модели Гармана-Кольхагена и симуляция дискретного дельта-хеджирования с учетом полос толерантности (Delta Bands) и эффекта Sticky Delta.

"""
Модуль аналитического расчета греков FX-деривативов и симуляции
динамического дельта-хеджирования с учетом наклона волатильности (Skew).
"""

from dataclasses import dataclass
import numpy as np
from scipy.stats import norm


@dataclass(frozen=True)
class FXOptionParams:
    spot: float           # Спот-курс (Domestic / Foreign)
    strike: float         # Страйк опциона
    tau: float            # Время до экспирации в годах
    vol: float            # Подразумеваемая волатильность (годовая)
    r_dom: float          # Безрисковая ставка валюты котировки
    r_for: float          # Безрисковая ставка базовой валюты
    is_call: bool = True  # True для Call, False для Put


class GarmanKohlhagenEngine:
    """Аналитический калькулятор модели Гармана-Кольхагена для FX-опционов."""

    @staticmethod
    def _d1_d2(p: FXOptionParams) -> tuple[float, float]:
        if p.tau <= 1e-7:
            # Предельный случай перед экспирацией
            d1 = np.inf if p.spot > p.strike else (-np.inf if p.spot < p.strike else 0.0)
            return d1, d1
        
        vol_sqrt_tau = p.vol * np.sqrt(p.tau)
        drift = (p.r_dom - p.r_for + 0.5 * p.vol**2) * p.tau
        d1 = (np.log(p.spot / p.strike) + drift) / vol_sqrt_tau
        d2 = d1 - vol_sqrt_tau
        return float(d1), float(d2)

    @classmethod
    def price(cls, p: FXOptionParams) -> float:
        if p.tau <= 1e-7:
            payoff = max(0.0, p.spot - p.strike) if p.is_call else max(0.0, p.strike - p.spot)
            return payoff

        d1, d2 = cls._d1_d2(p)
        df_for = np.exp(-p.r_for * p.tau)
        df_dom = np.exp(-p.r_dom * p.tau)

        if p.is_call:
            return float(p.spot * df_for * norm.cdf(d1) - p.strike * df_dom * norm.cdf(d2))
        else:
            return float(p.strike * df_dom * norm.cdf(-d2) - p.spot * df_for * norm.cdf(-d1))

    @classmethod
    def delta(cls, p: FXOptionParams, skew_slope: float = 0.0, sticky_delta: bool = False) -> float:
        """
        Расчет дельты. При sticky_delta=True учитывается vanna-эффект сдвига волатильности.
        """
        if p.tau <= 1e-7:
            if p.spot > p.strike:
                return np.exp(-p.r_for * p.tau) if p.is_call else 0.0
            elif p.spot < p.strike:
                return 0.0 if p.is_call else -np.exp(-p.r_for * p.tau)
            return 0.5 * np.exp(-p.r_for * p.tau)

        d1, _ = cls._d1_d2(p)
        df_for = np.exp(-p.r_for * p.tau)
        bs_delta = float(df_for * norm.cdf(d1)) if p.is_call else float(-df_for * norm.cdf(-d1))

        if not sticky_delta or abs(skew_slope) < 1e-9:
            return bs_delta

        # Вега опциона
        vega = float(p.spot * df_for * np.sqrt(p.tau) * norm.pdf(d1))
        
        # dSigma / dSpot для режима Sticky Delta: skew_slope * (1 / K)
        d_sigma_d_spot = skew_slope / p.strike
        
        effective_delta = bs_delta + vega * d_sigma_d_spot
        return effective_delta

    @classmethod
    def gamma(cls, p: FXOptionParams) -> float:
        if p.tau <= 1e-7:
            return 0.0
        d1, _ = cls._d1_d2(p)
        df_for = np.exp(-p.r_for * p.tau)
        denom = p.spot * p.vol * np.sqrt(p.tau)
        return float(df_for * norm.pdf(d1) / denom)


def run_hedging_simulation(
    spot_start: float = 30.0,
    strike: float = 30.0,
    tau_days: int = 30,
    annual_vol: float = 0.25,
    r_dom: float = 0.40,       # 40% ставка для развивающегося рынка (Domestic)
    r_for: float = 0.05,       # 5% ставка USD (Foreign)
    steps_per_day: int = 24,   # Почасовая дискретизация
    rebalance_band: float = 0.02, # Полоса толерантности по Дельте (+- 2%)
    skew_slope: float = 0.15   # Положительный наклон волатильности (Call Skew)
) -> dict[str, float]:
    """Симуляция PnL дискретно ребалансируемого дельта-нейтрального портфеля."""
    total_steps = tau_days * steps_per_day
    dt = 1.0 / (365.0 * steps_per_day)
    total_tau = tau_days / 365.0

    # Генерация геометрического броуновского движения для спота
    np.random.seed(42)
    drift = (r_dom - r_for) * dt
    diffusion = annual_vol * np.sqrt(dt)
    shocks = np.random.normal(0, 1, total_steps)

    spot_path = np.zeros(total_steps + 1)
    spot_path[0] = spot_start
    for i in range(total_steps):
        spot_path[i + 1] = spot_path[i] * np.exp(drift - 0.5 * diffusion**2 + diffusion * shocks[i])

    # Инициализация короткой позиции по Call-опциону (объем 1 000 000 USD)
    notional = 1_000_000.0
    p0 = FXOptionParams(spot_path[0], strike, total_tau, annual_vol, r_dom, r_for, is_call=True)
    initial_call_price = GarmanKohlhagenEngine.price(p0)
    current_delta = GarmanKohlhagenEngine.delta(p0, skew_slope=skew_slope, sticky_delta=True)

    # Кассовый баланс (получили премию, купили дельта-хедж)
    cash_domestic = (initial_call_price * notional) - (current_delta * notional * spot_path[0])
    hedge_units_base = current_delta * notional

    rebalance_count = 0
    total_trading_cost = 0.0
    half_spread_bps = 0.0005  # 5 bps транзакционные издержки

    current_tau = total_tau
    for step in range(1, total_steps + 1):
        s_current = spot_path[step]
        current_tau = max(1e-7, total_tau - step * dt)

        # Начисление ставок на остатки денежных средств и позицию хеджа
        cash_domestic *= np.exp(r_dom * dt)

        # Оценка текущей дельты
        params = FXOptionParams(s_current, strike, current_tau, annual_vol, r_dom, r_for, is_call=True)
        target_delta = GarmanKohlhagenEngine.delta(params, skew_slope=skew_slope, sticky_delta=True)

        delta_diff = target_delta - (hedge_units_base / notional)

        # Проверка выхода за полосу толерантности
        if abs(delta_diff) >= rebalance_band or step == total_steps:
            units_to_trade = delta_diff * notional
            trade_cost = abs(units_to_trade) * s_current * half_spread_bps
            total_trading_cost += trade_cost

            cash_domestic -= (units_to_trade * s_current + trade_cost)
            hedge_units_base += units_to_trade
            rebalance_count += 1

    # Финал при экспирации
    terminal_spot = spot_path[-1]
    payoff_per_unit = max(0.0, terminal_spot - strike)
    option_obligation = payoff_per_unit * notional

    # Ликвидация спот-хеджа
    hedge_liquidation = hedge_units_base * terminal_spot
    final_pnl = cash_domestic + hedge_liquidation - option_obligation

    return {
        "final_spot": terminal_spot,
        "initial_option_premium": initial_call_price * notional,
        "option_terminal_payoff": option_obligation,
        "rebalance_count": float(rebalance_count),
        "total_trading_costs": total_trading_cost,
        "final_hedge_error_pnl": final_pnl
    }


if __name__ == "__main__":
    result = run_hedging_simulation()
    print("Результаты симуляции дельта-хеджирования:")
    for k, v in result.items():
        print(f"  {k}: {v:,.2f}")

7. Риск-менеджмент деска: полосы толерантности и издержки ребалансировки

При практическом управлении опционной книгой попытка непрерывно поддерживать строго нулевую Дельту ведет к разорению из-за транзакционных издержек (Bid-Ask Spread и биржевых комиссий).

По модели Лиланда (Leland, 1985) наличие дискретности ребалансировки $\Delta t$ и спреда $k$ эквивалентно расширению эффективной волатильности:

$$\sigma_{\text{eff}}^2 = \sigma^2 \left( 1 + \sqrt{\frac{2}{\pi}} \frac{k}{\sigma \sqrt{\Delta t}} \right)$$

Для оптимизации соотношения между рыночным риском и издержками применяются следующие алгоритмические барьеры:

  1. Delta Bands (Полосы толерантности): Ребалансировка инициируется только при отклонении накопленной дельты портфеля от целевой на величину $|\Delta_{\text{curr}} - \Delta_{\text{target}}| > \epsilon$. Величина коридора $\epsilon$ динамически масштабируется пропорционально локальной волатильности и обратно пропорционально глубине ликвидности в биржевом стакане.
  2. Time-decay Scaling: По мере приближения к экспирации ($\tau < 3$ дней) и вхождении в зону Pin Risk деск переходит от дельта-хеджирования к закрытию позиции через ролловер (Roll forward) во избежание квадратичного роста потерь от гамма-всплесков.
  3. Cross-Greeks Hedging: Хеджирование риска волатильности (Vega) и наклона улыбки (Vanna) осуществляется встречными позициями в ликвидных биржевых опционах (Vanilla Straddles / Risk Reversals), что снижает локальную кривизну $\Gamma$ всей книги.

Резюме для алготрейдера