exponenta event banner

Цена свопциона с использованием модели SABR

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

Шаг 1. Загрузить данные волатильности свопциона рынка.

Загрузка рынка подразумевала данные волатильности черного для свопционов.

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

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

Шаг 2. Откалибруйте параметры модели SABR для каждого срока погашения свопциона.

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

Определение заранее определенного Betaкалибровка параметров модели SABR для каждого срока погашения свопциона и отображение калиброванных параметров в таблице.

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. The axes contains an object of type surface.

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

Шаг 4. Использовать swaptionbyblk для оценки свопциона.

Используйте поверхность волатильности, чтобы оценить свопцион, который созревает через пять лет. Определение свопциона (для 10-летнего свопа), срок погашения которого составляет пять лет, и использование структуры срока процентной ставки во время свопциона Settle дата для определения RateSpec. Используйте RateSpec для вычисления текущей скорости прямого свопа с помощью swapbyzero функция. Вычислите волатильность черного для этого свопциона, подразумеваемую SABR, с использованием blackvolbysabr (и она отмечена красной стрелкой на следующем рисунке). Цена свопциона с использованием 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. The axes contains 2 objects of type surface, text.

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

[1] Хаган, П. С., Кумар, Д., Лесневски, А. С. и Вудворд, Д. Э., «Управление риском улыбки», журнал Wilmott, 2002.

[2] West, G., «Калибровка модели SABR на неликвидных рынках», Applied Mathematical Finance, 12 (4), pp. 371-385, 2004 .

См. также

| |

Связанные темы