Оцените Swaption Используя модель SABR

В этом примере показано, как оценить swaption использование модели SABR. Во-первых, swaption поверхность энергозависимости создается из волатильности рынка. Это сделано путем калибровки параметров модели SABR отдельно для каждой swaption зрелости. swaption цена затем вычисляется при помощи подразумеваемой Черной энергозависимости на поверхности как вход к swaptionbyblk функция.

Шаг 1. Загрузите рынок swaption данные об энергозависимости.

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

Settle = '12-Jun-2013';
ExerciseDates = {'12-Sep-2013';'12-Jun-2014';'12-Jun-2015';...
    '12-Jun-2016';'12-Jun-2017';'12-Jun-2018';'12-Jun-2020';...
    '12-Jun-2023'};

YearsToExercise = yearfrac(Settle, ExerciseDates, 1);
NumMaturities = length(YearsToExercise);

MarketVolatilities = [ ...
   57.6 53.7 49.4 45.6 44.1 41.1 35.2 32.0
   46.6 46.9 44.8 41.6 39.8 37.4 33.4 31.0
   35.9 39.3 39.6 37.9 37.2 34.7 30.5 28.9
   34.1 36.5 37.8 36.6 35.0 31.9 28.1 26.6
   41.0 41.3 39.5 37.8 36.0 32.6 29.0 26.0
   45.8 43.4 41.9 39.2 36.9 33.2 29.6 26.3
   50.3 46.9 44.0 40.0 37.5 33.8 30.2 27.3]/100;

MarketStrikes = [ ...
  1.00 1.25 1.68 2.00 2.26 2.41 2.58 2.62;
  1.50 1.75 2.18 2.50 2.76 2.91 3.08 3.12;
  2.00 2.25 2.68 3.00 3.26 3.41 3.58 3.62;
  2.50 2.75 3.18 3.50 3.76 3.91 4.08 4.12;
  3.00 3.25 3.68 4.00 4.26 4.41 4.58 4.62;
  3.50 3.75 4.18 4.50 4.76 4.91 5.08 5.12;
  4.00 4.25 4.68 5.00 5.26 5.41 5.58 5.62]/100;

CurrentForwardValues = MarketStrikes(4,:)
CurrentForwardValues = 1×8

    0.0250    0.0275    0.0318    0.0350    0.0376    0.0391    0.0408    0.0412

ATMVolatilities = MarketVolatilities(4,:)
ATMVolatilities = 1×8

    0.3410    0.3650    0.3780    0.3660    0.3500    0.3190    0.2810    0.2660

Текущие базовые форвардные курсы и соответствующие колебания в деньгах через восемь swaption сроков платежа представлены в четвертых строках этих двух матриц.

Шаг 2. Калибруйте параметры модели SABR для каждой swaption зрелости.

Используя модель, реализованную в функции blackvolbysabr, статическая модель SABR, где параметры модели приняты постоянным относительно времени, параметры, калибруется отдельно для каждой swaption зрелости (годы, чтобы тренироваться) в for цикл. Лучше представлять рынок колебания в деньгах, Alpha значения параметров подразумеваются рынком колебания в деньгах (см., что "Метод 2" для Калибрует Модель SABR).

Задайте предопределенный Beta, калибруйте параметры модели SABR для каждой swaption зрелости, и отображение калибровало параметры в таблице.

Beta = 0.5;
Betas = repmat(Beta, NumMaturities, 1);
Alphas = zeros(NumMaturities, 1);
Rhos = zeros(NumMaturities, 1);
Nus = zeros(NumMaturities, 1);

options = optimoptions('lsqnonlin','Display','none');

for k = 1:NumMaturities
    % This function solves the SABR at-the-money volatility equation as a
    % polynomial of Alpha
    alpharoots = @(Rho,Nu) roots([...
        (1 - Beta)^2*YearsToExercise(k)/24/CurrentForwardValues(k)^(2 - 2*Beta) ...
        Rho*Beta*Nu*YearsToExercise(k)/4/CurrentForwardValues(k)^(1 - Beta) ...
        (1 + (2 - 3*Rho^2)*Nu^2*YearsToExercise(k)/24) ...
        -ATMVolatilities(k)*CurrentForwardValues(k)^(1 - Beta)]);

    % This function converts at-the-money volatility into Alpha by picking the
    % smallest positive real root
    atmVol2SabrAlpha = @(Rho,Nu) min(real(arrayfun(@(x) ...
        x*(x>0) + realmax*(x<0 || abs(imag(x))>1e-6), alpharoots(Rho,Nu))));

    % Fit Rho and Nu (while converting at-the-money volatility into Alpha)
    objFun = @(X) MarketVolatilities(:,k) - ...
        blackvolbysabr(atmVol2SabrAlpha(X(1), X(2)), ...
        Beta, X(1), X(2), Settle, ExerciseDates(k), CurrentForwardValues(k), ...
        MarketStrikes(:,k));

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

    % Get final Alpha from the calibrated parameters
    Alpha = atmVol2SabrAlpha(Rho, Nu);

    Alphas(k) = Alpha;
    Rhos(k) = Rho;
    Nus(k) = Nu;
end

CalibratedPrameters = array2table([Alphas Betas Rhos Nus],...
    'VariableNames',{'Alpha' 'Beta' 'Rho' 'Nu'},...
    'RowNames',{'3M into 10Y';'1Y into 10Y';...
    '2Y into 10Y';'3Y into 10Y';'4Y into 10Y';...
    '5Y into 10Y';'7Y into 10Y';'10Y into 10Y'})
