Калибровка каплетов с использованием модели Normal (Bachelier)

В этом примере показано, как использовать 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]

The OptimOut.residual поле OptimOut структура является невязкой оптимизации. Это значение содержит различие между каплетами Normal (Bachelier) и caplets, рассчитанными во время оптимизации. Используйте OptimOut.residual значение, чтобы вычислить процентное различие (ошибку) по сравнению с ценами на каплеты Normal (Bachelier), а затем решить, является ли невязка приемлемым. Есть почти всегда какой-то остаточный, поэтому решите, приемлемо ли параметризовать рынок с одним значением Alpha и Sigma.

Оцените caplets с помощью рыночных данных и модели 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

Figure contains an axes. The axes with title Bachelier and Calibrated Caplets contains 2 objects of type line. These objects represent Bachelier Caplets, Calibrated Caplets.