То В этом примере показано, как использовать два различных метода, чтобы калибровать стохастическую модель энергозависимости SABR с рынка, подразумевало Черные колебания. Оба подхода используют SABR
аналитический калькулятор цен.
Этот пример настраивает подразумеваемые Черные колебания гипотетического рынка для европейского swaptions в области значений забастовок перед калибровкой. swaptions истекают за три года от Settle
дата и имеет пятилетние подкачки как базовый инструмент. Уровни описываются в десятичных числах. (Изменение модулей влияет на численное значение и интерпретацию Alpha
параметр в SABR
модель.)
Загрузите подразумеваемые Черные данные об энергозависимости рынка для swaptions, истекающего за три года.
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
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);
Можно также использовать альтернативный калибровочный метод. Установите значение \beta
) как в первом методе.
Beta2 = 0.5;
Затем вы соответствуете параметрам \rho
) и \nu
) непосредственно, в то время как \alpha
) подразумевается с рынка энергозависимость в деньгах. Калиброванное использование моделей этого метода производит колебания в деньгах, которые равны рыночным котировкам. Этот подход широко используется в swaptions, где колебания в деньгах заключаются в кавычки наиболее часто и важны для соответствия. Подразумевать \alpha
) с рынка энергозависимость в деньгах (), следующий кубический полином решен для \alpha
), и самый маленький положительный действительный корень выбран [2].
Здесь:
текущее прямое значение
часть года к зрелости.
Соответствуйте параметрам путем определения анонимной функции.
% 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');
Модель, калиброванная с помощью Метода 2, воспроизводит рынок энергозависимость в деньгах (отмеченный кругом) точно.
[1] Хейган, Патрик С., глубокий Кумар, Эндрю С. Лесниевский и Диана Э. Лесничий. "Управляя риском улыбки". Журнал Wilmott. (Январь 2002): 84–108.
[2] Запад, Грем. "Калибровка Модели SABR на Неликвидных Рынках". Прикладные Математические Финансы. 12, № 4 (декабрь 2005): 371–385.