bondDefaultBootstrap

Bootstrap кривая вероятностей по умолчанию из цен облигаций

Описание

пример

[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-by- 2 матрица дат и нулевых ставок или IRDataCurve объект нулевых ставок. Для входа массива даты должны быть введены как серийные номера дат, а ставка дисконтирования должна быть десятичной.

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

Для получения дополнительной информации о IRDataCurve (Financial Instruments Toolbox), см. Создание объекта IRDataCurve (Financial Instruments Toolbox).

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

Данные рынка облигаций, указанные как N-by- 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-by- 1 также приемлемо как массив размера 1-by- Nили как одно значение, применимую ко всем договорам.

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

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

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

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

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

  • 1 - Ежегодное компаундирование

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

  • 3 - Смешивание три раза в год

  • 4 - ежеквартальное компаундирование

  • 6 - Двухмесячное компаундирование

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

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

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

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

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

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

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

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

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

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

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

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

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

Дневной базис инструмента, заданный как разделенная запятыми пара, состоящая из 'Basis' и положительное целое число с использованием NINST-by- 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-by- 1 вектор. Это правило применяется только тогда, когда Maturity - дата окончания месяца для месяца, имеющего 30 или менее дней.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

свернуть все

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

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

Примечание

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

Подробнее о

свернуть все

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

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

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

Price=Disc(tN)×FV×Q(tN)+Cf×i=1NDisc(ti)×Q(ti)+(i=1)NDisc(ti)×R(ti)×(Q(ti1)Q(ti))

где:

FV - Лицевое значение

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

C - Купон

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

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

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

DefaultProbability = 1SurvivalProbability

Ссылки

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

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

См. также

| (Financial Instruments Toolbox)

Темы

Введенный в R2017a