Загрузите кривую вероятности по умолчанию от цен облигаций
[
загружает кривую вероятности по умолчанию от цен облигаций.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
format
Повторно оцените одну из связей из списка связей на основе кривой вероятности по умолчанию. Ожидаемый результат этой переоценки является идеальной парой с рыночной котировкой.
Используйте следующие Казначейские данные Отдела США Казначейства.
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 array
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 (Financial Instruments Toolbox).
Типы данных: 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'
— Скорость восстановления
(значение по умолчанию) | десятичное числоСкорость восстановления, заданная как разделенная запятой пара, состоящая из 'RecoveryRate'
и N
- 1
вектор скоростей восстановления, выраженных как десятичное число от 0
через 1
.
Типы данных: double
'ProbabilityDates'
— Даты выхода данных о вероятности по умолчаниюMarketData
(значение по умолчанию) | последовательный номер даты | вектор символов даты | datetime возражает | объект строки датыДаты выхода данных о вероятности по умолчанию, заданных как разделенная запятой пара, состоящая из 'ProbabilityDates'
и P
- 1
вектор, данный как последовательные числа даты, объекты datetime, векторы символов даты или объекты строки даты.
Типы данных: double |
char
| datetime
| string
'ZeroCompounding'
— Соединение частоты кривой нулевой ширины
(полугодовое) (значение по умолчанию) | целое число со значением 1
,2
,3
,4
,6
,12
, или –1
Соединение частоты кривой нулевой ширины, заданной как разделенная запятой пара, состоящая из 'ZeroCompounding'
и N
- 1
вектор. Значения:
1 — Ежегодное соединение
2 — Полугодовое соединение
3 — Соединение три раза в год
4 — Ежеквартально соединение
6 — Два раза в месяц соединение
12 — Ежемесячно соединение
−1 — Непрерывное соединение
Типы данных: double
'ZeroBasis'
— Основание кривой нулевой ширины
(фактическое/фактическое) (значение по умолчанию) | целое число со значением 0
к 13
Основание кривой нулевой ширины, заданной как разделенная запятой пара, состоящая из 'ZeroBasis'
и те же значения перечислены для Basis
.
Типы данных: double
'RecoveryMethod'
— Метод восстановления'facevalue'
(значение по умолчанию) | вектор символов со значением 'presentvalue'
или 'facevalue'
| представьте объект в виде строки со значением 'presentvalue'
или 'facevalue'
Метод восстановления, заданный как разделенная запятой пара, состоящая из 'RecoveryMethod'
и вектор символов или строка со значением 'presentvalue'
или 'facevalue'
.
'presentvalue'
принимает, что на значение по умолчанию, связь оценена в данную часть к гипотетической приведенной стоимости ее остающихся потоков наличности, обесцененных на безрисковом уровне.
'facevalue'
принимает, что связь восстанавливает данную часть своей номинальной стоимости после восстановления.
Типы данных: char |
string
'Face'
— Поверхность или номинальная стоимость
(значение по умолчанию) | числовойПоверхность или номинальная стоимость, заданная как разделенная запятой пара, состоящая из 'Face'
и NINST
- 1
вектор связей.
Типы данных: double
'Period'
— Платежная частота
(значение по умолчанию) | числовой со значениями 0
, 1
, 2
, 3
, 4
, 6
или 12
Платежная частота, заданная как разделенная запятой пара, состоящая из 'Period'
и N
- 1
вектор со значениями 0
, 1, 2
, 3
, 4
, 6
, или
12
.
Типы данных: double
'Basis'
— Основание дневного количества инструмента
(фактическое/фактическое) (значение по умолчанию) | целые числа набора [0...13]
| вектор целых чисел набора [0...13]
Основание дневного количества инструмента, заданного как разделенная запятой пара, состоящая из '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
Флаг правила конца месяца, заданный как разделенная запятой пара, состоящая из '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'
(значение по умолчанию) | вектор символов или строка возражает с values'actual'
, 'follow'
, 'modifiedfollow'
, 'previous'
или 'modifiedprevious'
Соглашения рабочего дня, заданные как разделенная запятой пара, состоящая из 'BusinessDayConvention'
и вектор символов или объект строки. Выбор для соглашения рабочего дня определяет, как обработаны нерабочие дни. Нерабочие дни заданы как выходные плюс любая другая дата, что компании не открыты (например, установленные законом праздники). Значения:
'actual'
— Нерабочие дни эффективно проигнорированы. Потоки наличности, которые падают в нерабочие дни, приняты, чтобы быть распределенными в фактическую дату.
'follow'
— Потоки наличности, которые падают в нерабочий день, приняты, чтобы быть распределенными в следующий рабочий день.
'modifiedfollow'
— Потоки наличности, которые падают в нерабочий день, приняты, чтобы быть распределенными в следующий рабочий день. Однако, если следующий рабочий день находится в различном месяце, предыдущий рабочий день принят вместо этого.
'previous'
— Потоки наличности, которые падают в нерабочий день, приняты, чтобы быть распределенными в предыдущий рабочий день.
'modifiedprevious'
— Потоки наличности, которые падают в нерабочий день, приняты, чтобы быть распределенными в предыдущий рабочий день. Однако, если предыдущий рабочий день находится в различном месяце, следующий рабочий день принят вместо этого.
Типы данных: char |
cell
| string
ProbabilityData
— Значения вероятности по умолчаниюЗначения вероятности по умолчанию, возвращенные как P
- 2
матрица с датами и соответствующими совокупными значениями вероятности по умолчанию. Даты совпадают с теми в MarketData
, если дополнительный входной параметр ProbabilityDates
обеспечивается.
HazardData
— Значения показателя рискаЗначения показателя риска, возвращенные как N
- 2
матрица с датами и соответствующими значениями показателя риска для вероятностной модели выживания. Даты совпадают с теми в MarketData
.
Предупреждение выведено, когда немонотонные вероятности по умолчанию (то есть, отрицательные показатели риска) найдены.
[1] Jarrow, Роберт А. и Стюарт Тернбулл. "Оценивая Производные на Financial Securities Согласно Кредитному риску". Журнал Финансов. 50.1, 1995, стр 53–85.
[2] Berd, A., Mashal, R. и Пейли Ван. “Задавая, Оценка и Используя Структуры Условия кредита”. Отчет по результатам исследования, Lehman Brothers, 2004.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.