В этом примере показано, как использовать два различных метода для калибровки модели стохастической волатильности SABR от рыночных подразумеваемых волатильностей Black. Оба подхода используют 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
) непосредственно. Функция 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
) подразумевается от рыночной волатильности денег. Модели, калиброванные с использованием этого метода, приводят к волатильности в деньгах, которая равна рыночным котировкам. Этот подход широко используется в свопционах, где волатильность в деньгах цитируется чаще всего и важна для соответствия. Подразумевать (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] Hagan, Patrick S., Deep Kumar, Andrew S. Lesniewski, and Diana E. Woodward. «Управление риском улыбки». Журнал Wilmott. (январь 2002 года): 84-108.
[2] Уэст, Грэм. Калибровка модели SABR на неликвидных рынках. Прикладные математические финансы. 12, № 4 (декабрь 2005 года): 371-385.