Давайте научимся строить кривую дисконтирования. Скажу сразу: очень важно иметь актуальные рыночные данные. Если вы будете искать interest rate свопы на доллар, евро или какую-нибудь другую валюту, то в интернете не так много открытой информации. Большинство данных доступны либо через торговые терминалы, либо у специальных компаний — провайдеров рыночных данных. Я нашел на сайте одной крупной скандинавской банковской группы данные по датской, шведской и норвежской кронам, а также данные для евро и доллара.

Далее мы попробуем построить кривую дисконтирования для шведской кроны.
Данный пост — адаптированная версия моей третьей видеолекции «Построение кривой дисконтирования» в рамках курса Finmath for Fintech.
Итак, наша кривая дисконтирования для кроны будет состоять из ставок овернайт на каждый день. Первое, что нам известно, — так называемый base rate — ставка на короткие депозиты (кредиты). Далее, известны свопы, начиная с одного года до тридцати лет. Для иллюстрации метода мы построим кривую до десяти лет. Текущие значения рыночных данных можно увидеть на этом изображении:

Чтобы начать строить кривую, нам нужно сделать несколько предположений.
Давайте для упрощения считать, что наши свопы — это fix floating свопы с периодичностью выплат раз в шесть месяцев. Ниже приведена схема для одногодичного свопа. Мы знаем, что в начале base rate равен нулю процентов. Чтобы посчитать честную цену свопа, нам нужно знать значение дискаунт-фактора шести месяцев и дискаунт-фактора 12 месяцев. Что у нас будет в качестве плавающей «ноги»? Предположим, что в качестве нее мы будем платить среднее значение овернайтов за каждый из диапазонов. То есть значение плавающей «ноги» до шести месяцев — это будет среднее значение овернайтов за 180 дней. Плавающая «нога» для точки 12 месяцев будет то же самое, только здесь будет суммирование начиная со 181 дня до 360-го.

Данный способ усреднения широко известен. Он называется overnight index swap и очень часто используется в рыночных продуктах. Плавающая «нога» тут определяется как среднее за период.
Мы знаем значение базовой ставки и стоимость свопа. Очевидно, что если мы запишем формулу честной цены «в лоб», то у нас будет слишком много неизвестных. У нас неизвестен дискаунт-фактор для 6 месяцев, дискаунт-фактор для 12 месяцев и неизвестны значения процентных ставок кроме одного — самого первого. Слишком много неизвестных, и всего лишь одно уравнение.

В решении этой задачи нам поможет следующая гипотеза. Мы знаем процен��ную ставку в точке ноль — это base rate. Мы предположим, что наши процентные ставки изменяются линейно. Обозначим как X значение процентной ставки в точке 12 месяцев.

В точке 6 месяцев это будет X/2 (среднее арифметическое между нулем и X), и мы можем найти значение процентной ставки в любой произвольный день. И нет ничего сложного в том, чтобы посчитать нашу плавающую процентную ставку в точках 6 и 12 месяцев:
Теперь перейдем к дискаунт-факторам. Мы используем кривую дисконтирования на основе овернайт рэйта. Поэтому дискаунт-фактор в точке шесть месяцев — произведение 180 дискаунт-факторов в каждой точке, и это будет, очевидно, являться какой-то функцией от X.

Дискаунт-фактор в точке 12 месяцев строится аналогичным образом с той лишь разницей, что мне нужно больше множителей. Это тоже будет какая-то функция от X.

Итак, дискаунт-факторы выражены через X, также есть первое и второе значения плавающей ставки. Перейдем к записи уравнения. Значение цены свопа нам известно, допустим, оно равно P. Вспомним уравнение для честной цены. Нам надо P умножить на дисконт-фактор в точке двенадцати месяцев и приравнять к следующей сумме:

Напомню, дискаунт-фактор для одного дня будет определяться следующей формулой:
где ri — значение процентной ставки. Число 360 я использую из предположения, что в году 360 дней (это вполне распространенное соглашение о календарях). В каждой конкретной точке мы знаем, как выразить дискаунт-фактор, ri выражается через X, с исползованием линейной интерполяции. Наше уравнение оказывается всего с одним неизвестным, и его можно решить, используя численные методы. Как это делается — смотрите в коде на Python.
Итак, мы знаем, как найти значение нашей ставки в точке 1 год. Используя предположение о линейной интерполяции и исходя из значения свопа, которое нам известно с рынка, мы найдем наше значение X. Вот мы построили первый участок нашей кривой:

