Оцените Swaption Используя и аналитический калькулятор цен модели SABR

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

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

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

Settle = datetime(2013, 6, 14);
ZeroDates = Settle + [calmonths([1 3 6]) calyears([1 2 3 4 5 6 7 8 9 10 12 15 20])]';
ZeroRates = [0.22 0.31 0.45 0.73 0.54 0.72 1.22 1.54 1.83 1.92 ...
    2.16 2.32 2.52 2.93 3.12 3.36]'/100;
ZeroCurve = ratecurve("zero",Settle,ZeroDates,ZeroRates,'Compounding',1);
ExerciseDates =  Settle + [calmonths(3) calyears([1 2 3 4 5 7 10])]';           
YearsToExercise = yearfrac(Settle,ExerciseDates,1);
NumMaturities = length(YearsToExercise);

MarketVolatilities = [ ...    
   56.5 52.7 49.1 44.9 43.5 40.5 34.8 32.2
   45.8 46.2 44.2 41.1 39.1 36.1 33.2 31.3
   34.7 38.8 39.0 37.2 36.8 33.2 30.1 28.1
   33.9 35.9 36.9 35.8 34.2 30.5 29.0 27.0
   40.8 41.2 38.6 37.0 35.3 32.0 29.5 26.5
   45.1 42.8 41.2 38.3 37.2 33.2 30.3 27.2
   50.2 45.4 43.2 39.9 38.0 34.1 31.5 28.3]/100;

MarketStrikes = [ ...
  1.02 1.31 1.78 2.08 2.21 2.34 2.60 2.69;
  1.52 1.81 2.28 2.58 2.71 2.84 3.10 3.19;
  2.02 2.31 2.78 3.08 3.21 3.34 3.60 3.69;
  2.52 2.81 3.28 3.58 3.71 3.84 4.10 4.19;
  3.02 3.31 3.78 4.08 4.21 4.34 4.60 4.69;
  3.52 3.81 4.28 4.58 4.71 4.84 5.10 5.19;
  4.02 4.31 4.78 5.08 5.21 5.34 5.60 5.69]/100;

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

    0.0252    0.0281    0.0328    0.0358    0.0371    0.0384    0.0410    0.0419

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

    0.3390    0.3590    0.3690    0.3580    0.3420    0.3050    0.2900    0.2700

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

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

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

