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

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

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

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

Половицы и рыночные данные для этого примера определяются как:

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]

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

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

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

Сравните оптимизированные значения и значения Normal (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

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