Теперь, чтобы посчитать цену свопа на два года, нам нужно значение в точке 6 месяцев, 12 месяцев, 18 месяцев и 2 года. Мы будем использовать точно такое же предположение, как в прошлый раз. Назовем значение искомой ставки Y и также будем использовать предположение о линии интерполяции, восстановив второй участок кривой. Таким образом, шаг за шагом мы дойдем до конца — до точки 10 лет.

Такой метод называется bootstrap. Он не является идеальным или единственно верным, но достаточно прост для реализации и понимания — в качестве стартового уровня метод bootstrap отлично подходит.

Мы нашли дискаунт-кривую. Что она нам дает? Если говорить формально, то это значения овернайт-ставки в любой точке в будущем до десяти лет. Вы, наверное, спросите: «А кому это надо?». Действительно, трудно себе представить сценарий, когда к вам придет клиент и скажет: «Я хочу открыть однодневный депозит, который начнется через 567 дней». Это довольно непонятная ситуация, и в таком непосредственном виде воспринимать построенную кривую не стоит.
Представим себе, что у нас есть какой-��о платеж в будущем, скажем семь с половиной лет. Вопрос: как мы узнаем его текущую стоимость?
Как раз на этот вопрос и даст ответ дискаунт-кривая. Мы пройдем по каждой точке кривой, посчитаем в каждой точке дискаунт-фактор и закончим свой путь в точке семь с половиной лет, найдем результирующий дискаунт-фактор, умножим на платеж — это будет честная цена.

Ту модель, которую я использовал, а именно — какие я брал плавающие ставки, как я интерполировал промежуточные значения, и вообще тот факт, что я выбрал интерполяцию, очень сильно было определено тем, какие именно данные у меня есть. У меня было очень мало данных — только одна базовая ставка и значения свопов. Если мне доступно больше данных, либо они другие, то, скорее всего, я изменю модель. Но метод bootstrap (когда вы строите кривую сначала на коротком участке, а затем строите все дальше и дальше, опираясь на полученные ранее значения) все равно применим.
Теперь вспомним, что помимо дискаунт-кривых нам нужны кривые LIBOR (TIBOR, EURIBOR и пр.). Разница будет в том, какие инструменты мы добавляем в нашу модель для расчета. Мы будем искать контракты, содержащие LIBOR, и похожим способом, используя метод bootstrap, восстановим LIBOR-кривую.
Если вам придется строить настоящую LIBOR-кривую, очень внимательно отнеситесь к тому, какие инструменты вы используете для ее построения, внимательно оцените ту модель, которую вы будете применять. В данном случае я использовал дисконтирование овернайт, но для построения LIBOR-кривой нужен другой способ. Скорее всего, дисконтирование будет каждые три месяца или шесть, в зависимости от инструмента. Если у вас есть достаточно данных, вы можете построить LIBOR-кривую, EURIBOR-кривую, TIBOR-кривую и любую другую.
Если к вам приходит клиент со словами: «Я хочу процентный своп не на десять лет, а на 134 месяца, в которые буду платить каждые 25 дней плавающий LIBOR» — это не проблема. У нас есть LIBOR-кривая, мы используем предположение об интерполяции, мы можем восстановить значение LIBOR в любой точке. Мы знаем значение дискаунт-кривой в каждой точке, мы тоже можем подсчитать все платежи и найти ту самую цену фиксированной «ноги», которая уравновешивает эти плавающие платежи. Тем самым вы можете найти значения честной цены для совершенно любого инструмента, построив несколько кривых.
Итак, дав��йте еще раз пробежимся по основным моментам. Я взял доступные данные и сформулировал несколько допущений. Во-первых, расписание платежей: как часто, с какой периодичностью каждая сторона платит фиксированную «ногу» и плавающую «ногу». Во-вторых, как я буду считать ставку на плавающей «ноге». Третье предположение — о линейной интерполяции ставок. Используя все эти три предположения, я сформулировал несколько нелинейных уравнений, которые решил численно. Jupyter notebook вы найдете по ссылке. Последовательно, начиная с самого короткого отрезка в один год, далее два года, три и т.д., я восстановил кривую на промежутке до 10 лет. Это моя дискаунт-кривая, которую я могу использовать для оценки любых инструментов. Такой метод называется bootstrap: отрезок кривой, который я посчитал в самом начале, использую на втором шаге, а то, что получил на втором шаге, я использую для третьего шага и так далее, пока кривая не сформируется полностью.
Надеюсь, теперь вы больше не «плаваете» в теме плавающих процентных ставок и среди interest rate свопов сможете найти ванильный. А еще сможете построить любую кривую методом bootstrap.
Все статьи этой серии

