Ценообразование производных по процентным ставкам ценных бумаг основывается на моделях, которые описывают базовый процесс. Эти модели процентных ставок зависят от одного или нескольких параметров, которые вы должны определить, сопоставив предсказания модели с существующими данными, доступными на рынке. В модели Халла-Уайта существует два параметра, связанных с процессом короткой скорости: средняя реверсия и волатильность. Калибровка используется для определения этих параметров, так что модель может максимально близко воспроизводить цены на прописные буквы или полы, наблюдаемые на рынке. Стандартные программы калибровки находят параметры, которые минимизируют различие между предсказаниями цен модели и рыночными ценами для предельных значений и этажей.
Для модели Халла-Уайта минимизация является двумерной, относительно средней реверсии (α) и летучести (,). То есть калибровка модели Халла-Уайта минимизирует различие между предсказанными ценами модели и наблюдаемыми рыночными ценами соответствующих каплетов или флорлетов.
Используйте рыночные данные, чтобы идентифицировать подразумеваемые коэффициенты волатильности ( Идеальным случаем является использование волатильности прописных букв или полов, используемых для вычисления Alpha
(α) и Sigma
(σ). Скорее всего, это не так, поэтому рыночные данные должны быть интерполированы, чтобы получить необходимые значения.
Рассмотрим прописную букву с этими параметрами:
Settle = ' Jan-21-2008'; Maturity = 'Mar-21-2011'; Strike = 0.0690; Reset = 4; Principal = 1000; Basis = 0;
Каплеты для этого примера будут падать в:
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
, и сроки в каждой перечисленной дате сброса, но вероятность нахождения этих точных инструментов невелика. Как следствие, используйте данные, доступные на рынке, и интерполируйте, чтобы найти соответствующие значения для caplets.
На основе рыночных данных у вас есть информация о прописной букве для различных дат и забастовок. Предположим, что вместо наличия данных для 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);
The OptimOut.residual
поле OptimOut
структура является невязкой оптимизации. Это значение содержит различие между черными каплетами и теми, что были вычислены во время оптимизации. Можно использовать OptimOut.residual
значение, чтобы вычислить процентное различие (ошибку) по сравнению с ценами на черный каплеты и затем решить, является ли невязка приемлемым. Есть почти всегда какой-то остаточный, поэтому решите, приемлемо ли параметризовать рынок с одним значением Alpha
и Sigma
.
Чтобы определить эффективность оптимизации, вычислите эталонные каплетные значения с помощью формулы Блэка и рыночных данных. Обратите внимание, что сначала необходимо интерполировать рыночные данные, чтобы получить каплеты для вычисления:
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, сравните цены соответствующей прописной буквы с помощью модели Black, аналитических моделей Hull-White и древовидных моделей Hull-White. Вычисление дерева Hull-White на основе Alpha
и Sigma
, используйте эти стандартные программы калибровки:
Черная модель:
CapPriceBLK = CapPrice;
Аналитическая модель HW:
CapPriceHWAnalytical = sum(OptimCaplets);
Модель дерева HW для оценки прописной буквы, полученной из процесса калибровки:
Создание 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