Прайс Свапшнс с отрицательными забастовками Используя переключенную модель SABR

Этот пример показывает, как оценить swaptions с отрицательными забастовками при помощи модели Shifted SABR. Рынок Переключенные Черные колебания используется, чтобы калибровать Переключенные параметры модели SABR. Калиброванная модель Shifted SABR затем используется, чтобы вычислить Переключенные Черные колебания для отрицательных забастовок.

swaptions с отрицательными забастовками затем оценены с помощью вычисленных Переключенных Черных колебаний и функции swaptionbyblk с набором параметра 'Shift' к предзаданному сдвигу. Точно так же Переключенные греки SABR могут быть вычислены при помощи функции optsensbysabr путем установки 'Shift' параметра. Наконец, от swaption цен, плотность вероятности базового актива вычисляется, чтобы показать, что swaption цены подразумевают положительные плотности вероятности для некоторых отрицательных забастовок.

Загрузите данные о рынке.

Во-первых, загрузите рыночные процентные ставки и swaption данные об энергозависимости. Рынок swaption колебания заключается в кавычки с точки зрения Переключенных Черных колебаний со сдвигом процента 0.8.

Задайте RateSpec.

ValuationDate = '5-Apr-2016';
EndDates = datemnth(ValuationDate,[1 2 3 6 9 12*[1 2 3 4 5 6 7 8 9 10 12]])';
ZeroRates = [-0.34 -0.29 -0.25 -0.13 -0.07 -0.02 0.010 0.025 ...
    0.031 0.040 0.052 0.090 0.190 0.290 0.410 0.520]'/100;
Compounding = 1;
RateSpec = intenvset('ValuationDate',ValuationDate,'StartDates',ValuationDate, ...
'EndDates',EndDates,'Rates',ZeroRates,'Compounding',Compounding)
RateSpec = struct with fields:
           FinObj: 'RateSpec'
      Compounding: 1
             Disc: [16x1 double]
            Rates: [16x1 double]
         EndTimes: [16x1 double]
       StartTimes: [16x1 double]
         EndDates: [16x1 double]
       StartDates: 736425
    ValuationDate: 736425
            Basis: 0
     EndMonthRule: 1

Задайте swaption.

SwaptionSettle = '5-Apr-2016';
SwaptionExerciseDate = '5-Apr-2017';
SwapMaturity = '5-Apr-2022';
Reset = 1;
OptSpec = 'call';
TimeToExercise = yearfrac(SwaptionSettle,SwaptionExerciseDate);

Используйте swapbyzero, чтобы вычислить прямой уровень подкачки.

LegRate = [NaN 0];  % To compute the forward swap rate, set the fixed rate to NaN.
[~, CurrentForwardValue] = swapbyzero(RateSpec,LegRate,SwaptionSettle,SwapMaturity,...
'StartDate',SwaptionExerciseDate)
CurrentForwardValue = 6.6384e-04

Укажите, что сумма переключает десятичные числа на нижний регистр для моделей Shifted Black и Shifted SABR.

Shift = 0.008;  % 0.8 percent shift

Загрузите подразумеваемые Переключенные Черные данные об энергозависимости рынка для swaptions.

MarketShiftedBlackVolatilities = [21.1; 15.3; 14.0; 14.6; 16.0; 17.7; 19.8; 23.9; 26.2]/100;
StrikeGrid = [-0.5; -0.25; -0.125; 0; 0.125; 0.25; 0.5; 1.0; 1.5]/100;
MarketStrikes = CurrentForwardValue + StrikeGrid;
ATMShiftedBlackVolatility = MarketShiftedBlackVolatilities(StrikeGrid==0);

Калибруйте Переключенные параметры модели SABR.

Чтобы лучше представлять рынок энергозависимость в деньгах, значение параметров Alpha подразумевается рынком энергозависимость в деньгах. Это подобно "Методу 2" в, Калибруют Модель SABR. Однако отметьте сложение Shift к CurrentForwardValue и использованию параметра 'Shift' с blackvolbysabr. Beta параметр предопределяется в 0.5.

Beta = 0.5;

Эта функция решает Переключенный SABR уравнение энергозависимости в деньгах как полином Alpha. Отметьте сложение Shift к CurrentForwardValue.

alpharoots = @(Rho,Nu) roots([...
    (1 - Beta)^2*TimeToExercise/24/(CurrentForwardValue + Shift)^(2 - 2*Beta) ...
    Rho*Beta*Nu*TimeToExercise/4/(CurrentForwardValue + Shift)^(1 - Beta) ...
    (1 + (2 - 3*Rho^2)*Nu^2*TimeToExercise/24) ...
    -ATMShiftedBlackVolatility*(CurrentForwardValue + Shift)^(1 - Beta)]);

Эта функция преобразовывает энергозависимость в деньгах в Alpha путем выбора самого маленького положительного действительного корня.

atmVol2ShiftedSabrAlpha = @(Rho,Nu) min(real(arrayfun(@(x) ...
    x*(x>0) + realmax*(x<0 || abs(imag(x))>1e-6), alpharoots(Rho,Nu))));