Далее мы попробуем построить кривую дисконтирования для шведской кроны.
Данный пост — адаптированная версия моей третьей видеолекции «Построение кривой дисконтирования» в рамках курса Finmath for Fintech.
Итак, наша кривая дисконтирования для кроны будет состоять из ставок овернайт на каждый день. Первое, что нам известно, — так называемый base rate — ставка на короткие депозиты (кредиты). Далее, известны свопы, начиная с одного года до тридцати лет. Для иллюстрации метода мы построим кривую до десяти лет. Текущие значения рыночных данных можно увидеть на этом изображении:

Чтобы начать строить кривую, нам нужно сделать несколько предположений.
Давайте для упрощения считать, что наши свопы — это fix floating свопы с периодичностью выплат раз в шесть месяцев. Ниже приведена схема для одногодичного свопа. Мы знаем, что в начале base rate равен нулю процентов. Чтобы посчитать честную цену свопа, нам нужно знать значение дискаунт-фактора шести месяцев и дискаунт-фактора 12 месяцев. Что у нас будет в качестве плавающей «ноги»? Предположим, что в качестве нее мы будем платить среднее значение овернайтов за каждый из диапазонов. То есть значение плавающей «ноги» до шести месяцев — это будет среднее значение овернайтов за 180 дней. Плавающая «нога» для точки 12 месяцев будет то же самое, только здесь будет суммирование начиная со 181 дня до 360-го.

Данный способ усреднения широко известен. Он называется overnight index swap и очень часто используется в рыночных продуктах. Плавающая «нога» тут определяется как среднее за период.
Мы знаем значение базовой ставки и стоимость свопа. Очевидно, что если мы запишем формулу честной цены «в лоб», то у нас будет слишком много неизвестных. У нас неизвестен дискаунт-фактор для 6 месяцев, дискаунт-фактор для 12 месяцев и неизвестны значения процентных ставок кроме одного — самого первого. Слишком много неизвестных, и всего лишь одно уравнение.

В решении этой задачи нам поможет следующая гипотеза. Мы знаем процен��ную ставку в точке ноль — это base rate. Мы предположим, что наши процентные ставки изменяются линейно. Обозначим как X значение процентной ставки в точке 12 месяцев.

В точке 6 месяцев это будет X/2 (среднее арифметическое между нулем и X), и мы можем найти значение процентной ставки в любой произвольный день. И нет ничего сложного в том, чтобы посчитать нашу плавающую процентную ставку в точках 6 и 12 месяцев:
Теперь перейдем к дискаунт-факторам. Мы используем кривую дисконтирования на основе овернайт рэйта. Поэтому дискаунт-фактор в точке шесть месяцев — произведение 180 дискаунт-факторов в каждой точке, и это будет, очевидно, являться какой-то функцией от X.

Дискаунт-фактор в точке 12 месяцев строится аналогичным образом с той лишь разницей, что мне нужно больше множителей. Это тоже будет какая-то функция от X.

Итак, дискаунт-факторы выражены через X, также есть первое и второе значения плавающей ставки. Перейдем к записи уравнения. Значение цены свопа нам известно, допустим, оно равно P. Вспомним уравнение для честной цены. Нам надо P умножить на дисконт-фактор в точке двенадцати месяцев и приравнять к следующей сумме:

Напомню, дискаунт-фактор для одного дня будет определяться следующей формулой:
где ri — значение процентной ставки. Число 360 я использую из предположения, что в году 360 дней (это вполне распространенное соглашение о календарях). В каждой конкретной точке мы знаем, как выразить дискаунт-фактор, ri выражается через X, с исползованием линейной интерполяции. Наше уравнение оказывается всего с одним неизвестным, и его можно решить, используя численные методы. Как это делается — смотрите в коде на Python.
Итак, мы знаем, как найти значение нашей ставки в точке 1 год. Используя предположение о линейной интерполяции и исходя из значения свопа, которое нам известно с рынка, мы найдем наше значение X. Вот мы построили первый участок нашей кривой:

Теперь, чтобы посчитать цену свопа на два года, нам нужно значение в точке 6 месяцев, 12 месяцев, 18 месяцев и 2 года. Мы будем использовать точно такое же предположение, как в прошлый раз. Назовем значение искомой ставки Y и также будем использовать предположение о линии интерполяции, восстановив второй участок кривой. Таким образом, шаг за шагом мы дойдем до конца — до точки 10 лет.

Такой метод называется bootstrap. Он не является идеальным или единственно верным, но достаточно прост для реализации и понимания — в качестве стартового уровня метод bootstrap отлично подходит.

