exponenta event banner

bondDefaultBootstrap

Кривая вероятности дефолта начальной загрузки из цен облигаций

Описание

пример

[ProbabilityData,HazardData] = bondDefaultBootstrap(ZeroData,MarketData,Settle) загрузит кривую вероятности дефолта из цен облигаций.

Используя bondDefaultBootstrap, вы можете:

  • Извлеките дискретные вероятности дефолта для определенного периода из данных рыночных облигаций.

  • Интерполяция этих вероятностей по умолчанию для получения кривой вероятности по умолчанию для целей ценообразования и управления рисками.

пример

[ProbabilityData,HazardData] = bondDefaultBootstrap(___,Name,Value) добавляет необязательные аргументы пары имя-значение.

Примеры

свернуть все

Используйте следующие данные облигации.

 Settle = datenum('08-Jul-2016');
 MarketDate = datenum({'06/15/2018', '01/08/2019', '02/01/2021', '03/18/2021', '08/04/2025'}','mm/dd/yyyy');
 CouponRate = [2.240 2.943 5.750 3.336 4.134]'/100;
 MarketPrice = [101.300 103.020 115.423 104.683 108.642]';
 MarketData = [MarketDate,MarketPrice,CouponRate];

Рассчитайте ProbabilityData и HazardData.

TreasuryParYield = [0.26 0.28 0.36 0.48 0.61 0.71 0.95 1.19 1.37 1.69 2.11]'/100;
TreasuryDates = datemnth(Settle, [[1 3 6], 12 * [1 2 3 5 7 10 20 30]]');
[ZeroRates, CurveDates] = pyld2zero(TreasuryParYield, TreasuryDates, Settle);
ZeroData = [CurveDates, ZeroRates];
format longg
[ProbabilityData,HazardData]=bondDefaultBootstrap(ZeroData,MarketData,Settle)
ProbabilityData = 5×2

                    737226        0.0299675399937611
                    737433        0.0418832295824674
                    738188         0.090518332884262
                    738233         0.101248065083713
                    739833         0.233002708031915

HazardData = 5×2

                    737226        0.0157077745460244
                    737433        0.0217939816590403
                    738188         0.025184912824721
                    738233        0.0962608718640789
                    739833        0.0361632398787917

В bondDefaultBootstrap, первый столбец ProbabilityData и первый столбец HazardData выходные данные содержат соответствующие даты окончания для соответствующих вероятностей по умолчанию и коэффициентов опасности. Однако начальные даты, используемые для вычисления временных диапазонов для вероятностей по умолчанию, могут отличаться от дат для коэффициентов опасности. Для вероятностей по умолчанию все временные диапазоны вычисляются из Settle даты до соответствующих дат окончания, указанных в первом столбце ProbabilityData. Напротив, временные диапазоны для уровней опасности вычисляются с использованием Settle дата и первый столбец HazardData, так что первая степень опасности применяется из Settle дата - первая рыночная дата, вторая ставка риска - с первой по вторую рыночную дату и так далее, и последняя ставка риска применяется с второй по последнюю рыночную дату и далее.

datestr(Settle)
ans = 
'08-Jul-2016'
datestr(ProbabilityData(:,1))
ans = 5x11 char array
    '15-Jun-2018'
    '08-Jan-2019'
    '01-Feb-2021'
    '18-Mar-2021'
    '04-Aug-2025'

datestr(HazardData(:,1))
ans = 5x11 char array
    '15-Jun-2018'
    '08-Jan-2019'
    '01-Feb-2021'
    '18-Mar-2021'
    '04-Aug-2025'

Временные диапазоны для всех вероятностей по умолчанию начинаются с '08-Jul-2016' и они заканчиваются на '15-Jun-2018', '08-Jan-2019', '01-Feb-2021', '18-Mar-2021', и '04-Aug-2025'соответственно. Что касается уровней опасности, то первый уровень опасности начинается с '08-Jul-2016' и заканчивается на '15-Jun-2018', второй уровень опасности начинается с '15-Jun-2018' и заканчивается на '08-Jan-2019', третий уровень опасности начинается с '08-Jan-2019' и заканчивается на '01-Feb-2021'и так далее.

Перепродайте одну из облигаций из списка облигаций на основе кривой вероятности дефолта. Ожидаемый результат этой переоценки - идеальное совпадение с рыночной цитатой.

Используйте следующие данные Минфина США.

Settle = datetime('08-Jul-2016','Locale','en_US');
TreasuryParYield = [0.26 0.28 0.36 0.48 0.61 0.71 0.95 1.19 1.37 1.69 2.11]'/100;
TreasuryDates = datemnth(Settle, [[1 3 6], 12 * [1 2 3 5 7 10 20 30]]');

Предварительный просмотр даты облигации с использованием полугодовых купонных облигаций с рыночными котировками, ставками купонов и датой расчета July-08-2016.

MarketDate = datenum({'06/01/2017','06/01/2019','06/01/2020','06/01/2022'}','mm/dd/yyyy');
CouponRate = [7 8 9 10]'/100;
MarketPrice = [101.300 109.020 114.42 118.62]';
MarketData = [MarketDate, MarketPrice, CouponRate];

BondList = array2table(MarketData, 'VariableNames', {'Maturity', 'Price','Coupon'});
BondList.Maturity = datetime(BondList.Maturity,'Locale','en_US','ConvertFrom','datenum');
BondList.Maturity.Format = 'MMM-dd-yyyy'
BondList=4×3 table
     Maturity      Price     Coupon
    ___________    ______    ______

    Jun-01-2017     101.3     0.07 
    Jun-01-2019    109.02     0.08 
    Jun-01-2020    114.42     0.09 
    Jun-01-2022    118.62      0.1 

Выберите вторую купонную облигацию в качестве ценовой.

number = 2;
TestCase = BondList(number, :);

Просмотрите предоставленные здесь данные о безрисковой скорости, основанные на непрерывной составной скорости.

[ZeroRates, CurveDates] = pyld2zero(TreasuryParYield, TreasuryDates, Settle);
ZeroData = [datenum(CurveDates), ZeroRates];
RiskFreeRate = array2table(ZeroData, 'VariableNames', {'Date', 'Rate'});
RiskFreeRate.Date = datetime(RiskFreeRate.Date,'Locale','en_US','ConvertFrom','datenum');
RiskFreeRate.Date.Format = 'MMM-dd-yyyy'
RiskFreeRate=11×2 table
       Date          Rate   
    ___________    _________

    Aug-08-2016    0.0026057
    Oct-08-2016    0.0027914
    Jan-08-2017    0.0035706
    Jul-08-2017    0.0048014
    Jul-08-2018    0.0061053
    Jul-08-2019    0.0071115
    Jul-08-2021    0.0095416
    Jul-08-2023     0.012014
    Jul-08-2026     0.013883
    Jul-08-2036     0.017359
    Jul-08-2046     0.022704

Загрузите кривую вероятности дефолта (PD) из облигаций.

format longg
[defaultProb1, hazard1] = bondDefaultBootstrap(ZeroData, MarketData, Settle)
defaultProb1 = 4×2

                    736847        0.0704863142317494
                    737577         0.162569420050034
                    737943         0.217308133826188
                    738673          0.38956773145021

hazard1 = 4×2

                    736847        0.0813390794774647
                    737577        0.0521615800986281
                    737943        0.0674145844133183
                    738673          0.12428587278862

format

Переформатируйте вероятность по умолчанию и степень опасности для лучшего представления.

DefProbHazard = [defaultProb1, hazard1(:,2)];
DefProbHazardTable = array2table(DefProbHazard, 'VariableNames', {'Date', 'DefaultProbability', 'HazardRate'});
DefProbHazardTable.Date = datetime(DefProbHazardTable.Date,'Locale','en_US','ConvertFrom','datenum');
DefProbHazardTable.Date.Format = 'MMM-dd-yyyy'
DefProbHazardTable=4×3 table
       Date        DefaultProbability    HazardRate
    ___________    __________________    __________

    Jun-01-2017         0.070486          0.081339 
    Jun-01-2019          0.16257          0.052162 
    Jun-01-2020          0.21731          0.067415 
    Jun-01-2022          0.38957           0.12429 

Предварительный просмотр выбранной связи для повторного расчета на основе кривой PD.

TestCase
TestCase=1×3 table
     Maturity      Price     Coupon
    ___________    ______    ______

    Jun-01-2019    109.02     0.08 

Для повторного расчета облигации сначала создайте денежные потоки и даты платежа.

[Payments, PaymentDates] = cfamounts(TestCase.Coupon, Settle, TestCase.Maturity);
AccInt=-Payments(1);
    % Truncate the payments as well as payment dates for calculation
    % PaymentDates(1) is the settle date, no need for following calculations
PaymentDates = PaymentDates(2:end)
PaymentDates = 1x6 datetime
Columns 1 through 5

   01-Dec-2016   01-Jun-2017   01-Dec-2017   01-Jun-2018   01-Dec-2018

Column 6

   01-Jun-2019

Payments = Payments(2:end)
Payments = 1×6

     4     4     4     4     4   104

Вычислите коэффициенты дисконтирования на дату платежа.

DF = zero2disc(interp1(RiskFreeRate.Date, RiskFreeRate.Rate, PaymentDates, 'linear', 'extrap'), PaymentDates, Settle, -1)
DF = 1×6

    0.9987    0.9959    0.9926    0.9887    0.9845    0.9799

Предположим, что сумма возмещения является фиксированной долей номинальной стоимости облигации. Номинальная стоимость облигации составляет 100и коэффициент восстановления устанавливается равным 40%, как предполагается в bondDefaultBootstrap.

Num = length(Payments);
RecoveryAmount = repmat(100*0.4, 1, Num)
RecoveryAmount = 1×6

    40    40    40    40    40    40

Вычислите вероятность дефолта на основе кривой по умолчанию.

DefaultProb1 = bondDefaultBootstrap(ZeroData, MarketData, Settle, 'ZeroCompounding', -1, 'ProbabilityDates', PaymentDates');
SurvivalProb = 1 - DefaultProb1(:,2)
SurvivalProb = 6×1

    0.9680
    0.9295
    0.9055
    0.8823
    0.8595
    0.8375

Рассчитайте цену чистой облигации на основе модели.

DirtyPrice = DF * (SurvivalProb.*Payments') + (RecoveryAmount.*DF) * (-diff([1;SurvivalProb]));
ModelPrice = DirtyPrice - AccInt
ModelPrice = 109.0200

Сравните переоцененную облигацию с рыночной квотой.

ResultTable = TestCase;
ResultTable.ModelPrice = ModelPrice;
ResultTable.Difference = ModelPrice - TestCase.Price
ResultTable=1×5 table
     Maturity      Price     Coupon    ModelPrice    Difference
    ___________    ______    ______    __________    __________

    Jun-01-2019    109.02     0.08       109.02      1.4211e-14

Входные аргументы

свернуть все

Данные нулевой скорости, указанные как Mоколо-2 матрица дат и нулевых ставок или IRDataCurve объект нулевых ставок. Для ввода массива даты должны быть введены как серийные номера, а ставка дисконтирования должна быть в десятичной форме.

Когда ZeroData является IRDataCurve объект, ZeroCompounding и ZeroBasis являются неявными в ZeroData и являются избыточными внутри этой функции. В этом случае укажите эти необязательные параметры при построении IRDataCurve объект перед использованием этого bondDefaultBootstrap функция.

Для получения дополнительной информации о IRDataCurve (Инструментарий финансовых инструментов) см. раздел Создание объекта IRDataCurve (Инструментарий финансовых инструментов).

Типы данных: double

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

Примечание

Предупреждение отображается, когда MarketData не отсортирован по времени в порядке возрастания.

Типы данных: double

Дата расчета, указанная как порядковый номер даты, вектор символов даты, объект datetime или объект строки даты. Settle должны быть более ранними или равными срокам погашения в MarketData.

Типы данных: double | char | datetime | string

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: [ProbabilityData,HazardData] = bondDefaultBootstrap(ZeroData,MarketData,Settle,'RecoveryRate',Recovery,'ZeroCompounding',-1)

Примечание

Любой дополнительный вход размера Nоколо-1 также приемлемо как массив размера 1около-Nили как единое значение, применимое ко всем контрактам.

Скорость восстановления, указанная как пара, разделенная запятыми, состоящая из 'RecoveryRate' и Nоколо-1 вектор скоростей восстановления, выраженный в виде десятичного числа от 0 через 1.

Типы данных: double

Даты вывода данных вероятности по умолчанию, указанные как пара, разделенная запятыми, состоящая из 'ProbabilityDates' и Pоколо-1 вектор, заданный как порядковые номера дат, объекты datetime, векторы символов даты или объекты строки даты.

Типы данных: double | char | datetime | string

Частота объединения нулевой кривой, определяемая как пара, разделенная запятыми, состоящая из 'ZeroCompounding' и Nоколо-1 вектор. Значения:

  • 1 - Годовое суммирование

  • 2 - Полугодичное компаундирование

  • 3 - Три раза в год

  • 4 - Квартальное суммирование

  • 6 - Компаундирование раз в два месяца

  • 12 - Ежемесячное суммирование

  • −1 - Непрерывное компаундирование

Типы данных: double

Основа нулевой кривой, определяемой как пара, разделенная запятыми, состоящая из 'ZeroBasis' и те же значения, перечисленные для Basis.

Типы данных: double

Метод восстановления, указанный как разделенная запятыми пара, состоящая из 'RecoveryMethod' и вектор символов или строку со значением, равным 'presentvalue' или 'facevalue'.

  • 'presentvalue' предполагает, что при дефолте облигация оценивается по заданной доле к гипотетической приведенной стоимости оставшихся денежных потоков, дисконтированных по безрисковой ставке.

  • 'facevalue' предполагает, что облигация извлекает заданную долю своей номинальной стоимости после восстановления.

Типы данных: char | string

Номинал или номинальная стоимость, указанная как пара, разделенная запятыми, состоящая из 'Face' и NINSTоколо-1 вектор связей.

Типы данных: double

Частота оплаты, указанная как разделенная запятыми пара, состоящая из 'Period' и Nоколо-1 вектор со значениями 0, 1, 2, 3, 4, 6, или 12.

Типы данных: double

Дневной отсчет прибора, определяемый как пара, разделенная запятыми, состоящая из 'Basis' и положительное целое число с использованием NINSTоколо-1 вектор. Значения:

  • 0 = факт/факт

  • 1 = 30/360 (SIA)

  • 2 = фактически/360

  • 3 = факт/365

  • 4 = 30/360 (PSA)

  • 5 = 30/360 (ISDA)

  • 6 = 30/360 (европейский)

  • 7 = факт/365 (японский)

  • 8 = факт/факт (ICMA)

  • 9 = факт/360 (ICMA)

  • 10 = факт/365 (ICMA)

  • 11 = 30/360E (ICMA)

  • 12 = факт/365 (ISDA)

  • 13 = BUS/252

Дополнительные сведения см. в разделе Базис.

Типы данных: double

Флаг правила конца месяца, заданный как пара, разделенная запятыми, состоящая из 'EndMonthRule' и неотрицательное целое число, 0 или 1, с использованием NINSTоколо-1 вектор. Это правило применяется только в том случае, если Maturity - дата окончания месяца, имеющая 30 или менее дней.

  • 0 = Игнорировать правило, означающее, что дата выплаты бонусного купона всегда совпадает с числовым днем месяца.

  • 1 = Установить правило, означающее, что дата выплаты бонусного купона всегда является последним фактическим днем месяца.

Типы данных: double

Дата выпуска облигаций, указанная как пара, разделенная запятыми, состоящая из 'IssueDate' и Nоколо-1 вектор, заданный как порядковые номера дат, объекты datetime, векторы символов даты или объекты строки даты.

Типы данных: double | char | datetime | string

Первая фактическая дата купона, указанная как пара, разделенная запятыми, состоящая из 'FirstCouponDate' и порядковый номер даты. FirstCouponDate используется, когда облигация имеет нерегулярный первый купонный период. Когда FirstCouponDate и LastCouponDate оба указаны, FirstCouponDate имеет приоритет при определении структуры купонных выплат.

Типы данных: double

Последняя фактическая дата купона, указанная как пара, разделенная запятыми, состоящая из 'LastCouponDate' и порядковый номер даты. LastCouponDate используется, когда облигация имеет нерегулярный последний купонный период. При отсутствии указанного FirstCouponDate, указанный LastCouponDate определяет структуру купона облигации. Купонная структура облигации усечена в LastCouponDateнезависимо от того, куда она попадает, и следует только дата денежного потока погашения облигации.

Типы данных: double

Прямая дата начала платежей, указанная как пара, разделенная запятыми, состоящая из 'StartDate' и порядковый номер даты. StartDate - когда действительно начинается облигация (дата, с которой рассматривается денежный поток облигации). Для форвардного запуска инструмента укажите эту дату в качестве будущей даты.

Типы данных: double

Соглашения о рабочих днях, указанные как пара, разделенная запятыми, состоящая из 'BusinessDayConvention' и вектор символов или строковый объект. Выбор соглашения о рабочих днях определяет, как обрабатываются дни, не связанные с бизнесом. Дни, не связанные с бизнесом, определяются как выходные дни, а также любая другая дата, когда предприятия не открыты (например, официальные праздники). Значения:

  • 'actual' - Дни, не связанные с бизнесом, фактически игнорируются. Предполагается, что денежные потоки, приходящиеся на нерабочие дни, распределяются на фактическую дату.

  • 'follow' - Денежные потоки, приходящиеся на некоммерческий день, предполагается распределить на следующий рабочий день.

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

  • 'previous' - Денежные потоки, приходящиеся на некоммерческий день, предполагается распределить в предыдущий рабочий день.

  • 'modifiedprevious' - Денежные потоки, приходящиеся на некоммерческий день, предполагается распределить в предыдущий рабочий день. Однако если предыдущий рабочий день находится в другом месяце, вместо него принимается следующий рабочий день.

Типы данных: char | cell | string

Выходные аргументы

свернуть все

Значения вероятности по умолчанию, возвращаемые как Pоколо-2 матрица с датами и соответствующими кумулятивными значениями вероятности по умолчанию. Даты совпадают с датами в MarketData, за исключением необязательного входного параметра ProbabilityDates обеспечивается.

Значения степени опасности, возвращенные как Nоколо-2 матрица с датами и соответствующими значениями степени опасности для модели вероятности выживания. Даты совпадают с датами в MarketData.

Примечание

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

Подробнее

свернуть все

Вероятность загрузки по умолчанию

Кривая вероятности дефолта может быть загружена из коллекции рыночных котировок облигаций.

Извлечение дискретных вероятностей дефолта за определенный период из данных рыночных облигаций представлено формулой

Цена = Диск (tN) × FV × Q (tN) +Cf×∑i=1NDisc (ti) × Q (ti) +∑ (i = 1) NDisc (ti) × R (ti) × (Q (ti − 1) − Q (ti))

где:

FV - Номинал

Q - Вероятность выживания

C - Купон

R - Сумма возмещения

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

Вероятность по умолчанию:

DefaultProbability = 1SurvivalProbability

Ссылки

[1] Джэрроу, Роберт А. и Стюарт Тернбулл. «Ценообразование деривативов на финансовые ценные бумаги, подверженные кредитному риску». Финансовый журнал. 50.1, 1995, стр 53–85.

[2] Берд, А., Машаль, Р. и Пейли Ван. «Определение, оценка и использование структур кредитных терминов». Исследовательский отчет, Lehman Brothers, 2004.

См. также

| (инструментарий финансовых инструментов)

Темы

Представлен в R2017a