Цена свопциона с помощью модели 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] Hagan, P. S., Kumar, D., Lesniewski, A. S. and Woodward, D. E., «Managing Smile Risk», Wilmott Magazine, 2002.

[2] West, G., «Calibration of the SABR Model in Illiquid Markets», Applied Mathematical Finance, 12 (4), pp. 371-385, 2004 .

См. также

| |

Похожие темы