Калибровка модели SABR с помощью аналитического ценника

В этом примере показано, как использовать два различных метода для калибровки модели стохастической волатильности SABR от рыночных подразумеваемых волатильностей Black. Оба подхода используют SABR аналитический прайс.

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

Этот пример устанавливает гипотетический рынок, подразумевающий волатильность черных для европейских свопсов в ряде ударов перед калибровкой. Срок действия свопционов истекает через три года после Settle дата и иметь пятилетние свопы в качестве базового инструмента. Скорости выражены десятичными числами. (Изменение модулей влияет на числовое значение и интерпретацию Alpha параметр в SABR модель.)

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

Settle = datetime(2013, 7, 10);
ZeroDates = Settle + [calmonths([1 2 3 6 9]) calyears([1 2 3 4 5 6 7 8 9 10 12])]';
ZeroRates = [0.25 0.3 0.33 0.42 0.8 0.9 1.1 1.2 ...
    1.8 2.2 2.4 2.71 2.95 3.02 3.24 3.58]'/100;
Compounding = 1;
ZeroCurve = ratecurve("zero",Settle,ZeroDates,ZeroRates,'Compounding',Compounding);
ExerciseDate = datetime(2016, 7, 10);
MarketStrikes = [2.46 2.96 3.46 3.96 4.46 4.96 5.46]'/100;
MarketVolatilities = [44.3 40.2 36.7 35.7 37.2 38.1 39.8]'/100;

Во время Settle, определить базовую форвардную ставку и волатильность в деньгах.

CurrentForwardValue = MarketStrikes(4)
CurrentForwardValue = 0.0396
ATMVolatility = MarketVolatilities(4)
ATMVolatility = 0.3570

Метод 1: Калибровка Alpha, Rho, и Nu Непосредственно

Можно калибровать Alpha, Rho, и Nu моделировать параметры непосредственно. Установите значение Beta путем подгонки исторических данных о волатильности рынка или путем выбора значения, подходящего для рынка [1]. В данном примере используйте значение 0.5.

% Define the predetermined Beta.
Beta1 = 0.5;

После фиксации значения β (Beta), под параметры α (Alpha), ρ (Rho), и ν (Nu) непосредственно. Функция Optimization Toolbox™ lsqnonlin генерирует значения параметров, которые минимизируют квадратичную невязку между волатильностями рынка и волатильностями, вычисленными SABR аналитический прайс.

% Calibrate Alpha, Rho, and Nu.
objFun = @(X) MarketVolatilities - ...
    volatilities(finpricer("Analytic", 'Model', ...
    finmodel("SABR", 'Alpha', X(1), 'Beta', Beta1, 'Rho', X(2), 'Nu', X(3)), ...
    'DiscountCurve', ZeroCurve), ExerciseDate, CurrentForwardValue, MarketStrikes);

X = lsqnonlin(objFun, [0.5 0 0.5], [0 -1 0], [Inf 1 Inf]);
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
Alpha1 = X(1);
Rho1 = X(2);
Nu1 = X(3);

Метод 2: Калибровка Rho и Nu путем подразумевания Альфа от волатильности в деньгах

Можно также использовать альтернативный метод калибровки. Установите значение β (Beta) как в первом методе.

Beta2 = 0.5;

Далее вы подбираете параметры ρ (Rho) и ν (Nu) непосредственно в то время как α (Alpha) подразумевается от рыночной волатильности денег. Модели, калиброванные с использованием этого метода, приводят к волатильности в деньгах, которая равна рыночным котировкам. Этот подход широко используется в свопционах, где волатильность в деньгах цитируется чаще всего и важна для соответствия. Подразумевать α (Alpha) от рыночной волатильности денег (σATM), следующий кубический полином решен для α (Alpha), и выбирается наименьший положительный действительный корень [2].

(1-β)2T24F(2-2β)α3+ρβνT4F(1-β)α2+(1+2-3ρ224ν2T)α-σATMF(1-β)=0

Здесь:

F - текущее прямое значение

T - доля года до погашения.

Подгонка параметров путем определения анонимной функции.

% Year fraction from Settle to option maturity.
T = yearfrac(Settle, ExerciseDate, 1);

% This function solves the SABR at-the-money volatility equation as a
% polynomial of Alpha. 
alpharoots = @(Rho,Nu) roots([...
    (1 - Beta2)^2*T/24/CurrentForwardValue^(2 - 2*Beta2) ...
    Rho*Beta2*Nu*T/4/CurrentForwardValue^(1 - Beta2) ...
    (1 + (2 - 3*Rho^2)*Nu^2*T/24) ...
    -ATMVolatility*CurrentForwardValue^(1 - Beta2)]);