Соответствуйте Rho и Nu (при преобразовании энергозависимости в деньгах в Alpha). Обратите внимание, что параметр 'Shift' blackvolbysabr устанавливается на предзаданный сдвиг.

objFun = @(X) MarketShiftedBlackVolatilities - ...
    blackvolbysabr(atmVol2ShiftedSabrAlpha(X(1), X(2)), ...
    Beta, X(1), X(2), SwaptionSettle, SwaptionExerciseDate, CurrentForwardValue, ...
    MarketStrikes, 'Shift', Shift);

options = optimoptions('lsqnonlin','Display','none');
X = lsqnonlin(objFun, [0 0.5], [-1 0], [1 Inf], options);
Rho = X(1);
Nu = X(2);

Получите итоговый Alpha от калиброванных параметров.

Alpha = atmVol2ShiftedSabrAlpha(Rho, Nu)
Alpha = 0.0133

Покажите калиброванные Переключенные параметры SABR.

CalibratedPrameters = array2table([Shift Alpha Beta Rho Nu],...
    'VariableNames',{'Shift' 'Alpha' 'Beta' 'Rho' 'Nu'},...
    'RowNames',{'1Y into 5Y'})
CalibratedPrameters=1×5 table
                  Shift     Alpha      Beta      Rho        Nu   
                  _____    ________    ____    _______    _______

    1Y into 5Y    0.008    0.013345    0.5     0.46698    0.49816

Вычислите swaption колебания с помощью калиброванной модели Shifted SABR.

Используйте blackvolbysabr с 'Shift' параметром.

Strikes = (-0.6:0.01:1.6)'/100; % Include negative strikes.
SABRShiftedBlackVolatilities = blackvolbysabr(Alpha, Beta, Rho, Nu, SwaptionSettle, ...
    SwaptionExerciseDate, CurrentForwardValue, Strikes, 'Shift', Shift);

figure;
plot(MarketStrikes, MarketShiftedBlackVolatilities, 'o', ...
    Strikes, SABRShiftedBlackVolatilities);
h = gca;
line([0,0],[min(h.YLim),max(h.YLim)],'LineStyle','--');
ylim([0.13 0.31])
xlabel('Strike');
legend('Market quotes','Shifted SABR', 'location', 'southeast');
title (['Shifted Black Volatility (',num2str(Shift*100),' percent shift)']);

Оцените swaptions, включая тех с отрицательными забастовками.

Используйте swaptionbyblk с 'Shift' параметром, чтобы вычислить swaption цены с помощью модели Shifted Black.

SwaptionPrices = swaptionbyblk(RateSpec, OptSpec, Strikes, SwaptionSettle, SwaptionExerciseDate, ...
    SwapMaturity, SABRShiftedBlackVolatilities, 'Reset', Reset, 'Shift', Shift);
figure;
plot(Strikes, SwaptionPrices, 'r');
h = gca;
line([0,0],[min(h.YLim),max(h.YLim)],'LineStyle','--');
xlabel('Strike');
title ('Swaption Price');

Вычислите переключенную Delta SABR.

Используйте optsensbysabr с 'Shift' параметром, чтобы вычислить Delta с помощью модели Shifted SABR.

ShiftedSABRDelta = optsensbysabr(RateSpec, Alpha, Beta, Rho, Nu, SwaptionSettle, ...
SwaptionExerciseDate, CurrentForwardValue, Strikes, OptSpec, 'Shift', Shift);

figure;
plot(Strikes,ShiftedSABRDelta,'r-');
ylim([-0.002 1.002]);
h = gca;
line([0,0],[min(h.YLim),max(h.YLim)],'LineStyle','--');
xlabel('Strike');
title ('Delta');

Вычислите плотность вероятности.

Нейтральная к риску плотность вероятности терминальных цен базового актива может быть аппроксимирована как вторая производная swaption цен относительно забастовки (Breeden и Litzenberger, 1978). Как видно в графике ниже, вычисленная плотность вероятности положительна для некоторых отрицательных уровней выше-0.8 процентов (нижняя граница, определенная 'Shift').

NumGrids = length(Strikes);
ProbDensity = zeros(NumGrids-2,1);
dStrike = mean(diff(Strikes));

for k = 2:(NumGrids-1)
    ProbDensity(k-1) = (SwaptionPrices(k-1) - 2*SwaptionPrices(k) + SwaptionPrices(k+1))/dStrike^2;
end

ProbDensity = ProbDensity./sum(ProbDensity);
ProbStrikes = Strikes(2:end-1);

figure;
plot(ProbStrikes,ProbDensity,'r-');
h = gca;
line([0,0],[min(h.YLim),max(h.YLim)],'LineStyle','--');
xlabel('Strike');
title ('Probability Density');

Ссылки

Хейган, P. S. Кумар, D., Лесниевский, A. S. и лесничий, D. E. "Управляя риском улыбки". Журнал Wilmott. 2002.

Kienitz, J. Объясненные производные процентной ставки. Издание 1. Пэлгрэйв Макмиллан, 2014.

Breeden, D. T. и Litzenberger, R. H. "Цены заявлений состояния сопряженных, неявных в ценах опции". Бизнес журнала. Издание 51. 1978.

Смотрите также

| | | | | | | |

Связанные примеры

Больше о