Ценообразование процентных производных ценных бумаг основано на моделях, которые описывают базовый процесс. Эти модели процентных ставок зависят от одного или нескольких параметров, которые необходимо определить путем сопоставления прогнозов модели с существующими данными, доступными на рынке. В модели Халл-Уайт есть два параметра, связанных с процессом коротких ставок: средняя реверсия и волатильность. Калибровка используется для определения этих параметров, так что модель может воспроизводить, как можно ближе, цены шапок или этажей, наблюдаемые на рынке. Процедуры калибровки находят параметры, которые минимизируют разницу между прогнозами цен модели и рыночными ценами на предельные значения и этажи.
Для модели Халла-Уайта минимизация является двухмерной по отношению к средней реверсии (α) и волатильности (λ). То есть калибровка модели Халл-Уайт сводит к минимуму разницу между прогнозируемыми ценами модели и наблюдаемыми рыночными ценами соответствующих каплетов или флорлетов.
Используйте рыночные данные для определения подразумеваемой волатильности (λ) и средних коэффициентов реверсии (α), необходимых для построения дерева Халл-Уайт для цены инструмента. Идеальным вариантом является использование летучести крышек или полов, используемых для расчета Alpha (α) и Sigma (σ). Скорее всего, это не так, поэтому рыночные данные должны быть интерполированы для получения требуемых значений.
Рассмотрим колпачок со следующими параметрами:
Settle = ' Jan-21-2008'; Maturity = 'Mar-21-2011'; Strike = 0.0690; Reset = 4; Principal = 1000; Basis = 0;
Caplets для этого примера попадет в:
capletDates = cfdates(Settle, Maturity, Reset, Basis); datestr(capletDates')
ans = 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 21-Mar-2011
В лучшем случае, посмотрите на волатильность рынка для caplets с Strike = 0.0690и сроки погашения в каждую указанную дату сброса, но вероятность нахождения этих точных инструментов низкая. Как следствие, используйте данные, доступные на рынке, и выполните интерполяцию для поиска соответствующих значений для кэплетов.
На основе рыночных данных имеется информация о предельном значении для различных дат и забастовок. Предположим, что вместо данных для Strike = 0.0690, у вас есть данные для Strike1 = 0.0590 и Strike2 = 0.0790.
| Зрелость | Strike1 = 0.0590 | Strike2 = 0.0790 |
|---|---|---|
| 21-Mar-2008 | 0.1533 | 0. 1526 |
| 21-Jun-2008 | 0.1731 | 0. 1730 |
| 21-Sep-2008 | 0. 1727 | 0. 1726 |
| 21-Dec-2008 | 0. 1752 | 0. 1747 |
| 21-Mar-2009 | 0. 1809 | 0. 1808 |
| 21-Jun-2009 | 0. 1809 | 0. 1792 |
| 21-Sep-2009 | 0. 1805 | 0. 1797 |
| 21-Dec-2009 | 0. 1802 | 0. 1794 |
| 21-Mar-2010 | 0. 1802 | 0. 1733 |
| 21-Jun-2010 | 0. 1757 | 0. 1751 |
| 21-Sep-2010 | 0. 1755 | 0. 1750 |
| 21-Dec-2010 | 0. 1755 | 0. 1745 |
| 21-Mar-2011 | 0. 1726 | 0. 1719 |
Характер этих данных соответствует матричной номенклатуре, которая идеально подходит для MATLAB ® .hwcalbycap требует, чтобы даты, забастовки и фактическая волатильность были разделены на три переменные: MarketStrike, MarketMat, и MarketVol.
MarketStrike = [0.0590; 0.0790];
MarketMat = {'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';
'21-Mar-2011'};
MarketVol = [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.1726; % First row in table corresponding to Strike1
0.1526 0.1730 0.1726 0.1747 0.1808 0.1792 0.1797 0.1794 0.1733 0.1751 ...
0.1750 0.1745 0.1719]; % Second row in table corresponding to Strike2Заполните входные аргументы, используя эти данные для RateSpec:
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; 0.0792; 0.0793]; ValuationDate = '21-Jan-2008'; 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';.... '21-Mar-2011';'21-Jun-2011'}; Compounding = 4; Basis = 0; RateSpec = intenvset('ValuationDate', ValuationDate, ... 'StartDates', ValuationDate, 'EndDates', EndDates, ... 'Rates', Rates, 'Compounding', Compounding, 'Basis', Basis)
RateSpec =
FinObj: 'RateSpec'
Compounding: 4
Disc: [14x1 double]
Rates: [14x1 double]
EndTimes: [14x1 double]
StartTimes: [14x1 double]
EndDates: [14x1 double]
StartDates: 733428
ValuationDate: 733428
Basis: 0
EndMonthRule: 1Использовать hwcalbycap для вычисления значений Alpha и Sigma на основе рыночных данных. Внутри, hwcalbycap вызывает функцию lsqnonlin. Можно настроить lsqnonlin передавая структуру опций оптимизации, созданную optimoptions и затем это можно передать в hwcalbycap использование аргумента пары имя-значение для OptimOptions. Например, optimoptions определяет допуск целевой целевой функции как 100*eps а затем звонит hwcalbycap:
o=optimoptions('lsqnonlin','TolFun',100*eps); [Alpha, Sigma] = hwcalbycap(RateSpec, MarketStrike, MarketMat, MarketVol,... Strike, Settle, Maturity, 'Reset', Reset, 'Principal', Principal, 'Basis',... Basis, 'OptimOptions', o)
Local minimum possible.
lsqnonlin stopped because the size of the current step is less than
the default value of the step size tolerance.
Warning: LSQNONLIN did not converge to an optimal solution. It exited with exitflag = 2.
> In hwcalbycapfloor at 93
In hwcalbycap at 75
Alpha =
1.0000e-06
Sigma =
0.0127 Предыдущее предупреждение указывает, что преобразование не было оптимальным. Алгоритм поиска, используемый функцией Optimization Toolbox™ lsqnonlin не удалось найти решение, соответствующее всем ограничениям. Чтобы определить, приемлемо ли решение, просмотрите результаты оптимизации, указав третий вывод (OptimOut) для hwcalbycap:
[Alpha, Sigma, OptimOut] = hwcalbycap(RateSpec, MarketStrike, MarketMat,... MarketVol, Strike, Settle, Maturity, 'Reset', Reset, 'Principal', Principal,... 'Basis', Basis, 'OptimOptions', o);
OptimOut.residual области OptimOut структура - это остаточное значение оптимизации. Это значение содержит разницу между черными буквами и буквами, рассчитанными во время оптимизации. Вы можете использовать OptimOut.residual значение, чтобы вычислить процентную разницу (ошибку) по сравнению с ценами Black caplet, а затем решить, является ли остаток приемлемым. Почти всегда есть некоторый остаток, поэтому решите, приемлемо ли параметризировать рынок с одним значением Alpha и Sigma.
Для определения эффективности оптимизации вычислите ссылочные значения caplet по формуле Black и рыночным данным. Обратите внимание, что сначала необходимо интерполировать рыночные данные для получения кэплетов для расчета:
MarketMatNum = datenum(MarketMat);
[Mats, Strikes] = meshgrid(MarketMatNum, MarketStrike);
FlatVol = interp2(Mats, Strikes, MarketVol, datenum(Maturity), Strike, 'spline');Рассчитайте цену ограничения с помощью модели Black:
[CapPrice, Caplets] = capbyblk(RateSpec, Strike, Settle, Maturity, FlatVol,... 'Reset', Reset, 'Basis', Basis, 'Principal', Principal); Caplets = Caplets(2:end)';
Caplets =
0.3210
1.6355
2.4863
3.1903
3.4110
3.2685
3.2385
3.4803
3.2419
3.1949
3.2991
3.3750После вычисления ссылочных значений для кэплетов сравните значения аналитически и графически, чтобы определить, являются ли вычисленные единичные значения Alpha и Sigma обеспечить адекватное приближение:
OptimCaplets = Caplets+OptimOut.residual; disp(' '); disp(' Black76 Calibrated Caplets'); disp([Caplets OptimCaplets]) plot(MarketMatNum(2:end), Caplets, 'or', MarketMatNum(2:end), OptimCaplets, '*b'); datetick('x', 2) xlabel('Caplet Maturity'); ylabel('Caplet Price'); title('Black and Calibrated Caplets'); h = legend('Black Caplets', 'Calibrated Caplets'); set(h, 'color', [0.9 0.9 0.9]); set(h, 'Location', 'SouthEast'); set(gcf, 'NumberTitle', 'off') grid on
Black76 Calibrated Caplets
0.3210 0.3636
1.6355 1.6603
2.4863 2.4974
3.1903 3.1874
3.4110 3.4040
3.2685 3.2639
3.2385 3.2364
3.4803 3.4683
3.2419 3.2408
3.1949 3.1957
3.2991 3.2960
3.3750 3.3663
Используя рассчитанные значения caplet, сравните цены соответствующих cap с использованием модели Black, аналитической модели Hull-White и модели дерева Hull-White. Вычисление белого дерева корпуса на основе Alpha и Sigma, используйте следующие процедуры калибровки:
Черная модель:
CapPriceBLK = CapPrice;
Аналитическая модель ТС:
CapPriceHWAnalytical = sum(OptimCaplets);
Модель дерева аппаратных средств для оценки предельного значения, полученного в процессе калибровки:
Создать VolSpec из параметров калибровки Alpha и Sigma:
VolDates = EndDates; VolCurve = Sigma*ones(14,1); AlphaDates = EndDates; AlphaCurve = Alpha*ones(14,1); HWVolSpec = hwvolspec(ValuationDate, VolDates, VolCurve,AlphaDates, AlphaCurve);
Создать TimeSpec:
HWTimeSpec = hwtimespec(ValuationDate, EndDates, Compounding);
Построение дерева аппаратных средств с помощью HW2000 способ:
HWTree = hwtree(HWVolSpec, RateSpec, HWTimeSpec, 'Method', 'HW2000');
Цена предельного значения:
Price = capbyhw(HWTree, Strike, Settle, Maturity, Reset, Basis, Principal); disp(' '); disp([' CapPrice Black76 ..................: ', num2str(CapPriceBLK,'%15.5f')]); disp([' CapPrice HW analytical..........: ', num2str(CapPriceHWAnalytical,'%15.5f')]); disp([' CapPrice HW from capbyhw ..: ', num2str(Price,'%15.5f')]); disp(' ');
CapPrice Black76 ..........: 34.14220 CapPrice HW analytical.....: 34.18008 CapPrice HW from capbyhw ..: 34.14192
После построения дерева Халл-Уайт на основе параметров, откалиброванных на основе рыночных данных, используйте HWTree оценить портфель этих инструментов:
Две облигации
CouponRate = [0.07; 0.09]; Settle = ' Jan-21-2008'; Maturity = {'Mar-21-2010';'Mar-21-2011'}; Period = 1; Face = 1000; Basis = 0;
Бонд со встроенным опционом на американский колл
CouponRateOEB = 0.08; SettleOEB = ' Jan-21-2008'; MaturityOEB = 'Mar-21-2011'; OptSpec = 'call'; StrikeOEB = 950; ExerciseDatesOEB = 'Mar-21-2011'; AmericanOpt = 1; Period = 1; Face = 1000; Basis = 0;
Чтобы оценить этот портфель инструментов с помощью откалиброванных HWTree:
Использовать instadd для создания портфеля InstSet:
InstSet = instadd('Bond', CouponRate, Settle, Maturity, Period, Basis, [], [], [], [], [], Face); InstSet = instadd(InstSet,'OptEmBond', CouponRateOEB, SettleOEB, MaturityOEB, OptSpec,... StrikeOEB, ExerciseDatesOEB, 'AmericanOpt', AmericanOpt, 'Period', Period,... 'Face',Face, 'Basis', Basis);
Добавить прибор с колпачком, используемый при калибровке:
SettleCap = ' Jan-21-2008'; MaturityCap = 'Mar-21-2011'; StrikeCap = 0.0690; Reset = 4; Principal = 1000; InstSet = instadd(InstSet,'Cap', StrikeCap, SettleCap, MaturityCap, Reset, Basis, Principal);
Присвойте имена портфельным инструментам:
Names = {'7% Bond'; '8% Bond'; 'BondEmbCall'; '6.9% Cap'};
InstSet = instsetfield(InstSet, 'Index',1:4, 'FieldName', {'Name'}, 'Data', Names );Осмотрите комплект приборов, содержащихся в InstSet:
instdisp(InstSet)
IdxType CoupRate Settle Mature Period Basis EOMRule IssueDate 1stCoupDate LastCoupDate StartDate Face Name 1 Bond 0.07 21-Jan-2008 21-Mar-2010 1 0 NaN NaN NaN NaN NaN 1000 7% Bond 2 Bond 0.09 21-Jan-2008 21-Mar-2011 1 0 NaN NaN NaN NaN NaN 1000 8% Bond IdxType CoupRate Settle Mature OptSpec Stke ExDate Per Basis EOMRule IssDate 1stCoupDate LstCoupDate StrtDate Face AmerOpt Name 3 OptEmBond 0.08 21-Jan-2008 21-Mar-2011 call 950 21-Jan-2008 21-Mar-2011 1 0 1 NaN NaN NaN NaN 1000 1 BondEmbCall Index Type Strike Settle Maturity CapReset Basis Principal Name 4 Cap 0.069 21-Jan-2008 21-Mar-2011 4 0 1000 6.9% Cap
Использовать hwprice чтобы оценить портфель с использованием откалиброванного HWTree:
format bank
PricePortfolio = hwprice(HWTree, InstSet)PricePortfolio =
980.45
1023.05
945.73
34.14
bdtprice | bdtsens | bdttimespec | bdttree | bdtvolspec | bkprice | bksens | bktimespec | bktree | bkvolspec | bondbybdt | bondbybk | bondbyhjm | bondbyhw | bondbyzero | capbybdt | capbybk | capbyblk | capbyhjm | capbyhw | cfbybdt | cfbybk | cfbyhjm | cfbyhw | cfbyzero | fixedbybdt | fixedbybk | fixedbyhjm | fixedbyhw | fixedbyzero | floatbybdt | floatbybk | floatbyhjm | floatbyhw | floatbyzero | floatdiscmargin | floatmargin | floorbybdt | floorbybk | floorbyblk | floorbyhjm | floorbyhw | hjmprice | hjmsens | hjmtimespec | hjmtree | hjmvolspec | hwcalbycap | hwcalbyfloor | hwprice | hwsens | hwtimespec | hwtree | hwvolspec | instbond | instcap | instcf | instfixed | instfloat | instfloor | instoptbnd | instoptembnd | instoptemfloat | instoptfloat | instrangefloat | instswap | instswaption | intenvprice | intenvsens | intenvset | mmktbybdt | mmktbyhjm | oasbybdt | oasbybk | oasbyhjm | oasbyhw | optbndbybdt | optbndbybk | optbndbyhjm | optbndbyhw | optembndbybdt | optembndbybk | optembndbyhjm | optembndbyhw | optemfloatbybdt | optemfloatbybk | optemfloatbyhjm | optemfloatbyhw | optfloatbybdt | optfloatbybk | optfloatbyhjm | optfloatbyhw | rangefloatbybdt | rangefloatbybk | rangefloatbyhjm | rangefloatbyhw | swapbybdt | swapbybk | swapbyhjm | swapbyhw | swapbyzero | swaptionbybdt | swaptionbybk | swaptionbyblk | swaptionbyhjm | swaptionbyhw