Этот пример показывает, как использовать hwcalbycap
, чтобы калибровать данные о рынке с моделью Normal (Bachelier) к цене caplets. Используйте модель Normal (Bachelier), чтобы выполнить калибровки при работе с отрицательными процентными ставками, забастовками и нормальной подразумеваемой волатильностью.
Рассмотрите прописную букву с этими параметрами:
Settle = 'Dec-30-2016'; Maturity = 'Dec-30-2019'; Strike = -0.001075; Reset = 2; Principal = 100; Basis = 0;
caplets и данные о рынке для этого примера заданы как:
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) caplets и вычисленными во время оптимизации. Используйте значение OptimOut.residual
, чтобы вычислить percentual различие (ошибка) по сравнению с Нормальным (Bachelier) caplet цены, и затем решить, приемлема ли невязка. Существует почти всегда некоторая невязка, поэтому решите, приемлемо ли параметризовать рынок с одним значением Alpha
и Sigma
.
Оцените caplets использование данных о рынке и модели Normal (Bachelier), чтобы получить ссылку caplet значения. Чтобы определить эффективность оптимизации, вычислите ссылку caplet значения с помощью Нормальной формулы (Bachelier) и данных о рынке. Отметьте, необходимо сначала интерполировать данные о рынке, чтобы получить caplets для вычисления.
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
Сравните оптимизированные значения и Нормальные значения (Bachelier), и отобразите результаты графически. После вычисления ссылочных значений для caplets сравните значения аналитически и графически определить, обеспечивают ли расчетные одно значения 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