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