В этом примере показано, как использовать два различных метода для калибровки модели стохастической волатильности SABR из рыночных подразумеваемых волатильностей Normal (Bachelier) с отрицательными ударами. Оба подхода используют normalvolbysabr
, который вычисляет подразумеваемые волатильности Normal с помощью модели 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
) все устанавливаются непосредственно. Функция Optimization 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
) от рынка на деньги Нормальная волатильность (), следующий кубический полином решен для (Alpha
), и выбирается наименьший положительный действительный корень. Это аналогично подходу, используемому для подразумевания (Alpha
) с рынка на деньги Черная волатильность [2]. Однако обратите внимание, что следующее выражение, которое используется для Normal volatilities, отличается от другого выражения, которое используется для Black volatilities.
% 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] West, G. «Калибровка модели SABR на неликвидных рынках». Прикладные математические финансы, 12 (4), стр. 371-385, 2004.