CalibratedPrameters=8×4 table
                     Alpha      Beta      Rho         Nu   
                    ________    ____    ________    _______

    3M into 10Y     0.051947    0.5      0.39572     1.4146
    1Y into 10Y     0.054697    0.5       0.2955     1.1257
    2Y into 10Y     0.058433    0.5      0.24175    0.93463
    3Y into 10Y     0.058484    0.5      0.20568    0.79647
    4Y into 10Y     0.056054    0.5      0.13685    0.76993
    5Y into 10Y     0.051072    0.5     0.060285    0.73595
    7Y into 10Y      0.04475    0.5     0.083385    0.66341
    10Y into 10Y    0.044548    0.5      0.02261    0.49487

Шаг 3. Создайте поверхность энергозависимости.

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

Вычислите колебания с помощью калиброванных моделей для каждой зрелости и постройте поверхность энергозависимости.

PlottingStrikes = (0.95:0.1:5.8)'/100;
ComputedVols = zeros(length(PlottingStrikes), NumMaturities);

for k = 1:NumMaturities
ComputedVols(:,k) = blackvolbysabr(Alphas(k), Betas(k), Rhos(k), Nus(k), Settle, ...
    ExerciseDates(k), CurrentForwardValues(k), PlottingStrikes);
end

figure;
surf(YearsToExercise, PlottingStrikes, ComputedVols);
xlim([0 10]); ylim([0.0095 0.06]); zlim([0.2 0.8]);
view(113,32);
set(gca, 'Position', [0.13 0.11 0.775 0.815], ...
    'PlotBoxAspectRatioMode', 'manual');
xlabel('Years to exercise', 'Fontweight', 'bold');
ylabel('Strike', 'Fontweight', 'bold');
zlabel('Implied Black volatility', 'Fontweight', 'bold');

Figure contains an axes object. The axes object contains an object of type surface.

Отметьте на этой поверхности энергозависимости, улыбки имеют тенденцию становиться более плоскими для дольше swaption сроки платежа (годы, чтобы тренироваться). Это сопоставимо с Nu значения параметров, имеющие тенденцию уменьшиться с swaption зрелостью, как показано ранее в таблице для CalibratedPrameters.

Шаг 4. Используйте swaptionbyblk оценивать swaption.

Используйте поверхность энергозависимости, чтобы оценить swaption, который назревает за пять лет. Задайте swaption (для 10-летней подкачки), который назревает за пять лет, и используйте структуру термина процентной ставки во время swaption Settle дата, чтобы задать RateSpec. Используйте RateSpec вычислить текущий прямой уровень подкачки с помощью swapbyzero функция. Вычислите подразумеваемую Черную энергозависимость SABR для этого swaption использование blackvolbysabr функция (и это отмечено Красной стрелой на рисунке, который следует). Оцените swaption, использование SABR подразумевало Черную энергозависимость как вход к swaptionbyblk функция.

% Define the swaption
SwaptionSettle = '12-Jun-2013';
SwaptionExerciseDate = '12-Jun-2018';
SwapMaturity = '12-Jun-2028';
Reset = 1;
OptSpec = 'call';
Strike = 0.0263;

% Define RateSpec
ValuationDate = '12-Jun-2013';
EndDates = {'12-Jul-2013';'12-Sep-2013';'12-Dec-2013';'12-Jun-2014';...
    '12-Jun-2015';'12-Jun-2016';'12-Jun-2017';'12-Jun-2018';...
    '12-Jun-2019';'12-Jun-2020';'12-Jun-2021';'12-Jun-2022';...
    '12-Jun-2023';'12-Jun-2025';'12-Jun-2028';'12-Jun-2033'};
Rates = [0.2 0.3 0.4 0.7 0.5 0.7 1.0 1.4 1.7 1.9 ...
    2.1 2.3 2.5 2.8 3.1 3.3]'/100;
Compounding = 1;

RateSpec = intenvset('ValuationDate', ValuationDate, 'StartDates', ValuationDate, ...
'EndDates', EndDates, 'Rates', Rates, '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: 735397
    ValuationDate: 735397
            Basis: 0
     EndMonthRule: 1

% Use swapbyzero
LegRate = [NaN 0]; % To compute the forward swap rate, set the coupon rate to NaN.
[~, CurrentForwardSwapRate] = swapbyzero(RateSpec, LegRate, SwaptionSettle, SwapMaturity,...
'StartDate', SwaptionExerciseDate);

% Use blackvolbysabr
SABRBlackVolatility = blackvolbysabr(Alphas(6), Betas(6), Rhos(6), Nus(6), SwaptionSettle, ...
    SwaptionExerciseDate, CurrentForwardSwapRate, Strike)
SABRBlackVolatility = 0.3932
text (YearsToExercise(6), Strike, SABRBlackVolatility, '\leftarrow',...
    'Color', 'r', 'FontWeight', 'bold', 'FontSize', 22);

Figure contains an axes object. The axes object contains 2 objects of type surface, text.

% Use swaptionbyblk
Price = swaptionbyblk(RateSpec, OptSpec, Strike, SwaptionSettle, SwaptionExerciseDate, ...
SwapMaturity, SABRBlackVolatility, 'Reset', Reset)
Price = 14.2403

[1] Хейган, P. S. Кумар, D., Лесниевский, A. S. и лесничий, Д. Э., “управляя риском улыбки”, журнал Wilmott, 2002.

[2] Запад, G., “Калибровка Модели SABR на Неликвидных Рынках”, Прикладные Математические Финансы, 12 (4), стр 371–385, 2004.

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

| |

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

Больше о