Калибровка Floorlets Используя нормальную модель (Bachelier)

В этом примере показано, как использовать hwcalbyfloor калибровать данные о рынке с моделью Normal (Bachelier) к цене floorlets. Используйте модель Normal (Bachelier), чтобы выполнить калибровки при работе с отрицательными процентными ставками, забастовками и нормальной подразумеваемой волатильностью.

Рассмотрите пол этими параметрами:

Settle = 'Dec-30-2016';
Maturity = 'Dec-30-2019';
Strike = -0.004075;
Reset = 2;
Principal = 100;
Basis = 0;

floorlets и данные о рынке для этого примера заданы как:

floorletDates = cfdates(Settle, Maturity, Reset, Basis);
datestr(floorletDates')
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.00595; 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.003210;-0.003020;-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);

Используйте hwcalbyfloor найти значения для параметров энергозависимости Alpha и Sigma использование модели Normal (Bachelier).

format short
o=optimoptions('lsqnonlin','TolFun',100*eps);
warning ('off','fininst:hwcalbycapfloor:NoConverge')
[Alpha, Sigma, OptimOut] = hwcalbyfloor(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.3410
OptimOut = struct with fields:
     resnorm: 1.9233e-04
    residual: [5x1 double]
    exitflag: 2
      output: [1x1 struct]
      lambda: [1x1 struct]
    jacobian: [5x2 double]

OptimOut.residual поле OptimOut структура является невязкой оптимизации. Это значение содержит различие между Нормальным (Bachelier) floorlets и вычисленными во время оптимизации. Используйте OptimOut.residual значение, чтобы вычислить percentual различие (ошибка) по сравнению с Нормальным (Bachelier) floorlet цены, и затем решить, приемлема ли невязка. Существует почти всегда некоторая невязка, поэтому решите, приемлемо ли параметрировать рынок с одним значением Alpha и Sigma.

Оцените floorlets использование данных о рынке и модели Normal (Bachelier), чтобы получить ссылку floorlet значения. Чтобы определить эффективность оптимизации, вычислите ссылку floorlet значения с помощью Нормальной формулы (Bachelier) и данных о рынке. Отметьте, необходимо сначала интерполировать данные о рынке, чтобы получить floorlets для вычисления.

MarketMatNum = datenum(MarketMat);
[Mats, Strikes] = meshgrid(MarketMatNum, MarketStrike);
FlatVol = interp2(Mats, Strikes, MarketVol, datenum(Maturity), Strike, 'spline');

[FloorPrice, Floorlets] = floorbynormal(RateSpec, Strike, Settle, Maturity, FlatVol,...
'Reset', Reset, 'Basis', Basis, 'Principal', Principal); 
Floorlets = Floorlets(2:end)'
Floorlets = 5×1

    4.7637
    6.7180
    8.1833
    9.5825
   10.6090

Сравните оптимизированные значения и Нормальные значения (Bachelier), и отобразите результаты графически. После вычисления ссылочных значений для floorlets сравните значения аналитически и графически определить ли расчетные одно значения Alpha и Sigma обеспечьте соответствующее приближение.

OptimFloorlets = Floorlets+OptimOut.residual;

disp('   ');
   
disp(' Bachelier   Calibrated Floorlets');
 Bachelier   Calibrated Floorlets
disp([Floorlets        OptimFloorlets])
    4.7637    4.7685
    6.7180    6.7263
    8.1833    8.1878
    9.5825    9.5795
   10.6090   10.6007
plot(MarketMatNum(2:end), Floorlets, 'or', MarketMatNum(2:end), OptimFloorlets, '*b');
datetick('x', 2)
xlabel('Floorlet Maturity');
ylabel('Floorlet Price');
ylim ([0 16]);
title('Bachelier and Calibrated Floorlets');
h = legend('Bachelier Floorlets', 'Calibrated Floorlets');
set(h, 'color', [0.9 0.9 0.9]);
set(h, 'Location', 'SouthEast');
set(gcf, 'NumberTitle', 'off')
grid on