Мы нашли дискаунт-кривую. Что она нам дает? Если говорить формально, то это значения овернайт-ставки в любой точке в будущем до десяти лет. Вы, наверное, спросите: «А кому это надо?». Действительно, трудно себе представить сценарий, когда к вам придет клиент и скажет: «Я хочу открыть однодневный депозит, который начнется через 567 дней». Это довольно непонятная ситуация, и в таком непосредственном виде воспринимать построенную кривую не стоит.
Представим себе, что у нас есть какой-��о платеж в будущем, скажем семь с половиной лет. Вопрос: как мы узнаем его текущую стоимость?
Как раз на этот вопрос и даст ответ дискаунт-кривая. Мы пройдем по каждой точке кривой, посчитаем в каждой точке дискаунт-фактор и закончим свой путь в точке семь с половиной лет, найдем результирующий дискаунт-фактор, умножим на платеж — это будет честная цена.

Ту модель, которую я использовал, а именно — какие я брал плавающие ставки, как я интерполировал промежуточные значения, и вообще тот факт, что я выбрал интерполяцию, очень сильно было определено тем, какие именно данные у меня есть. У меня было очень мало данных — только одна базовая ставка и значения свопов. Если мне доступно больше данных, либо они другие, то, скорее всего, я изменю модель. Но метод bootstrap (когда вы строите кривую сначала на коротком участке, а затем строите все дальше и дальше, опираясь на полученные ранее значения) все равно применим.
Теперь вспомним, что помимо дискаунт-кривых нам нужны кривые LIBOR (TIBOR, EURIBOR и пр.). Разница будет в том, какие инструменты мы добавляем в нашу модель для расчета. Мы будем искать контракты, содержащие LIBOR, и похожим способом, используя метод bootstrap, восстановим LIBOR-кривую.
Если вам придется строить настоящую LIBOR-кривую, очень внимательно отнеситесь к тому, какие инструменты вы используете для ее построения, внимательно оцените ту модель, которую вы будете применять. В данном случае я использовал дисконтирование овернайт, но для построения LIBOR-кривой нужен другой способ. Скорее всего, дисконтирование будет каждые три месяца или шесть, в зависимости от инструмента. Если у вас есть достаточно данных, вы можете построить LIBOR-кривую, EURIBOR-кривую, TIBOR-кривую и любую другую.
Если к вам приходит клиент со словами: «Я хочу процентный своп не на десять лет, а на 134 месяца, в которые буду платить каждые 25 дней плавающий LIBOR» — это не проблема. У нас есть LIBOR-кривая, мы используем предположение об интерполяции, мы можем восстановить значение LIBOR в любой точке. Мы знаем значение дискаунт-кривой в каждой точке, мы тоже можем подсчитать все платежи и найти ту самую цену фиксированной «ноги», которая уравновешивает эти плавающие платежи. Тем самым вы можете найти значения честной цены для совершенно любого инструмента, построив несколько кривых.
Итак, дав��йте еще раз пробежимся по основным моментам. Я взял доступные данные и сформулировал несколько допущений. Во-первых, расписание платежей: как часто, с какой периодичностью каждая сторона платит фиксированную «ногу» и плавающую «ногу». Во-вторых, как я буду считать ставку на плавающей «ноге». Третье предположение — о линейной интерполяции ставок. Используя все эти три предположения, я сформулировал несколько нелинейных уравнений, которые решил численно. Jupyter notebook вы найдете по ссылке. Последовательно, начиная с самого короткого отрезка в один год, далее два года, три и т.д., я восстановил кривую на промежутке до 10 лет. Это моя дискаунт-кривая, которую я могу использовать для оценки любых инструментов. Такой метод называется bootstrap: отрезок кривой, который я посчитал в самом начале, использую на втором шаге, а то, что получил на втором шаге, я использую для третьего шага и так далее, пока кривая не сформируется полностью.
Надеюсь, теперь вы больше не «плаваете» в теме плавающих процентных ставок и среди interest rate свопов сможете найти ванильный. А еще сможете построить любую кривую методом bootstrap.
Все статьи этой серии
- Стоимость денег, типы процентов, дисконтирование и форвардные ставки. Ликбез для гика, ч. 1
- Облигации: купонные и бескупонные, расчет доходности. Ликбез для гика, ч. 2
- Облигации: оценка рисков и примеры использования. Ликбез для гика, ч. 3
- Как банки берут друг у друга в долг. Плавающие ставки, процентные свопы. Ликбез для гика, ч. 4
- Построение кривой дисконтирования. Ликбез для гика, ч. 5
- Что такое опционы и кому это нужно. Ликбез для гика, ч. 6
- Опционы: пут-колл парити, броуновское движение. Ликбез для гика, ч. 7
