Калибруйте Белое как оболочка дерево с помощью этажей
[Alpha,Sigma,OptimOut] = hwcalbyfloor(RateSpec,MarketStrikeMarketMaturity,MarketVolatility)
[Alpha,Sigma,OptimOut = hwcalbyfloor(RateSpec,MarketStrikeMarketMaturity,MarketVolatility,Strike,Settle,Maturity)
[Alpha,Sigma,OptimOut] = hwcalbyfloor(___,Name,Value)
[
калибрует Alpha
,Sigma
,OptimOut
] = hwcalbyfloor(RateSpec
,MarketStrike
MarketMaturity
,MarketVolatility
)Alpha
(возвращение к среднему уровню) и Sigma
(энергозависимость) с помощью данных о рынке пола и модели Hull-White с помощью целой поверхности пола.
Белые как оболочка калибровочные функции (hwcalbyfloor
и hwcalbycap
) поддерживают три модели: Черный (значение по умолчанию), Bachelier или Normal и Переключенный Черный цвет. Для получения дополнительной информации смотрите дополнительные аргументы для Shift
и Model
.
[
оценивает Alpha
,Sigma
,OptimOut
= hwcalbyfloor(RateSpec
,MarketStrike
MarketMaturity
,MarketVolatility
,Strike
,Settle
,Maturity
)Alpha
(возвращение к среднему уровню) и Sigma
(энергозависимость) с помощью данных о рынке пола и модели Hull-White, чтобы оценить пол в конкретной зрелости/энергозависимости с помощью дополнительных дополнительных входных параметров для Strike
, Settle
и Maturity
.
Strike
, Settle
и аргументы Maturity
заданы, чтобы калибровать к отдельному моменту на поверхности волатильности рынка. Если не использовано, калибровка выполняется через все инструменты рынка
Для примера калибровки использования модели Hull-White с Strike
Settle
и входные параметры Maturity
, видят, что Калибрующая Белая как оболочка Модель Использует Данные о Рынке.
[
добавляют дополнительные аргументы пары "имя-значение". Alpha
,Sigma
,OptimOut
] = hwcalbyfloor(___,Name,Value
)
Этот пример показывает, как использовать входные параметры hwcalbyfloor
для MarketStrike
, MarketMaturity
и MarketVolatility
, чтобы калибровать модель HW с помощью целой поверхности энергозависимости пола.
Данные о волатильности рынка пола, покрывающие две забастовки более чем 12 дат погашения.
Reset = 4; MarketStrike = [0.0590; 0.0790]; MarketMaturity = {'21-Mar-2008'; '21-Jun-2008'; '21-Sep-2008'; '21-Dec-2008'; '21-Mar-2009'; '21-Jun-2009'; '21-Sep-2009'; '21-Dec-2009'; '21-Mar-2010'; '21-Jun-2010'; '21-Sep-2010'; '21-Dec-2010'}; MarketMaturity = datenum(MarketMaturity); MarketVolaltility = [0.1533 0.1731 0.1727 0.1752 0.1809 0.1800 0.1805 0.1802... 0.1735 0.1757 0.1755 0.1755; 0.1526 0.1730 0.1726 0.1747 0.1808 0.1792 0.1797 0.1794... 0.1733 0.1751 0.1750 0.1745];
Постройте поверхность волатильности рынка.
[AllMaturities,AllStrikes] = meshgrid(MarketMaturity,MarketStrike); figure; surf(AllMaturities,AllStrikes,MarketVolaltility) datetick xlabel('Maturity') ylabel('Strike') zlabel('Volatility') title('Market Volatility Data')
Установите структуру термина процентной ставки и создайте RateSpec
.
Settle = '21-Jan-2008'; Compounding = 4; Basis = 0; Rates= [0.0627; 0.0657; 0.0691; 0.0717; 0.0739; 0.0755; 0.0765; 0.0772; 0.0779; 0.0783; 0.0786; 0.0789]; EndDates = {'21-Mar-2008';'21-Jun-2008';'21-Sep-2008';'21-Dec-2008';... '21-Mar-2009';'21-Jun-2009';'21-Sep-2009';'21-Dec-2009';.... '21-Mar-2010';'21-Jun-2010';'21-Sep-2010';'21-Dec-2010'}; RateSpec = intenvset('ValuationDate', Settle, 'StartDates', Settle,... 'EndDates', EndDates,'Rates', Rates, 'Compounding', Compounding,... 'Basis',Basis)
RateSpec = FinObj: 'RateSpec' Compounding: 4 Disc: [12x1 double] Rates: [12x1 double] EndTimes: [12x1 double] StartTimes: [12x1 double] EndDates: [12x1 double] StartDates: 733428 ValuationDate: 733428 Basis: 0 EndMonthRule: 1
Калибруйте модель Hull-White от данных о рынке.
o = optimoptions('lsqnonlin','TolFun',1e-5,'Display','off'); [Alpha, Sigma] = hwcalbyfloor(RateSpec, MarketStrike, MarketMaturity,... MarketVolaltility, 'Reset', Reset,'Basis', Basis, 'OptimOptions', o)
Warning: LSQNONLIN did not converge to an optimal solution. It exited with exitflag = 3. > In hwcalbycapfloor>optimizeOverCapSurface at 232 In hwcalbycapfloor at 79 In hwcalbyfloor at 81 Alpha = 0.0835 Sigma = 0.0145
Сравните с Черными ценами.
BlkPrices = floorbyblk(RateSpec,AllStrikes(:), Settle, AllMaturities(:),... MarketVolaltility(:),'Reset',Reset,'Basis',Basis)
BlkPrices = 0 0.2659 0.0010 0.5426 0.0021 0.6841 0.0042 0.7947 0.0081 0.8970 0.0128 0.9947 0.0217 1.1145 0.0340 1.2448 0.0402 1.3415 0.0610 1.4947 0.0827 1.6458 0.1071 1.7951
Setup Белое как оболочка дерево с помощью калиброванных параметров, альфы и сигмы.
VolDates = EndDates; VolCurve = Sigma*ones(numel(EndDates),1); AlphaDates = EndDates; AlphaCurve = Alpha*ones(numel(EndDates),1); HWVolSpec = hwvolspec(Settle, VolDates, VolCurve, AlphaDates, AlphaCurve); HWTimeSpec = hwtimespec(Settle, EndDates, Compounding); HWTree = hwtree(HWVolSpec, RateSpec, HWTimeSpec, 'Method', 'HW2000')
HWTree = FinObj: 'HWFwdTree' VolSpec: [1x1 struct] TimeSpec: [1x1 struct] RateSpec: [1x1 struct] tObs: [0 0.6593 1.6612 2.6593 3.6612 4.6593 5.6612 6.6593 7.6612 8.6593 9.6612 10.6593] dObs: [733428 733488 733580 733672 733763 733853 733945 734037 734128 734218 734310 734402] CFlowT: {1x12 cell} Probs: {1x11 cell} Connect: {1x11 cell} FwdTree: {1x12 cell}
Вычислите Белые как оболочка цены на основе калиброванного дерева.
HWPrices = floorbyhw(HWTree, AllStrikes(:), Settle, AllMaturities(:), Reset, Basis)
HWPrices = 0 0.2644 0.0067 0.5404 0.0101 0.6924 0.0169 0.7974 0.0236 0.8919 0.0320 0.9919 0.0460 1.1074 0.0649 1.2340 0.0829 1.3558 0.1096 1.4957 0.1406 1.6418 0.1724 1.7877
Постройте Черные цены против калиброванных Белых как оболочка древовидных цен.
figure; plot(AllMaturities(:), BlkPrices, 'or', AllMaturities(:), HWPrices, '*b'); datetick('x', 2) xlabel('Maturity'); ylabel('Price'); title('Black and Calibrated (HW) Prices'); legend('Black Price', 'Calibrated HW Tree Price','Location', 'NorthWest'); grid on
Этот пример показывает, как использовать hwcalbyfloor
, чтобы калибровать данные о рынке с моделью Normal (Bachelier) к цене floorlets. Используйте модель Normal (Bachelier), чтобы выполнить калибровки при работе с отрицательными процентными ставками, забастовками и нормальной подразумеваемой волатильностью.
Рассмотрите пол с этими параметрами:
Settle = 'Dec-30-2016'; Maturity = 'Dec-30-2019'; Strike = -0.004075; Reset = 2; Principal = 100; Basis = 0;
floorlets и данные о рынке для этого примера заданы как:
floorletDates = cfdates(Settle, Maturity, Reset, Basis); datestr(floorletDates')
ans = 6x11 char array
'30-Jun-2017'
'30-Dec-2017'
'30-Jun-2018'
'30-Dec-2018'
'30-Jun-2019'
'30-Dec-2019'
% Market data information MarketStrike = [-0.00595; 0]; MarketMat = {'30-Jun-2017';'30-Dec-2017';'30-Jun-2018'; '30-Dec-2018';'30-Jun-2019'; '30-Dec-2019'}; MarketVol = [0.184 0.2329 0.2398 0.2467 0.2906 0.3348; % First row in table corresponding to Strike 1 0.217 0.2707 0.2760 0.2814 0.3160 0.3508]; % Second row in table corresponding to Strike 2
Задайте RateSpec
.
Rates= [-0.003210;-0.003020;-0.00182;-0.001343;-0.001075]; ValuationDate = 'Dec-30-2016'; EndDates = {'30-Jun-2017';'Dec-30-2017';'30-Jun-2018';'Dec-30-2018';'Dec-30-2019'}; Compounding = 2; Basis = 0; RateSpec = intenvset('ValuationDate', ValuationDate, ... 'StartDates', ValuationDate, 'EndDates', EndDates, ... 'Rates', Rates, 'Compounding', Compounding, 'Basis', Basis);
Используйте hwcalbyfloor
, чтобы найти значения для параметров энергозависимости Alpha
и Sigma
с помощью модели Normal (Bachelier).
format short o=optimoptions('lsqnonlin','TolFun',100*eps); warning ('off','fininst:hwcalbycapfloor:NoConverge') [Alpha, Sigma, OptimOut] = hwcalbyfloor(RateSpec, MarketStrike, MarketMat,... MarketVol, Strike, Settle, Maturity, 'Reset', Reset, 'Principal', Principal,... 'Basis', Basis, 'OptimOptions', o, 'model', 'normal')
Local minimum possible. lsqnonlin stopped because the size of the current step is less than the value of the step size tolerance.
Alpha = 1.0000e-06
Sigma = 0.3410
OptimOut = struct with fields:
resnorm: 1.9233e-04
residual: [5x1 double]
exitflag: 2
output: [1x1 struct]
lambda: [1x1 struct]
jacobian: [5x2 double]
Поле OptimOut.residual
структуры OptimOut
является невязкой оптимизации. Это значение содержит различие между Нормальным (Bachelier) floorlets и вычисленными во время оптимизации. Используйте значение OptimOut.residual
, чтобы вычислить percentual различие (ошибка) по сравнению с Нормальным (Bachelier) floorlet цены, и затем решить, приемлема ли невязка. Существует почти всегда некоторая невязка, поэтому решите, приемлемо ли параметризовать рынок с одним значением Alpha
и Sigma
.
Оцените floorlets использование данных о рынке и модели Normal (Bachelier), чтобы получить ссылку floorlet значения. Чтобы определить эффективность оптимизации, вычислите ссылку floorlet значения с помощью Нормальной формулы (Bachelier) и данных о рынке. Отметьте, необходимо сначала интерполировать данные о рынке, чтобы получить floorlets для вычисления.
MarketMatNum = datenum(MarketMat); [Mats, Strikes] = meshgrid(MarketMatNum, MarketStrike); FlatVol = interp2(Mats, Strikes, MarketVol, datenum(Maturity), Strike, 'spline'); [FloorPrice, Floorlets] = floorbynormal(RateSpec, Strike, Settle, Maturity, FlatVol,... 'Reset', Reset, 'Basis', Basis, 'Principal', Principal); Floorlets = Floorlets(2:end)'
Floorlets = 5×1
4.7637
6.7180
8.1833
9.5825
10.6090
Сравните оптимизированные значения и Нормальные значения (Bachelier), и отобразите результаты графически. После вычисления ссылочных значений для floorlets сравните значения аналитически и графически определить, обеспечивают ли расчетные одно значения Alpha
и Sigma
соответствующее приближение.
OptimFloorlets = Floorlets+OptimOut.residual;
disp(' ');
disp(' Bachelier Calibrated Floorlets');
Bachelier Calibrated Floorlets
disp([Floorlets OptimFloorlets])
4.7637 4.7685 6.7180 6.7263 8.1833 8.1878 9.5825 9.5795 10.6090 10.6007
plot(MarketMatNum(2:end), Floorlets, 'or', MarketMatNum(2:end), OptimFloorlets, '*b'); datetick('x', 2) xlabel('Floorlet Maturity'); ylabel('Floorlet Price'); ylim ([0 16]); title('Bachelier and Calibrated Floorlets'); h = legend('Bachelier Floorlets', 'Calibrated Floorlets'); set(h, 'color', [0.9 0.9 0.9]); set(h, 'Location', 'SouthEast'); set(gcf, 'NumberTitle', 'off') grid on
MarketStrike
— Забастовка пола рынкаЗабастовка пола рынка, заданная как NINST
-by-1
вектор.
Типы данных: double
MarketMaturity
— Дата погашения пола рынкаДаты погашения пола рынка, заданные как NINST
-by-1
вектор.
Типы данных: double
MarketVolatility
— Рынок плоские колебанияРынок плоские колебания, заданные как NSTRIKES
-by-NMATS
матрица рынка плоские колебания, где NSTRIKES
является количеством забастовок caplet от MarketStrike
и NMATS
, является caplet датами погашения от MarketMaturity
.
Типы данных: double
Strike
— Уровень, на котором осуществлен пол(Необязательно) Уровень, на котором осуществлен пол, задал как десятичное скалярное значение.
Типы данных: single
Settle
— Расчетный день пола(Необязательно) Расчетный день пола, заданного как скалярный последовательный номер даты или символ даты.
Типы данных: single
| char
Maturity
— Дата погашения пола(дополнительная) Дата погашения пола, заданного как скалярный последовательный номер даты или вектор символов даты.
Типы данных: single
| char
Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми.
Имя (Name) — это имя аргумента, а значение (Value) — соответствующее значение.
Name
должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.
[Alpha,Sigma,OptimOut] = hwcalbyfloor(RateSpec,MarketStrike,MarketMaturity,MarketVolaltility,'Reset',2,'Principal',100000,'Basis',3,'OptimOptions',o)
сброс
Частота платежей в год1
(значение по умолчанию) | числовойЧастота платежей в год, заданный как пара, разделенная запятой, состоящая из 'Reset'
и скалярного числового значения.
Типы данных: double
'Principal'
— Отвлеченная основная сумма100
(значение по умолчанию) | неотрицательное целое числоОтвлеченная основная сумма, заданная как пара, разделенная запятой, состоящая из 'Principal'
и скалярного неотрицательного целого числа.
Типы данных: single
'Basis'
— Основание дневного количества, используемое при пересчитывании на год входного форвардного курса0
(фактическое/фактическое) (значение по умолчанию) | целые числа набора [0...13]
Основание дневного количества, используемое при пересчитывании на год входного форвардного курса, заданного как пара, разделенная запятой, состоящая из 'Basis'
и скалярного значения. Значения:
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
Для получения дополнительной информации смотрите основание.
Типы данных: single
'LB'
— Нижние границы[0;0]
(значение по умолчанию) | числовой векторНижние границы, заданные как пара, разделенная запятой, состоящая из 'LB'
и 2
-by-1
вектор нижних границ, заданных как [LBSigma; LBAlpha]
, используемый в функции алгоритма поиска. Для получения дополнительной информации смотрите lsqnonlin
.
Типы данных: double
'UB'
— Верхние границы[ ]
(развязанное) (значение по умолчанию) | числовой векторВерхние границы, заданные как пара, разделенная запятой, состоящая из 'UB'
и 2
-by-1
вектор верхних границ, заданных как [UBSigma; LBAlpha]
, используемый в функции алгоритма поиска. Для получения дополнительной информации смотрите lsqnonlin
.
Типы данных: double
'XO'
— Начальные значения[0.5;0.5]
(значение по умолчанию) | числовой векторНачальные значения, заданные как пара, разделенная запятой, состоящая из 'XO'
и 2
-by-1
вектор начальных значений, заданных как [Sigma0; Alpha0]
, используемый в функции алгоритма поиска. Для получения дополнительной информации смотрите lsqnonlin
.
Типы данных: double
'OptimOptions'
— Параметры оптимизацииПараметры оптимизации, заданные как пара, разделенная запятой, состоящая из 'OptimOptions'
и структуры, заданы при помощи optimoptions
.
Типы данных: struct
'Shift'
— Переключите десятичные числа на нижний регистр для переключенной модели Black 0
(никакой сдвиг) (значение по умолчанию) | положительное десятичное числоПереключите десятичные числа на нижний регистр для переключенной модели Black, заданной как пара, разделенная запятой, состоящая из 'Shift'
и скалярного положительного десятичного значения. Установите этот параметр на положительный сдвиг в десятичных числах, чтобы добавить положительный сдвиг на форвардный курс и Strike
, который эффективно устанавливает отрицательную нижнюю границу для форвардного курса и Strike
. Например, значение Shift
0.01
равно 1%-му сдвигу.
Типы данных: single
'Model'
— Индикатор для модели используется для калибровочной стандартной программыlognormal
(Черная модель) (значение по умолчанию) | значения является normal
и lognormal
Индикатор для модели, используемой для калибровочной стандартной программы, заданной как пара, разделенная запятой, состоящая из 'Model'
и скалярного вектора символов со значением normal
или lognormal
.
Типы данных: char
\alpha
Значение возвращения к среднему уровню, полученное из калибровки пола с помощью информации о рынкеЗначение возвращения к среднему уровню, полученное из калибровки пола с помощью информации о рынке, возвращенной как скалярное значение.
\sigma
Значение энергозависимости получено из калибровки пола с помощью информации о рынкеЗначение энергозависимости, полученное из калибровки пола с помощью информации о рынке, возвращенной как скаляр.
OptimOut
— Результаты оптимизацииРезультаты оптимизации, возвращенные как структура.
HullWhite1F
| floorbyblk
| hwcalbycap
| hwtree
| lsqnonlin
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.