Масштаб и значимость рынка процентных производных инструментов

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

Цель и структура статьи

Настоящая статья посвящена детальному разбору алгоритма калибровки дисконтных кривых. В качестве наглядного примера рассмотрено построение дисконтной кривой на основе рыночных котировок процентных свопов, привязанных к индикатору RUONIA (Ruble OverNight Index Average) — ключевому безрисковому бенчмарку российского денежного рынка.

Ключевые составляющие

  1. Детальная спецификация калибровочных инструментов. От составляющих спецификации — таких как частота платежей, календарные конвенции и базовый процентный индикатор — напрямую зависит структура и размер будущих денежных потоков. Это является абсолютной основой для корректной оценки стоимости каждой из ног свопа.

  2. Четкое понимание алгоритма бутстрапа. Бутстрап — это итеративный алгоритм, позволяющий построить дисконтную кривую на основе рыночных котировок. Дисконт-фактор, найденный из предыдущего инструмента, используется в качестве входного параметра для калибровки следующего по сроку инструмента.

  3. Оперирование ставками непрерывного начисления.

    1. Математическое удобство. Формулы дисконтирования и наращения достигают максимальной элегантности: DF(t) = e^{-r \cdot t}; FV(t) = e^{r \cdot t}.

    2. Универсальность. После калибровки кривой непрерывных ставок ее можно легко и однозначно конвертировать в ставку с любой другой конвенцией начисления (годовой, полугодовой, квартальной).

    3. Фундаментальная корректность*. Использование начисления отличного от непрерывного искажает истинную временную структуру. Ставка, являющаяся параметром иной конвенции начисления прячет истинную, нелинейную временную структуру за своим единым значением.

Практический пример: Построение кривой по свопам на RUONIA

Рассмотрим процесс калибровки кривой для сроков от 1 недели до 5 лет на основе рыночных котирок процентных свопов, где плавающая нога привязана к индикатору RUONIA.

Определим ключевые условия спецификации IRS (interest Rate Swap).

  • Все свопы предполагают ежегодные платежи по фиксированной ноге. То есть, для свопов со сроком менее года (от 1W до 1Y) происходит всего один фиксированный платеж в дату экспирации. Для свопов на срок более 1 года платежи происходят раз в год.

  • Плавающая нога свопа привязана к индикатору RUONIA, который может рассматриватсья в качестве аналога безрисковой ставки, несущей в себе минимум кредитного риска.

  • Своп заключается на Compound ON ставку. Это означает, что фиксированная ставка, которую мы видим в котировке, является прямой альтернативой той доходности, которую инвестор получил бы от ежедневной капитализации (компаудинга) по индикатору RUONIA в течение всего срока действия свопа.

    Данная конвенция является обязательной для калибровки дисконтной кривой, поскольку определяет теоретический максимум наращения — потолок доходности для безрискового индикатора.

Этап 1: Калибровка короткого конца кривой (сроки ≤ 1 год)

Для инструментов с одним платежом расчёт дисконтного фактора (DF) прямолинеен. Ставка по свопу для этих сроков по сути является спотовой ставкой для соответствующей даты, так как поток единственный.

Пример для 3-месячного и 1-летнего свопа:

FV_{3M} = 1 + 0.1560 \cdot \frac{93}{365} = 1.0397FV_{1Y} = 1 + 0.1670 \cdot 1 = 1.1670

Чтобы найти дисконт-фактор:

DF_{6M}=\frac{1}{1.0397}=0.9618DF{1Y}=\frac{1}{1.1670}=0.8569

Чтобы найти непрерывную ставку:

R_{6M}=\frac{\ln(1.0397)}{\frac{93}{365}}=0.1528R_{1Y}=\ln(1.1670)=0.1544

Этап 2: Калибровка длинного конца кривой (сроки > 1 года)

Для свопов с несколькими платежами мы используем метод бутстрапа — последовательно обрабатываем ставки от коротких сроков к длинным.

Шаг 1: Строим платежи по 2-летнему свопу

  • В конце года 1: платеж 0.1580 (проценты)

  • В конце года 2: платеж 1.1580 (проценты + номинал)

Шаг 2: Строим уравнение денежных потоков
Стоимость всех будущих фиксированных платежей должна равняться сегодняшней стоимости плавающей ноги, что эквивалентно номиналу (1), в соответствии с принципом безарбитражности.

0.1580\cdot 0.8569+1.1580 \cdot DF_{2Y}​=1

Шаг 3: Находим неизвестный дисконт-фактор и зашитую в него ставку непрерывного начисления.

\frac{1}{e^{R\cdot 2}}=  \frac{1 - 0.1580 \cdot 0.8569}{1.1580};e^{-Rt}=0.7468; R_{2Y}=- \frac{\ln(0.7468)}{2}≈0.146

Проделав эту операцию для всех сроков, получаем уравнения с одной неизвестной, решая которые формируем временную структуру стоимости денежных средств.

Код на python
import pandas as pd
import numpy as np
from scipy.optimize import root_scalar
import time

def bootstrap_curve(market_data):   
    print("Калибровка началась...")
    start_time = time.perf_counter()
    
    # Подготовка данных
    days = market_data.index.values
    rates = market_data.values.flatten() / 100
    years = days / 365.0
    n = len(days)
    
    # Инициализация результатов
    df_values = np.zeros(n)
    
    # Векторизованный расчет для коротких сроков (≤1 год)
    short_mask = years <= 1
    df_values[short_mask] = 1 / (1 + rates[short_mask] * years[short_mask])
    
    # Бутстрап для длинных сроков
    for i in np.where(~short_mask)[0]:
        n_years = int(years[i])
        payment_days = np.arange(1, n_years + 1) * 365
        
        known_indices = np.searchsorted(days[:i+1], payment_days[:-1])
        
        pv_known = np.sum(rates[i] * df_values[known_indices])
        
        # Решаем уравнение для последнего DF
        target_pv = 1.0 - pv_known
        last_payment = rates[i] + 1.0
        df_values[i] = target_pv / last_payment
    
    # Непрерывные ставки
    continuous_rates = -np.log(df_values) / years * 100
    
    # Формирование результата
    result = pd.DataFrame({
        'Срок (дней)': days,
        'Срок (лет)': years,
        'Котировка (%)': rates * 100,
        'Дисконт-фактор (DF)': df_values,
        'Непрерывная ставка (%)': continuous_rates
    })
    
    elapsed_time = time.perf_counter() - start_time
    print(f"Калибровка завершена за {elapsed_time*1000:.2f} мс")
    
    return result


# Исходные данные
market_data = pd.DataFrame(
    [15.00, 15.04, 15.10, 15.30, 15.60, 16.10, 16.70, 15.80, 15.40, 15.30, 15.10],
    index=[7, 14, 31, 62, 93, 184, 365, 730, 1095, 1460, 1825]
)

# Калибровка
result = bootstrap_curve(market_data)
display(result)

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

Графическое представление

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

John C. Hull. "Options, Futures and Other Derivatives"

  • Глава 4: "Interest Rates" — детально разбираются основы процентных ставок, различные конвенции начисления процентов и методы измерения доходностей, что является фундаментом для понимания временной структуры.

  • Глава 7: "Swaps" — подробно рассматривается устройство и оценка процентных свопов, которые являются ключевыми инструментами для калибровки длинного конца кривой.

Комментарии (0)