В этом примере показано, как использовать 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]
OptimOut.residual области OptimOut структура - это остаточное значение оптимизации. Это значение содержит разницу между нормальными (Bachelier) и рассчитанными во время оптимизации. Используйте OptimOut.residual значение, чтобы вычислить процентную разницу (ошибку) по сравнению с нормальными ценами (Bachelier) caplet, а затем решить, является ли остаток приемлемым. Почти всегда есть некоторый остаток, поэтому решите, приемлемо ли параметризировать рынок с одним значением Alpha и Sigma.
Оцените кэплеты с использованием рыночных данных и модели 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