% Define the predetermined Beta, calibrate SABR model parameters for each
% swaption maturity, and display the calibrated parameters in a table.  
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) - ...
    volatilities(finpricer("Analytic", 'Model', finmodel("SABR", ...
    'Alpha', atmVol2SabrAlpha(X(1), X(2)), 'Beta', Beta, 'Rho', X(1), 'Nu', X(2)), ...
    'DiscountCurve', ZeroCurve), 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

CalibratedParameters = 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'})
CalibratedParameters=8×4 table
                     Alpha      Beta      Rho         Nu   
                    ________    ____    ________    _______

    3M into 10Y     0.051895    0.5      0.40869     1.4054
    1Y into 10Y     0.054381    0.5      0.28066     1.1234
    2Y into 10Y     0.057325    0.5       0.2166    0.97407
    3Y into 10Y     0.057243    0.5      0.19837    0.82932
    4Y into 10Y     0.053387    0.5      0.17304    0.81441
    5Y into 10Y      0.04673    0.5      0.11618    0.80138
    7Y into 10Y     0.046986    0.5       0.1554    0.63377
    10Y into 10Y     0.04443    0.5     0.080169    0.52515

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

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

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

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

for k = 1:NumMaturities
    SABRModel = finmodel("SABR", ...
        'Alpha', Alphas(k), 'Beta', Betas(k), 'Rho', Rhos(k), 'Nu', Nus(k));
    
    ComputedVols(:,k) = volatilities(finpricer("Analytic", ...
        'Model', SABRModel, 'DiscountCurve', ZeroCurve), ...
        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 сроки платежа (годы, чтобы тренироваться). Это сопоставимо со значениями параметров Ню, имеющими тенденцию уменьшиться с swaption зрелостью, как показано в таблице для CalibratedParameters.

Шаг 4. Используйте SABR аналитический калькулятор цен, чтобы оценить swaption.

Используйте SABR аналитический калькулятор цен, чтобы оценить swaption, который назревает за пять лет. Во-первых, создайте базовый 10-летний инструмент подкачки, запускающийся через пять лет, и создайте Swaption инструмент для этого базового Swap. Затем создайте SABR модель для этого swaption, назревающего за пять лет, который используется для создания SABR аналитический калькулятор цен.

% Create the underlying 10-year swap starting in 5 years.
MaturityIdx = 6;
SwapStartDate = ExerciseDates(MaturityIdx);
SwapMaturity = SwapStartDate + calyears(10);
Swap = fininstrument("Swap", 'Maturity', SwapMaturity, ...
    'LegRate', [0 0], "LegType",["fixed" "float"],...
    "ProjectionCurve", ZeroCurve, "StartDate", SwapStartDate)
Swap = 
  Swap with properties:

                     LegRate: [0 0]
                     LegType: ["fixed"    "float"]
                       Reset: [2 2]
                       Basis: [0 0]
                    Notional: 100
          LatestFloatingRate: [NaN NaN]
                 ResetOffset: [0 0]
    DaycountAdjustedCashFlow: [0 0]
             ProjectionCurve: [1x2 ratecurve]
       BusinessDayConvention: ["actual"    "actual"]
                    Holidays: NaT
                EndMonthRule: [1 1]
                   StartDate: 14-Jun-2018
                    Maturity: 14-Jun-2028
                        Name: ""

% Create the swaption (for the underlying 10-year swap) maturing in five
% years.
SwaptionExerciseDate = SwapStartDate;
Reset = 1; 
OptSpec = 'call';
Strike = 0.0272;
Swaption = fininstrument("Swaption", 'Strike', Strike, ...
    'ExerciseDate', SwaptionExerciseDate, 'Swap', Swap, 'OptionType', OptSpec)
Swaption = 
  Swaption with properties:

       OptionType: "call"
    ExerciseStyle: "european"
     ExerciseDate: 14-Jun-2018
           Strike: 0.0272
             Swap: [1x1 fininstrument.Swap]
             Name: ""

% Create the SABR model for the swaption maturing in five years.
SABRModel = finmodel("SABR", ...
        'Alpha', Alphas(MaturityIdx), 'Beta', Betas(MaturityIdx), ...
        'Rho', Rhos(MaturityIdx), 'Nu', Nus(MaturityIdx))
SABRModel = 
  SABR with properties:

             Alpha: 0.0467
              Beta: 0.5000
               Rho: 0.1162
                Nu: 0.8014
             Shift: 0
    VolatilityType: "black"

% Create the SABR analytic pricer.
SABRPricer = finpricer("Analytic", 'Model', SABRModel, 'DiscountCurve', ZeroCurve)
SABRPricer = 
  SABR with properties:

    DiscountCurve: [1x1 ratecurve]
            Model: [1x1 finmodel.SABR]

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

CurrentForwardSwapRate = parswaprate(Swap,ZeroCurve)
CurrentForwardSwapRate = 0.0384

Затем вычислите подразумеваемую Черную энергозависимость SABR для этого Swaption при помощи volatilities функция, и это отмечено Красной стрелой на рисунке в нижней части.

SABRBlackVolatility = volatilities(SABRPricer, ...
         SwaptionExerciseDate, CurrentForwardSwapRate, Strike)
SABRBlackVolatility = 0.3665
text (YearsToExercise(MaturityIdx), Strike, SABRBlackVolatility, ...
    '\leftarrow', 'Color', 'r', 'FontWeight', 'bold', 'FontSize', 22);

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

Наконец, оцените swaption использование price функция SABR аналитический калькулятор цен.

SwaptionPrice = price(SABRPricer, Swaption)
SwaptionPrice = 13.0141

Ссылки

[1] Хейган, Патрик С., глубокий Кумар, Эндрю С. Лесниевский и Диана Э. Лесничий. "Управляя риском улыбки". Журнал Wilmott. (Январь 2002): 84–108.

[2] Запад, Грем. "Калибровка Модели SABR на Неликвидных Рынках". Прикладные Математические Финансы. 12, № 4 (декабрь 2005): 371–385.