Кривая вероятности дефолта начальной загрузки из цен облигаций
[ загрузит кривую вероятности дефолта из цен облигаций.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
ZeroData - Данные нулевой скоростиIRDataCurve объектДанные нулевой скорости, указанные как Mоколо-2 матрица дат и нулевых ставок или IRDataCurve объект нулевых ставок. Для ввода массива даты должны быть введены как серийные номера, а ставка дисконтирования должна быть в десятичной форме.
Когда ZeroData является IRDataCurve объект, ZeroCompounding и ZeroBasis являются неявными в ZeroData и являются избыточными внутри этой функции. В этом случае укажите эти необязательные параметры при построении IRDataCurve объект перед использованием этого bondDefaultBootstrap функция.
Для получения дополнительной информации о IRDataCurve (Инструментарий финансовых инструментов) см. раздел Создание объекта IRDataCurve (Инструментарий финансовых инструментов).
Типы данных: double
MarketData - Данные рынка облигацийДанные рынка облигаций, указанные как Nоколо-3 матрица сроков погашения, рыночных цен и ставок купонов по облигациям. Даты должны быть введены как серийные номера, рыночные цены должны быть числовыми значениями, а купонная ставка должна быть в десятичной форме.
Примечание
Предупреждение отображается, когда MarketData не отсортирован по времени в порядке возрастания.
Типы данных: double
Settle - Дата расчетаДата расчета, указанная как порядковый номер даты, вектор символов даты, объект 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' - Коэффициент восстановления0.4 (по умолчанию) | десятичное числоСкорость восстановления, указанная как пара, разделенная запятыми, состоящая из 'RecoveryRate' и Nоколо-1 вектор скоростей восстановления, выраженный в виде десятичного числа от 0 через 1.
Типы данных: double
'ProbabilityDates' - Сроки вывода данных вероятности по умолчаниюMarketData (по умолчанию) | серийный номер даты | вектор символов даты | объект datetime | объект строки датыДаты вывода данных вероятности по умолчанию, указанные как пара, разделенная запятыми, состоящая из 'ProbabilityDates' и Pоколо-1 вектор, заданный как порядковые номера дат, объекты datetime, векторы символов даты или объекты строки даты.
Типы данных: double | char | datetime | string
'ZeroCompounding' - Частота объединения нулевой кривой2 (полугодовой) (по умолчанию) | целое число со значением 1,2,3,4,6,12, или –1Частота объединения нулевой кривой, определяемая как пара, разделенная запятыми, состоящая из 'ZeroCompounding' и Nоколо-1 вектор. Значения:
1 - Годовое суммирование
2 - Полугодичное компаундирование
3 - Три раза в год
4 - Квартальное суммирование
6 - Компаундирование раз в два месяца
12 - Ежемесячное суммирование
−1 - Непрерывное компаундирование
Типы данных: double
'ZeroBasis' - Основа нулевой кривой0 (факт/факт) (по умолчанию) | целое число со значением 0 кому 13Основа нулевой кривой, определяемой как пара, разделенная запятыми, состоящая из 'ZeroBasis' и те же значения, перечисленные для Basis.
Типы данных: double
'RecoveryMethod' - Метод восстановления'facevalue' (по умолчанию) | символьный вектор со значением 'presentvalue' или 'facevalue' | строковый объект со значением 'presentvalue' или 'facevalue'Метод восстановления, указанный как разделенная запятыми пара, состоящая из 'RecoveryMethod' и вектор символов или строку со значением, равным 'presentvalue' или 'facevalue'.
'presentvalue' предполагает, что при дефолте облигация оценивается по заданной доле к гипотетической приведенной стоимости оставшихся денежных потоков, дисконтированных по безрисковой ставке.
'facevalue' предполагает, что облигация извлекает заданную долю своей номинальной стоимости после восстановления.
Типы данных: char | string
'Face' - Номинальная или номинальная стоимость100 (по умолчанию) | числовыеНоминал или номинальная стоимость, указанная как пара, разделенная запятыми, состоящая из 'Face' и NINSTоколо-1 вектор связей.
Типы данных: double
'Period' - Периодичность платежей2 (по умолчанию) | числовые со значениями 0, 1, 2, 3, 4, 6 или 12Частота оплаты, указанная как разделенная запятыми пара, состоящая из 'Period' и Nоколо-1 вектор со значениями 0, 1, 2, 3, 4, 6, или 12.
Типы данных: double
'Basis' - Дневная основа прибора0 (факт/факт) (по умолчанию) | целые числа множества [0...13] | вектор целых чисел множества [0...13]Дневной отсчет прибора, определяемый как пара, разделенная запятыми, состоящая из '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' - Флаг правила на конец месяца1 (в действии) (по умолчанию) | неотрицательное целое число 0 или 1Флаг правила конца месяца, заданный как пара, разделенная запятыми, состоящая из 'EndMonthRule' и неотрицательное целое число, 0 или 1, с использованием NINSTоколо-1 вектор. Это правило применяется только в том случае, если Maturity - дата окончания месяца, имеющая 30 или менее дней.
0 = Игнорировать правило, означающее, что дата выплаты бонусного купона всегда совпадает с числовым днем месяца.
1 = Установить правило, означающее, что дата выплаты бонусного купона всегда является последним фактическим днем месяца.
Типы данных: double
'IssueDate' - Дата выпуска облигацийIssueDate не указан, даты оплаты денежных потоков определены из других входных данных (по умолчанию) | серийный номер даты | вектор символов даты | объект datetime | объект строки датыДата выпуска облигаций, указанная как пара, разделенная запятыми, состоящая из 'IssueDate' и Nоколо-1 вектор, заданный как порядковые номера дат, объекты datetime, векторы символов даты или объекты строки даты.
Типы данных: double | char | datetime | string
'FirstCouponDate' - Дата первого фактического купонаFirstCouponDate, даты оплаты денежного потока определяются из других входных данных (по умолчанию) | серийный номер датыПервая фактическая дата купона, указанная как пара, разделенная запятыми, состоящая из 'FirstCouponDate' и порядковый номер даты. FirstCouponDate используется, когда облигация имеет нерегулярный первый купонный период. Когда FirstCouponDate и LastCouponDate оба указаны, FirstCouponDate имеет приоритет при определении структуры купонных выплат.
Типы данных: double
'LastCouponDate' - Последняя фактическая дата купонаLastCouponDate, даты оплаты денежного потока определяются из других входных данных (по умолчанию) | скаляр для серийного номера датыПоследняя фактическая дата купона, указанная как пара, разделенная запятыми, состоящая из 'LastCouponDate' и порядковый номер даты. LastCouponDate используется, когда облигация имеет нерегулярный последний купонный период. При отсутствии указанного FirstCouponDate, указанный LastCouponDate определяет структуру купона облигации. Купонная структура облигации усечена в LastCouponDateнезависимо от того, куда она попадает, и следует только дата денежного потока погашения облигации.
Типы данных: double
'StartDate' - Форвардная дата начала платежейStartDate, дата начала действия: Settle дата (по умолчанию) | серийный номерПрямая дата начала платежей, указанная как пара, разделенная запятыми, состоящая из 'StartDate' и порядковый номер даты. StartDate - когда действительно начинается облигация (дата, с которой рассматривается денежный поток облигации). Для форвардного запуска инструмента укажите эту дату в качестве будущей даты.
Типы данных: double
'BusinessDayConvention' - Соглашения по рабочим дням'actual'
(по умолчанию) | символьный вектор или строковый объект со значениями'actual', 'follow', 'modifiedfollow', 'previous'или 'modifiedprevious'Соглашения о рабочих днях, указанные как пара, разделенная запятыми, состоящая из 'BusinessDayConvention' и вектор символов или строковый объект. Выбор соглашения о рабочих днях определяет, как обрабатываются дни, не связанные с бизнесом. Дни, не связанные с бизнесом, определяются как выходные дни, а также любая другая дата, когда предприятия не открыты (например, официальные праздники). Значения:
'actual' - Дни, не связанные с бизнесом, фактически игнорируются. Предполагается, что денежные потоки, приходящиеся на нерабочие дни, распределяются на фактическую дату.
'follow' - Денежные потоки, приходящиеся на некоммерческий день, предполагается распределить на следующий рабочий день.
'modifiedfollow' - Денежные потоки, приходящиеся на нерабочий день, предполагается распределить на следующий рабочий день. Однако если следующий рабочий день находится в другом месяце, вместо него используется предыдущий рабочий день.
'previous' - Денежные потоки, приходящиеся на некоммерческий день, предполагается распределить в предыдущий рабочий день.
'modifiedprevious' - Денежные потоки, приходящиеся на некоммерческий день, предполагается распределить в предыдущий рабочий день. Однако если предыдущий рабочий день находится в другом месяце, вместо него принимается следующий рабочий день.
Типы данных: char | cell | string
ProbabilityData - Значения вероятности по умолчаниюЗначения вероятности по умолчанию, возвращаемые как Pоколо-2 матрица с датами и соответствующими кумулятивными значениями вероятности по умолчанию. Даты совпадают с датами в MarketData, за исключением необязательного входного параметра ProbabilityDates обеспечивается.
HazardData - Значения степени опасностиЗначения степени опасности, возвращенные как Nоколо-2 матрица с датами и соответствующими значениями степени опасности для модели вероятности выживания. Даты совпадают с датами в MarketData.
Примечание
Предупреждение отображается при обнаружении немонотонных вероятностей по умолчанию (т.е. отрицательных коэффициентов опасности).
Кривая вероятности дефолта может быть загружена из коллекции рыночных котировок облигаций.
Извлечение дискретных вероятностей дефолта за определенный период из данных рыночных облигаций представлено формулой
R (ti) × (Q (ti − 1) − Q (ti))
где:
FV - Номинал
Q - Вероятность выживания
C - Купон
R - Сумма возмещения
f - Периодичность оплаты (например, 2 для полугодовых купонных облигаций)
Вероятность по умолчанию:
DefaultProbability = 1 – SurvivalProbability
[1] Джэрроу, Роберт А. и Стюарт Тернбулл. «Ценообразование деривативов на финансовые ценные бумаги, подверженные кредитному риску». Финансовый журнал. 50.1, 1995, стр 53–85.
[2] Берд, А., Машаль, Р. и Пейли Ван. «Определение, оценка и использование структур кредитных терминов». Исследовательский отчет, Lehman Brothers, 2004.
cdsbootstrap | IRDataCurve (инструментарий финансовых инструментов)
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.