Давайте научимся строить кривую дисконтирования. Скажу сразу: очень важно иметь актуальные рыночные данные. Если вы будете искать 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