% 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))));

Функция atmVol2SabrAlpha преобразует волатильность в деньгах в α (Alpha) для заданного набора ρ (Rho) и ν (Nu). Эта функция затем используется в целевой функции, чтобы соответствовать параметрам ρ (Rho) и ν (Nu).

% Calibrate Rho and Nu (while converting at-the-money volatility into Alpha
% using atmVol2SabrAlpha).

objFun = @(X) MarketVolatilities - ...
    volatilities(finpricer("Analytic", 'Model', finmodel("SABR", ...
    'Alpha', atmVol2SabrAlpha(X(1), X(2)), 'Beta', Beta2, 'Rho', X(1), 'Nu', X(2)), ...
    'DiscountCurve', ZeroCurve), ExerciseDate, CurrentForwardValue, MarketStrikes);

X = lsqnonlin(objFun, [0 0.5], [-1 0], [1 Inf]);
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
Rho2 = X(1);
Nu2 = X(2);

Калиброванный параметр α (Alpha) вычисляется с помощью калиброванных параметров ρ (Rho) и ν (Nu).

% Obtain final Alpha from at-the-money volatility using calibrated
% parameters.
Alpha2 = atmVol2SabrAlpha(Rho2, Nu2);

% Display calibrated parameters.
C = {Alpha1 Beta1 Rho1 Nu1;Alpha2 Beta2 Rho2 Nu2};
CalibratedPrameters = cell2table(C,...
    'VariableNames',{'Alpha' 'Beta' 'Rho' 'Nu'},...
    'RowNames',{'Method 1';'Method 2'})
CalibratedPrameters=2×4 table
                 Alpha      Beta      Rho        Nu   
                ________    ____    _______    _______

    Method 1    0.060203    0.5     0.19131    0.85327
    Method 2    0.058851    0.5     0.18901    0.88627

Использование калиброванных моделей

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

Вычислите летучесть для моделей, калиброванных с помощью Метода 1 и Метода 2, и постройте график результатов.

PlottingStrikes = (1.75:0.1:5.50)'/100;

% Compute volatilities for model calibrated by Method 1.
SABR_Model_Method_1 = finmodel("SABR", ...
    'Alpha', Alpha1, 'Beta', Beta1, 'Rho', Rho1, 'Nu', Nu1);

ComputedVols1 = volatilities(finpricer("Analytic", ...
    'Model', SABR_Model_Method_1, 'DiscountCurve', ZeroCurve), ...
    ExerciseDate, CurrentForwardValue, PlottingStrikes);

% Compute volatilities for model calibrated by Method 2.
SABR_Model_Method_2 = finmodel("SABR", ...
    'Alpha', Alpha2, 'Beta', Beta2, 'Rho', Rho2, 'Nu', Nu2);

ComputedVols2 = volatilities(finpricer("Analytic", ...
    'Model', SABR_Model_Method_2, 'DiscountCurve', ZeroCurve), ...
    ExerciseDate, CurrentForwardValue, PlottingStrikes);

figure;
plot(MarketStrikes,MarketVolatilities,'xk',...
    PlottingStrikes,ComputedVols1,'b', ...
    PlottingStrikes,ComputedVols2,'r', ...
    CurrentForwardValue,ATMVolatility,'ok',...
    'MarkerSize',10);
xlim([0.01 0.06]);
ylim([0.35 0.5]);
xlabel('Strike', 'FontWeight', 'bold');
ylabel('Implied Black Volatility', 'FontWeight', 'bold');
legend('Market Volatilities', 'SABR Model (Method 1)',...
    'SABR Model (Method 2)', 'At-the-money volatility');

Figure contains an axes. The axes contains 4 objects of type line. These objects represent Market Volatilities, SABR Model (Method 1), SABR Model (Method 2), At-the-money volatility.

Модель, калиброванная с использованием Метода 2, точно воспроизводит волатильность рынка на деньгах (отмеченная кругом).

Ссылки

[1] Hagan, Patrick S., Deep Kumar, Andrew S. Lesniewski, and Diana E. Woodward. «Управление риском улыбки». Журнал Wilmott. (январь 2002 года): 84-108.

[2] Уэст, Грэм. Калибровка модели SABR на неликвидных рынках. Прикладные математические финансы. 12, № 4 (декабрь 2005 года): 371-385.