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

    7.3723    0.0000
    7.3743    0.0000
    7.3819    0.0000
    7.3823    0.0000
    7.3983    0.0000

HazardData = 5×2

    7.3723    0.0000
    7.3743    0.0000
    7.3819    0.0000
    7.3823    0.0000
    7.3983    0.0000

В 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

    7.3685    0.0000
    7.3758    0.0000
    7.3794    0.0000
    7.3867    0.0000

hazard1 = 4×2

    7.3685    0.0000
    7.3758    0.0000
    7.3794    0.0000
    7.3867    0.0000

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 Объект (Financial Instruments Toolbox), смотрите Создание Объекта IRDataCurve (Financial Instruments Toolbox).

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

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

Примечание

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

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

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

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

Аргументы name-value

Задайте дополнительные разделенные запятой пары 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 (СИА)

  •  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 = ШИНА/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.

Примечание

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

Больше о

свернуть все

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

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

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

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= 1 SurvivalProbability

Ссылки

[1] Jarrow, Роберт А. и Стюарт Тернбулл. "Оценивая Производные на Financial Securities Согласно Кредитному риску". Журнал Финансов. 50.1, 1995, стр 53–85.

[2] Berd, A., Mashal, R. и Пейли Ван. “Задавая, Оценка и Используя Структуры Условия кредита”. Отчет по результатам исследования, Lehman Brothers, 2004.

Смотрите также

(Financial Instruments Toolbox) |

Темы

Введенный в R2017a
Для просмотра документации необходимо авторизоваться на сайте