Калибруйте Белое как оболочка дерево с помощью дна
[
калибрует Alpha
,Sigma
,OptimOut
] = hwcalbycap(RateSpec
,MarketStrike
MarketMaturity
,MarketVolatility
)Alpha
(возвращение к среднему уровню) и Sigma
(энергозависимость) с помощью данных о рынке дна и модели Hull-White с помощью целой поверхности дна.
Белые как оболочка калибровочные функции (hwcalbycap
и hwcalbyfloor
) поддержка три модели: Черный (значение по умолчанию), Bachelier или Normal и Переключенный Черный цвет. Для получения дополнительной информации смотрите дополнительные аргументы для Shift
и Model
.
[
оценивает Alpha
,Sigma
,OptimOut
= hwcalbycap(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
] = hwcalbycap(___,Name,Value
)
В этом примере показано, как использовать hwcalbycap
входные параметры для 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] = hwcalbycap(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 hwcalbycap at 81 Alpha = 0.0943 Sigma = 0.0146
Сравните с Черными ценами.
BlkPrices = capbyblk(RateSpec,AllStrikes(:), Settle, AllMaturities(:),... MarketVolaltility(:),'Reset',Reset,'Basis',Basis);
BlkPrices = 0.0604 0 0.2729 0.0006 0.6498 0.0412 1.1121 0.1426 1.6426 0.3131 2.1869 0.4998 2.7056 0.6894 3.2124 0.8815 3.7311 1.0686 4.2246 1.2790 4.7027 1.4810 5.1877 1.6919
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 = capbyhw(HWTree, AllStrikes(:), Settle, AllMaturities(:), Reset, Basis)
HWPrices = 0.0601 0 0.2788 0 0.6580 0.0518 1.1254 0.1485 1.6591 0.3123 2.2076 0.5022 2.7319 0.6883 3.2459 0.8774 3.7771 1.0900 4.2769 1.2875 4.7645 1.4845 5.2572 1.6921
Постройте Черные цены против калиброванных Белых как оболочка древовидных цен.
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
В этом примере показано, как использовать hwcalbycap
калибровать данные о рынке с моделью Normal (Bachelier) к цене caplets. Используйте модель Normal (Bachelier), чтобы выполнить калибровки при работе с отрицательными процентными ставками, забастовками и нормальной подразумеваемой волатильностью.
Рассмотрите дно этими параметрами:
Settle = 'Dec-30-2016'; Maturity = 'Dec-30-2019'; Strike = -0.001075; Reset = 2; Principal = 100; Basis = 0;
caplets и данные о рынке для этого примера заданы как:
capletDates = cfdates(Settle, Maturity, Reset, Basis); datestr(capletDates')
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.0013; 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.002210;-0.002020;-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);
Используйте hwcalbycap
найти значения для параметров энергозависимости Alpha
и Sigma
использование модели Normal (Bachelier).
format short o=optimoptions('lsqnonlin','TolFun',100*eps); warning ('off','fininst:hwcalbycapfloor:NoConverge') [Alpha, Sigma, OptimOut] = hwcalbycap(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.3384
OptimOut = struct with fields:
resnorm: 1.5181e-04
residual: [5x1 double]
exitflag: 2
output: [1x1 struct]
lambda: [1x1 struct]
jacobian: [5x2 double]
OptimOut.residual
поле OptimOut
структура является невязкой оптимизации. Это значение содержит различие между Нормальным (Bachelier) caplets и вычисленными во время оптимизации. Используйте OptimOut.residual
значение, чтобы вычислить percentual различие (ошибка) по сравнению с Нормальным (Bachelier) caplet цены, и затем решить, приемлема ли невязка. Существует почти всегда некоторая невязка, поэтому решите, приемлемо ли параметрировать рынок с одним значением Alpha
и Sigma
.
Оцените caplets использование данных о рынке и модели Normal (Bachelier), чтобы получить ссылку caplet значения. Чтобы определить эффективность оптимизации, вычислите ссылку caplet значения с помощью Нормальной формулы (Bachelier) и данных о рынке. Отметьте, необходимо сначала интерполировать данные о рынке, чтобы получить caplets для вычисления.
MarketMatNum = datenum(MarketMat); [Mats, Strikes] = meshgrid(MarketMatNum, MarketStrike); FlatVol = interp2(Mats, Strikes, MarketVol, datenum(Maturity), Strike, 'spline'); [CapPrice, Caplets] = capbynormal(RateSpec, Strike, Settle, Maturity, FlatVol,... 'Reset', Reset, 'Basis', Basis, 'Principal', Principal); Caplets = Caplets(2:end)'
Caplets = 5×1
4.7392
6.7799
8.2609
9.6136
10.6455
Сравните оптимизированные значения и Нормальные значения (Bachelier), и отобразите результаты графически. После вычисления ссылочных значений для caplets сравните значения аналитически и графически определить ли расчетные одно значения Alpha
и Sigma
обеспечьте соответствующее приближение.
OptimCaplets = Caplets+OptimOut.residual;
disp(' ');
disp(' Bachelier Calibrated Caplets');
Bachelier Calibrated Caplets
disp([Caplets OptimCaplets])
4.7392 4.7453 6.7799 6.7851 8.2609 8.2657 9.6136 9.6112 10.6455 10.6379
plot(MarketMatNum(2:end), Caplets, 'or', MarketMatNum(2:end), OptimCaplets, '*b'); datetick('x', 2) xlabel('Caplet Maturity'); ylabel('Caplet Price'); ylim ([0 16]); title('Bachelier and Calibrated Caplets'); h = legend('Bachelier Caplets', 'Calibrated Caplets'); set(h, 'color', [0.9 0.9 0.9]); set(h, 'Location', 'SouthEast'); set(gcf, 'NumberTitle', 'off') grid on
MarketStrike
— Забастовка рыночной капитализацииЗабастовка рыночной капитализации в виде NINST
- 1
вектор.
Типы данных: double
MarketMaturity
— Дата погашения рыночной капитализацииДаты погашения рыночной капитализации в виде NINST
- 1
вектор.
Типы данных: double
MarketVolatility
— Рынок плоские колебанияРынок плоские колебания в виде NSTRIKES
- NMATS
матрица рынка плоские колебания, где NSTRIKES
количество забастовок caplet от MarketStrike
и NMATS
caplet даты погашения от MarketMaturity
.
Типы данных: double
Strike
— Уровень, на котором осуществлено дно(Необязательно) Уровень, на котором дно осуществлено в виде десятичного скалярного значения.
Типы данных: single
Settle
— Расчетный день дна(Необязательно) Расчетный день дна в виде скалярного последовательного номера даты или символа даты.
Типы данных: single
| char
Maturity
— Дата погашения дна(дополнительная) Дата погашения дна в виде скалярного последовательного номера даты или вектора символов даты.
Типы данных: single
| char
Задайте дополнительные разделенные запятой пары Name,Value
аргументы. Name
имя аргумента и Value
соответствующее значение. Name
должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN
.
[Alpha,Sigma,OptimOut] = hwcalbycap(RateSpec,MarketStrike,MarketMaturity,MarketVolaltility,'Reset',2,'Principal',100000,'Basis',3,'OptimOptions',o)
'Reset'
— Частота платежей в год
(значение по умолчанию) | числовойЧастота платежей в год в виде разделенной запятой пары, состоящей из 'Reset'
и скалярное числовое значение.
Типы данных: double
'Principal'
— Отвлеченная основная сумма
(значение по умолчанию) | неотрицательное целое числоОтвлеченная основная сумма в виде разделенной запятой пары, состоящей из 'Principal'
и скалярное неотрицательное целое число.
Типы данных: single
'Basis'
— Основание дневного количества, используемое при пересчитывании на год входного форвардного курса
(фактическое/фактическое) (значение по умолчанию) | целые числа набора [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'
— Нижние границы
(значение по умолчанию) | числовой векторНижние границы в виде разделенной запятой пары, состоящей из 'LB'
и 2
- 1
вектор нижних границ, заданных как [LBSigma; LBAlpha]
, используемый в функции алгоритма поиска. Для получения дополнительной информации смотрите lsqnonlin
.
Типы данных: double
'UB'
— Верхние границы[ ]
(несвязанное) (значение по умолчанию) | числовой векторВерхние границы в виде разделенной запятой пары, состоящей из 'UB'
и 2
- 1
вектор верхних границ, заданных как [UBSigma; LBAlpha]
, используемый в функции алгоритма поиска. Для получения дополнительной информации смотрите lsqnonlin
.
Типы данных: double
'XO'
— Начальные значения
(значение по умолчанию) | числовой векторНачальные значения в виде разделенной запятой пары, состоящей из 'XO'
и 2
- 1
вектор начальных значений, заданных как [Sigma0; Alpha0]
, используемый в функции алгоритма поиска. Для получения дополнительной информации смотрите lsqnonlin
.
Типы данных: double
'OptimOptions'
— Параметры оптимизацииПараметры оптимизации в виде разделенной запятой пары, состоящей из 'OptimOptions'
и структура задана при помощи optimoptions
.
Типы данных: struct
'Shift'
— Переключите десятичные числа на нижний регистр для переключенной модели Black
(никакой сдвиг) (значение по умолчанию) | положительное десятичное числоПереключите десятичные числа на нижний регистр для переключенной модели Black в виде разделенной запятой пары, состоящей из 'Shift'
и скалярное положительное десятичное значение. Установите этот параметр на положительный сдвиг в десятичных числах, чтобы добавить положительный сдвиг на форвардный курс и Strike
, который эффективно устанавливает отрицательную нижнюю границу для форвардного курса и Strike
. Например, Shift
значение 0.01
равно 1%-му сдвигу.
Типы данных: single
'Model'
— Индикатор для модели используется в калибровочной стандартной программеlognormal
(Черная модель) (значение по умолчанию) | значениями является normal
и lognormal
Индикатор для модели, используемой в калибровочной стандартной программе в виде разделенной запятой пары, состоящей из 'Model'
и скалярный вектор символов со значением normal
или lognormal
.
Типы данных: char
Alpha
— Значение возвращения к среднему уровню, полученное из калибровки дна с помощью информации о рынкеЗначение возвращения к среднему уровню, полученное из калибровки дна с помощью информации о рынке, возвращенной как скалярное значение.
Sigma
— Значение энергозависимости получено из калибровки дна с помощью информации о рынкеЗначение энергозависимости, полученное из калибровки дна с помощью информации о рынке, возвращенной как скаляр.
OptimOut
— Результаты оптимизацииРезультаты оптимизации, возвращенные как структура.
HullWhite1F
| capbyblk
| hwcalbyfloor
| hwtree
| lsqnonlin
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.