То В этом примере показано, как использовать два различных метода, чтобы калибровать стохастическую модель энергозависимости SABR с рынка, подразумевало Нормальные колебания (Bachelier) с отрицательными забастовками. Оба подхода используют normalvolbysabr
, который вычисляет подразумеваемые Нормальные колебания при помощи модели SABR. Когда Beta
параметр модели SABR обнуляется, модель является моделью Normal SABR, которая позволяет вычислять подразумеваемые Нормальные колебания для отрицательных забастовок.
Настройте подразумеваемые Нормальные колебания гипотетического рынка для европейского swaptions в области значений забастовок перед калибровкой. swaptions истекают за один год от Settle
дата и имеет подкачки 2D года как базовый инструмент. Уровни выражаются в десятичных числах. Рынок подразумевал, что Нормальные колебания преобразованы от пунктов до десятичных чисел. (Изменение модулей влияет на численное значение и интерпретацию 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 (Нормальный 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]. Однако обратите внимание, что следующее выражение, которое используется в Нормальных колебаниях, отличается от другого выражения, которое используется в Черных колебаниях.
% 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] Хейган, P. S. Кумар, D., Лесниевский, A. S. и Лесничий, D. E. "Управляя риском улыбки". Журнал Wilmott, 2002.
[2] Запад, G. "Калибровка Модели SABR на Неликвидных Рынках". Прикладные Математические Финансы, 12 (4), стр 371–385, 2004.