Калибровка дерева Hull-White с помощью прописных букв
[
калибрует Alpha
,Sigma
,OptimOut
] = hwcalbycap(RateSpec
,MarketStrike
MarketMaturity
,MarketVolatility
)Alpha
(средняя реверсия) и Sigma
(волатильность) с использованием данных рынка прописной буквы и модели Халла-Уайта с использованием всей поверхности прописной буквы.
Калибровочные функции Халла-Уайта (hwcalbycap
и hwcalbyfloor
) поддерживают три модели: Black (по умолчанию), Bachelier или Normal и Shitted Black. Для получения дополнительной информации см. дополнительные аргументы для Shift
и Model
.
[
оценивает Alpha
,Sigma
,OptimOut
= hwcalbycap(RateSpec
,MarketStrike
MarketMaturity
,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.6919
Setup дерева 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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.