Калибровка дерева Hull-White с помощью прописных букв
[ калибрует Alpha,Sigma,OptimOut] = hwcalbycap(RateSpec,MarketStrikeMarketMaturity,MarketVolatility)Alpha (средняя реверсия) и Sigma (волатильность) с использованием данных рынка прописной буквы и модели Халла-Уайта с использованием всей поверхности прописной буквы.
Калибровочные функции Халла-Уайта (hwcalbycap и hwcalbyfloor) поддерживают три модели: Black (по умолчанию), Bachelier или Normal и Shitted Black. Для получения дополнительной информации см. дополнительные аргументы для Shift и Model.
[ оценивает Alpha,Sigma,OptimOut = hwcalbycap(RateSpec,MarketStrikeMarketMaturity,MarketVolatility,Strike,Settle,Maturity)Alpha (средняя реверсия) и Sigma (волатильность) использование рыночных данных прописной буквы и модели Халла-Уайта для оценки прописной буквы с определенной зрелостью/волатильностью с помощью дополнительных необязательных входных параметров для Strike, Settle, и Maturity.
Strike, Settle, и Maturity аргументы заданы для калибровки к определенной точке на поверхности волатильности рынка. Если калибровка опущена, она выполняется по всем рыночным инструментам
Для примера калибровки с использованием модели Халла-Уайта с 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Калибровка модели Халла-Уайта по рыночным данным.
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.6919Setup дерева Hull-White с использованием калиброванных параметров, альфа и сигмы.
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}Вычислите цены Hull-White на основе калиброванного дерева.
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) до ценовых каплетов. Используйте модель Normal (Bachelier), чтобы выполнить калибровку при работе с отрицательными процентными ставками, ударами и нормальными подразумеваемыми волатильностями.
Рассмотрим прописную букву с этими параметрами:
Settle = 'Dec-30-2016'; Maturity = 'Dec-30-2019'; Strike = -0.001075; Reset = 2; Principal = 100; Basis = 0;
Кэплеты и рыночные данные для этого примера определяются как:
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]
The OptimOut.residual поле OptimOut структура является невязкой оптимизации. Это значение содержит различие между каплетами Normal (Bachelier) и caplets, рассчитанными во время оптимизации. Используйте OptimOut.residual значение, чтобы вычислить процентное различие (ошибку) по сравнению с ценами на каплеты Normal (Bachelier), а затем решить, является ли невязка приемлемым. Есть почти всегда какой-то остаточный, поэтому решите, приемлемо ли параметризовать рынок с одним значением Alpha и Sigma.
Оцените caplets с помощью рыночных данных и модели Normal (Bachelier), чтобы получить ссылочные значения caplet. Чтобы определить эффективность оптимизации, вычислите эталонные каплетные значения с помощью формулы Normal (Bachelier) и рыночных данных. Обратите внимание, что сначала необходимо интерполировать рыночные данные, чтобы получить каплеты для вычисления.
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
Сравните оптимизированные значения и значения Normal (Bachelier) и отобразите результаты графически. После вычисления ссылочных значений для каплетов сравните значения аналитически и графически, чтобы определить, вычислены ли отдельные значения 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-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 - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.
[Alpha,Sigma,OptimOut] = hwcalbycap(RateSpec,MarketStrike,MarketMaturity,MarketVolaltility,'Reset',2,'Principal',100000,'Basis',3,'OptimOptions',o)'Reset' - Периодичность платежей в год1 (по умолчанию) | числоЧастота платежей в год, заданная как разделенная разделенными запятой парами, состоящая из 'Reset' и скалярное числовое значение.
Типы данных: double
'Principal' - Условная основная сумма100
(по умолчанию) | неотрицательное целое числоУсловная основная сумма, заданная как разделенная разделенными запятой парами, состоящая из 'Principal' и скаляр неотрицательное целое число.
Типы данных: single
'Basis' - Базис отсчета дней, используемый при аннуализации входной форвардной скорости0 (фактический/фактический) (по умолчанию) | целыми числами набора [0...13]Базис отсчета дней, используемый при аннуализации входной скорости передачи, заданный как разделенная разделенными запятой парами, состоящая из 'Basis' и скалярное значение. Значения:
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
Для получения дополнительной информации см. раздел Базиса.
Типы данных: single
'LB' - Нижние границы[0;0] (по умолчанию) | числовой векторНижние границы, заданные как разделенная разделенными запятой парами, состоящая из 'LB' и a 2-by- 1 вектор нижних границ, заданный как [LBSigma; LBAlpha], используемый в функции алгоритма поиска. Для получения дополнительной информации см. lsqnonlin.
Типы данных: double
'UB' - Верхние границы[ ] (unbound) (по умолчанию) | числовой векторВерхние границы, заданные как разделенная разделенными запятой парами, состоящая из 'UB' и a 2-by- 1 вектор верхних границ, заданный как [UBSigma; LBAlpha], используемый в функции алгоритма поиска. Для получения дополнительной информации см. lsqnonlin.
Типы данных: double
'XO' - Начальные значения[0.5;0.5] (по умолчанию) | числовой векторНачальные значения, заданные как разделенная разделенными запятой парами, состоящая из 'XO' и a 2-by- 1 вектор начальных значений, заданный как [Sigma0; Alpha0], используемый в функции алгоритма поиска. Для получения дополнительной информации см. lsqnonlin.
Типы данных: double
'OptimOptions' - Параметры оптимизацииПараметры оптимизации, заданные как разделенная разделенными запятой парами, состоящая из 'OptimOptions' и структуру, заданную при помощи optimoptions.
Типы данных: struct
'Shift' - Сдвиг десятичных чисел для сдвинутой модели Black 0 (без сдвига) (по умолчанию) | положительным десятичным числомСдвиг десятичных чисел для сдвинутой модели Black, заданный как разделенная разделенными запятой парами, состоящая из 'Shift' и скаляр положительное десятичное значение. Установите этот параметр положительный сдвиг десятичных чисел, чтобы добавить положительный сдвиг к прямой скорости и Strike, который эффективно устанавливает отрицательную нижнюю границу для прямой скорости и Strike. Для примера, a Shift значение 0.01 равен 1% сдвигу.
Типы данных: single
'Model' - Индикатор для модели, используемой для стандартной программы калибровкиlognormal (Черная модель) (по умолчанию) | значения normal и lognormalИндикатор для модели, используемой для стандартной программы калибровки, задается как разделенная разделенными запятой парами, состоящая из 'Model' и скалярный вектор символов со значением normal или lognormal.
Типы данных: char
Alpha - Среднее значение реверсии, полученное в результате калибровки прописной буквы с использованием рыночной информацииСреднее значение реверсии, полученное при калибровке прописной буквы с использованием рыночной информации, возвращенной в виде скалярного значения.
Sigma - Значение волатильности, полученное в результате калибровки прописной буквы с использованием рыночной информацииЗначение волатильности, полученное при калибровке прописной буквы с использованием рыночной информации, возвращенной в виде скаляра.
OptimOut - Результаты оптимизацииРезультаты оптимизации, возвращенные как структура.
capbyblk | HullWhite1F | hwcalbyfloor | hwtree | lsqnonlin
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.