В этом примере показано, как использовать два различных метода для калибровки модели стохастической волатильности SABR из рыночных подразумеваемых волатильностей черного. Оба подхода используют 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
Alpha, Rho, и Nu НепосредственноВы можете откалибровать Alpha, Rho, и Nu непосредственно параметры модели. Установка значения Beta либо путем подбора исторических данных о волатильности рынка, либо путем выбора стоимости, подходящей для рынка [1]. Для этого примера используйте значение 0.5.
% Define the predetermined Beta.
Beta1 = 0.5;После фиксации значения (Beta), подогнать параметры (Alpha), ρ (Rho), и (Nu) непосредственно. Функция 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) подразумевается из волатильности рынка в деньгах. Модели, откалиброванные с помощью этого метода, производят волатильность по цене, равную рыночным котировкам. Этот подход широко используется в свопционах, где волатильность по отношению к деньгам котируется чаще всего и имеет важное значение для сопоставления. Чтобы подразумевать (Alpha) от волатильности рынка в деньгах (« решается следующий кубический многочлен (Alpha), и выбирается наименьший положительный реальный корень [2].
α-startATMF (1-β) = 0
Здесь:
- текущее прямое значение
- доля года до погашения.
Подгонка параметров путем определения анонимной функции.
% 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] Хаган, Патрик С., Дип Кумар, Эндрю С. Лесневски и Диана Э. Вудворд. «Управление риском улыбки». Журнал Уилмотт. (январь 2002): 84-108.
[2] Уэст, Грэм. «Калибровка модели SABR на неликвидных рынках». Прикладное математическое финансирование. 12, № 4 (декабрь 2005 года): 371-385.