Оценка ценных бумаг производной процентной ставки полагается на модели, которые описывают базовый процесс. Эти модели процентной ставки зависят от одного или нескольких параметров, которые необходимо определить путем соответствия с образцовыми прогнозами к существующим доступным данным на рынке. В модели Hull-White существует два параметра, связанные с коротким процессом уровня: возвращение к среднему уровню и энергозависимость. Калибровка используется, чтобы определить эти параметры, такие, что модель может воспроизвести, максимально близко, цены прописных букв или этажей, наблюдаемых на рынке. Калибровочные стандартные программы находят параметры, которые минимизируют различие между образцовыми прогнозами цен и рыночными ценами на прописные буквы и этажи.
Для модели Hull-White минимизация является двумерной относительно возвращения к среднему уровню (α) и энергозависимость (σ). Таким образом, калибровка модели Hull-White минимизирует различие между предсказанными ценами модели и наблюдаемыми рыночными ценами соответствующего caplets или floorlets.
Используйте данные о рынке, чтобы идентифицировать подразумеваемую волатильность (σ), и возвращение к среднему уровню (α) коэффициенты должно было создать Белое как оболочка дерево, чтобы оценить инструмент. Идеальный случай должен использовать колебания прописных букв, или этажи раньше вычисляли 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
и сроки платежа на каждой перечисленной дате сброса, но вероятность нахождения этих точных инструментов является низкой. Как следствие используйте данные, которые доступны на рынке, и интерполируйте, чтобы найти соответствующие значения для caplets.
На основе данных о рынке у вас есть информация о прописной букве для различных дат и забастовок. Примите, что вместо того, чтобы иметь данные для Strike
= 0.0690
, у вас есть данные для Strike1
= 0.0590
и Strike2
= 0.0790
.
Зрелость | Strike1 = 0.0590 | Strike2 = 0.0790 |
---|---|---|
21 марта 2008 | 0.1533 | 0. 1526 |
21 июня 2008 | 0.1731 | 0. 1730 |
21 сентября 2008 | 0. 1727 | 0. 1726 |
21 декабря 2008 | 0. 1752 | 0. 1747 |
21 марта 2009 | 0. 1809 | 0. 1808 |
21 июня 2009 | 0. 1809 | 0. 1792 |
21 сентября 2009 | 0. 1805 | 0. 1797 |
21 декабря 2009 | 0. 1802 | 0. 1794 |
21 марта 2010 | 0. 1802 | 0. 1733 |
21 июня 2010 | 0. 1757 | 0. 1751 |
21 сентября 2010 | 0. 1755 | 0. 1750 |
21 декабря 2010 | 0. 1755 | 0. 1745 |
21 марта 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
вызывает функцию Optimization Toolbox™ 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
является невязкой оптимизации. Это значение содержит различие между Черным caplets и вычисленными во время оптимизации. Можно использовать значение OptimOut.residual
, чтобы вычислить percentual различие (ошибка) по сравнению с Черными caplet ценами и затем решить, приемлема ли невязка. Существует почти всегда некоторая невязка, поэтому решите, приемлемо ли параметризовать рынок с одним значением Alpha
и Sigma
.
Чтобы определить эффективность оптимизации, вычислите ссылку caplet значения с помощью формулы Черного цвета и данных о рынке. Отметьте, необходимо сначала интерполировать данные о рынке, чтобы получить caplets для вычисления:
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
После вычисления ссылочных значений для caplets сравните значения, аналитически и графически, чтобы определить, обеспечивают ли расчетные одно значения 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, Белых как оболочка аналитических, и Белых как оболочка древовидных моделей. Чтобы вычислить Белое как оболочка дерево на основе 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);
Создайте дерево HW использование метода 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