В этом примере показано, как использовать два различных метода для калибровки модели стохастической волатильности SABR из рыночных подразумеваемых волатильностей Normal (Bachelier) с негативными ударами. Использование обоих подходов normalvolbysabr, которая вычисляет подразумеваемые нормальные волатильности с использованием модели SABR. Когда Beta параметр модели SABR равен нулю, модель является моделью Normal SABR, которая позволяет вычислить подразумеваемые летучести Normal для отрицательных ударов.
Настройка гипотетического рынка подразумевала нормальные волатильности для европейских свопционов в диапазоне ударов перед калибровкой. Свопции истекают через один год с Settle дата и иметь двухлетние свопы в качестве базового инструмента. Ставки выражаются в десятичных разрядах. Рынок подразумевал, что нормальные волатильности преобразуются из базисных пунктов в десятичные. (Изменение единиц измерения влияет на числовое значение и интерпретацию Alpha ввод параметра в функцию normalvolbysabr.)
% Load the market implied Normal volatility data for swaptions expiring in one year. Settle = '20-Sep-2017'; ExerciseDate = '20-Sep-2018'; Basis = 1; ATMStrike = -0.174/100; MarketStrikes = ATMStrike + ((-0.5:0.25:1.5)')./100; MarketVolatilities = [20.58 17.64 16.93 18.01 20.46 22.90 26.11 28.89 31.91]'/10000; % At the time of Settle, define the underlying forward rate and the at-the-money volatility. CurrentForwardValue = MarketStrikes(3)
CurrentForwardValue = -0.0017
ATMVolatility = MarketVolatilities(3)
ATMVolatility = 0.0017
Alpha, Rho, и Nu НепосредственноВ этом разделе показано, как откалибровать Alpha, Rho, и Nu непосредственно параметры. Значение Beta параметр устанавливается равным нулю, чтобы разрешить отрицательные скорости в модели SABR (Normal SABR). После фиксации значения (Beta), параметры (Alpha), ρ (Rho), и (Nu) все устанавливаются непосредственно. Функция Toolbox™ оптимизации lsqnonlin генерирует значения параметров, которые минимизируют квадрат ошибки между волатильностью рынка и волатильностью, вычисленной normalvolbysabr.
% Define the predetermined Beta Beta1 = 0; % Setting Beta to zero allows negative rates for Normal volatilities % Calibrate Alpha, Rho, and Nu objFun = @(X) MarketVolatilities - ... normalvolbysabr(X(1), Beta1, X(2), X(3), Settle, ... ExerciseDate, CurrentForwardValue, MarketStrikes, 'Basis', Basis); % If necessary, tolerances and stopping criteria can be adjusted for lsqnonlin X = lsqnonlin(objFun, [ATMVolatility 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);
Rho и Nu подразумевая Alpha от волатильности в деньгахВ этом разделе показано, как использовать альтернативный способ калибровки, в котором значение снова предопределено равным нулю, чтобы разрешить отрицательные скорости. Однако после фиксации значения (Beta), параметры (Rho), и (Nu) устанавливаются непосредственно при (Alpha) подразумевается из волатильности рынка в деньгах. Модели, откалиброванные с помощью этого метода, производят волатильность по цене, равную рыночным котировкам. Этот подход может быть полезен в тех случаях, когда волатильность в денежном выражении котируется чаще всего и имеет важное значение для сопоставления. Для того, чтобы подразумевать (Alpha) из рыночной at-the-money Нормальной волатильности (ATM) для α решается следующий кубический многочлен (Alpha), и выбирается наименьший положительный реальный корень. Это похоже на подход, используемый для подразумевания (Alpha) от рыночной волатильности черного [2]. Однако следует отметить, что следующее выражение, которое используется для нормальных летучих веществ, отличается от другого выражения, которое используется для летучих веществ черного цвета.
α-startНормальный, ATMF-β = 0
% Define the predetermined Beta Beta2 = 0; % Setting Beta to zero allows negative rates for Normal volatilities % Year fraction from Settle to option maturity T = yearfrac(Settle, ExerciseDate, Basis); % This function solves the SABR at-the-money volatility equation as a % polynomial of Alpha alpharootsNormal = @(Rho,Nu) roots([... Beta2.*(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^(-Beta2)]); % This function converts at-the-money volatility into Alpha by picking the % smallest positive real root atmNormalVol2SabrAlpha = @(Rho,Nu) min(real(arrayfun(@(x) ... x*(x>0) + realmax*(x<0 || abs(imag(x))>1e-6), alpharootsNormal(Rho,Nu)))); % Calibrate Rho and Nu (while converting at-the-money volatility into Alpha % using atmVol2NormalSabrAlpha) objFun = @(X) MarketVolatilities - ... normalvolbysabr(atmNormalVol2SabrAlpha(X(1), X(2)), ... Beta2, X(1), X(2), Settle, ExerciseDate, CurrentForwardValue, ... MarketStrikes, 'Basis', Basis); % If necessary, tolerances and stopping criteria can be adjusted for lsqnonlin 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); % Obtain final Alpha from at-the-money volatility using calibrated parameters Alpha2 = atmNormalVol2SabrAlpha(Rho2, Nu2); % Display calibrated parameters C = {Alpha1 Beta1 Rho1 Nu1;Alpha2 Beta2 Rho2 Nu2}; format; CalibratedPrameters = cell2table(C,... 'VariableNames',{'Alpha' 'Beta' 'Rho' 'Nu'},... 'RowNames',{'Method 1';'Method 2'})
CalibratedPrameters=2×4 table
Alpha Beta Rho Nu
_________ ____ _________ _______
Method 1 0.0016332 0 -0.034233 0.45877
Method 2 0.0016652 0 -0.0318 0.44812
Используйте калиброванные модели для вычисления новых волатильностей при любом значении удара, включая отрицательные удары.
Вычислите летучесть для моделей, откалиброванных с использованием метода 1 и метода 2, а затем постройте график результатов. Модель, откалиброванная с помощью метода 2, точно воспроизводит волатильность рынка в деньгах (помечена кругом).
PlottingStrikes = (min(MarketStrikes)-0.0025:0.0001:max(MarketStrikes)+0.0025)'; % Compute volatilities for model calibrated by Method 1 ComputedVols1 = normalvolbysabr(Alpha1, Beta1, Rho1, Nu1, Settle, ... ExerciseDate, CurrentForwardValue, PlottingStrikes, 'Basis', Basis); % Compute volatilities for model calibrated by Method 2 ComputedVols2 = normalvolbysabr(Alpha2, Beta2, Rho2, Nu2, Settle, ... ExerciseDate, CurrentForwardValue, PlottingStrikes, 'Basis', Basis); figure; plot(MarketStrikes,MarketVolatilities*10000,'xk',... PlottingStrikes,ComputedVols1*10000,'b', ... PlottingStrikes,ComputedVols2*10000,'r', ... CurrentForwardValue,ATMVolatility*10000,'ok',... 'MarkerSize',10); h = gca; line([0,0],[min(h.YLim),max(h.YLim)],'LineStyle','--'); xlabel('Strike', 'FontWeight', 'bold'); ylabel('Implied Normal Volatility (bps)', 'FontWeight', 'bold'); legend('Market Volatilities', 'Normal SABR Model (Method 1)', ... 'Normal SABR Model (Method 2)', 'At-the-money volatility', ... 'Location', 'northwest');

[1] Хаган, П. С., Кумар, Д., Лесневски, А. С. и Вудворд, Д. Е. «Управление риском улыбки». Wilmott Magazine, 2002.
[2] Запад, Г. «Калибровка модели SABR на неликвидных рынках». Прикладное математическое финансирование, 12 (4), стр. 371-385, 2004.