В этом примере показано, как оценить свопцион с помощью SABR модель. Во-первых, вы строите поверхность волатильности свопциона из волатильности рынка путем калибровки SABR параметры модели отдельно для каждого срока погашения свопциона с использованием SABR аналитический прайсер. Затем вычисляется цена свопциона с помощью подразумеваемой волатильности черного на поверхности с помощью SABR аналитический прайсер.
Загрузить нулевую кривую и рыночные подразумевали данные волатильности черного для свопционов.
Settle = datetime(2013, 6, 14); ZeroDates = Settle + [calmonths([1 3 6]) calyears([1 2 3 4 5 6 7 8 9 10 12 15 20])]'; ZeroRates = [0.22 0.31 0.45 0.73 0.54 0.72 1.22 1.54 1.83 1.92 ... 2.16 2.32 2.52 2.93 3.12 3.36]'/100; ZeroCurve = ratecurve("zero",Settle,ZeroDates,ZeroRates,'Compounding',1); ExerciseDates = Settle + [calmonths(3) calyears([1 2 3 4 5 7 10])]'; YearsToExercise = yearfrac(Settle,ExerciseDates,1); NumMaturities = length(YearsToExercise); MarketVolatilities = [ ... 56.5 52.7 49.1 44.9 43.5 40.5 34.8 32.2 45.8 46.2 44.2 41.1 39.1 36.1 33.2 31.3 34.7 38.8 39.0 37.2 36.8 33.2 30.1 28.1 33.9 35.9 36.9 35.8 34.2 30.5 29.0 27.0 40.8 41.2 38.6 37.0 35.3 32.0 29.5 26.5 45.1 42.8 41.2 38.3 37.2 33.2 30.3 27.2 50.2 45.4 43.2 39.9 38.0 34.1 31.5 28.3]/100; MarketStrikes = [ ... 1.02 1.31 1.78 2.08 2.21 2.34 2.60 2.69; 1.52 1.81 2.28 2.58 2.71 2.84 3.10 3.19; 2.02 2.31 2.78 3.08 3.21 3.34 3.60 3.69; 2.52 2.81 3.28 3.58 3.71 3.84 4.10 4.19; 3.02 3.31 3.78 4.08 4.21 4.34 4.60 4.69; 3.52 3.81 4.28 4.58 4.71 4.84 5.10 5.19; 4.02 4.31 4.78 5.08 5.21 5.34 5.60 5.69]/100; CurrentForwardValues = MarketStrikes(4,:)
CurrentForwardValues = 1×8
0.0252 0.0281 0.0328 0.0358 0.0371 0.0384 0.0410 0.0419
ATMVolatilities = MarketVolatilities(4,:)
ATMVolatilities = 1×8
0.3390 0.3590 0.3690 0.3580 0.3420 0.3050 0.2900 0.2700
Текущие базовые форвардные ставки и соответствующие волатильности по отношению к деньгам по восьми срокам свопциона представлены в четвертых строках двух матриц.
При использовании статического SABR модель, где предполагается, что параметры модели постоянны по времени, параметры калибруются отдельно для каждого срока свопциона (годы для упражнения) в for шлейф с использованием SABR аналитический прайсер. Чтобы лучше представлять волатильность рынка в деньгах, Alpha значения параметров подразумеваются волатильностью рыночных денежных средств (подробнее см. Метод 2 в разделе Калибровка модели SABR с использованием аналитической цены).
% Define the predetermined Beta, calibrate SABR model parameters for each % swaption maturity, and display the calibrated parameters in a table. Beta = 0.5; Betas = repmat(Beta, NumMaturities, 1); Alphas = zeros(NumMaturities, 1); Rhos = zeros(NumMaturities, 1); Nus = zeros(NumMaturities, 1); options = optimoptions('lsqnonlin','Display','none'); for k = 1:NumMaturities % This function solves the SABR at-the-money volatility equation as a % polynomial of Alpha. alpharoots = @(Rho,Nu) roots([... (1 - Beta)^2*YearsToExercise(k)/24/CurrentForwardValues(k)^(2 - 2*Beta) ... Rho*Beta*Nu*YearsToExercise(k)/4/CurrentForwardValues(k)^(1 - Beta) ... (1 + (2 - 3*Rho^2)*Nu^2*YearsToExercise(k)/24) ... -ATMVolatilities(k)*CurrentForwardValues(k)^(1 - Beta)]); % 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)))); % Fit Rho and Nu (while converting at-the-money volatility into Alpha). objFun = @(X) MarketVolatilities(:,k) - ... volatilities(finpricer("Analytic", 'Model', finmodel("SABR", ... 'Alpha', atmVol2SabrAlpha(X(1), X(2)), 'Beta', Beta, 'Rho', X(1), 'Nu', X(2)), ... 'DiscountCurve', ZeroCurve), ExerciseDates(k), CurrentForwardValues(k), MarketStrikes(:,k)); X = lsqnonlin(objFun, [0 0.5], [-1 0], [1 Inf], options); Rho = X(1); Nu = X(2); % Get final Alpha from the calibrated parameters. Alpha = atmVol2SabrAlpha(Rho, Nu); Alphas(k) = Alpha; Rhos(k) = Rho; Nus(k) = Nu; end CalibratedParameters = array2table([Alphas Betas Rhos Nus],... 'VariableNames',{'Alpha' 'Beta' 'Rho' 'Nu'},... 'RowNames',{'3M into 10Y';'1Y into 10Y';... '2Y into 10Y';'3Y into 10Y';'4Y into 10Y';... '5Y into 10Y';'7Y into 10Y';'10Y into 10Y'})
CalibratedParameters=8×4 table
Alpha Beta Rho Nu
________ ____ ________ _______
3M into 10Y 0.051895 0.5 0.40869 1.4054
1Y into 10Y 0.054381 0.5 0.28066 1.1234
2Y into 10Y 0.057325 0.5 0.2166 0.97407
3Y into 10Y 0.057243 0.5 0.19837 0.82932
4Y into 10Y 0.053387 0.5 0.17304 0.81441
5Y into 10Y 0.04673 0.5 0.11618 0.80138
7Y into 10Y 0.046986 0.5 0.1554 0.63377
10Y into 10Y 0.04443 0.5 0.080169 0.52515
Использовать откалиброванный SABR модель для расчета новых волатильностей при любом значении страйка, чтобы создать гладкую улыбку для данного срока погашения. Это может повторяться для каждого срока погашения с образованием поверхности летучести.
Вычислите волатильность с использованием калиброванных моделей для каждого срока погашения и постройте график поверхности волатильности.
PlottingStrikes = (0.95:0.1:5.8)'/100; ComputedVols = zeros(length(PlottingStrikes), NumMaturities); for k = 1:NumMaturities SABRModel = finmodel("SABR", ... 'Alpha', Alphas(k), 'Beta', Betas(k), 'Rho', Rhos(k), 'Nu', Nus(k)); ComputedVols(:,k) = volatilities(finpricer("Analytic", ... 'Model', SABRModel, 'DiscountCurve', ZeroCurve), ... ExerciseDates(k), CurrentForwardValues(k), PlottingStrikes); end figure; surf(YearsToExercise, PlottingStrikes, ComputedVols); xlim([0 10]); ylim([0.0095 0.06]); zlim([0.2 0.8]); view(113,32); set(gca, 'Position', [0.13 0.11 0.775 0.815], ... 'PlotBoxAspectRatioMode', 'manual'); xlabel('Years to exercise', 'Fontweight', 'bold'); ylabel('Strike', 'Fontweight', 'bold'); zlabel('Implied Black volatility', 'Fontweight', 'bold');

Обратите внимание, что на этой поверхности волатильности улыбки, как правило, становятся более плоскими для более длительных сроков свопциона (годы для упражнений). Это согласуется со значениями параметра Nu, которые имеют тенденцию к снижению со сроком погашения свопциона, как показано в таблице для CalibratedParameters.
SABR аналитический прайсер для оценки свопциона.Используйте SABR аналитический прайсер для оценки свопциона, который созревает через пять лет. Во-первых, создайте базовый 10-летний инструмент свопа, начиная с пяти лет, и создайте Swaption инструмент для этого базового Swap. Затем создайте SABR модель для этого свопциона со сроком погашения через пять лет, которая используется для создания SABR аналитический прайсер.
% Create the underlying 10-year swap starting in 5 years. MaturityIdx = 6; SwapStartDate = ExerciseDates(MaturityIdx); SwapMaturity = SwapStartDate + calyears(10); Swap = fininstrument("Swap", 'Maturity', SwapMaturity, ... 'LegRate', [0 0], "LegType",["fixed" "float"],... "ProjectionCurve", ZeroCurve, "StartDate", SwapStartDate)
Swap =
Swap with properties:
LegRate: [0 0]
LegType: ["fixed" "float"]
Reset: [2 2]
Basis: [0 0]
Notional: 100
LatestFloatingRate: [NaN NaN]
ResetOffset: [0 0]
DaycountAdjustedCashFlow: [0 0]
ProjectionCurve: [1x2 ratecurve]
BusinessDayConvention: ["actual" "actual"]
Holidays: NaT
EndMonthRule: [1 1]
StartDate: 14-Jun-2018
Maturity: 14-Jun-2028
Name: ""
% Create the swaption (for the underlying 10-year swap) maturing in five % years. SwaptionExerciseDate = SwapStartDate; Reset = 1; OptSpec = 'call'; Strike = 0.0272; Swaption = fininstrument("Swaption", 'Strike', Strike, ... 'ExerciseDate', SwaptionExerciseDate, 'Swap', Swap, 'OptionType', OptSpec)
Swaption =
Swaption with properties:
OptionType: "call"
ExerciseStyle: "european"
ExerciseDate: 14-Jun-2018
Strike: 0.0272
Swap: [1x1 fininstrument.Swap]
Name: ""
% Create the SABR model for the swaption maturing in five years. SABRModel = finmodel("SABR", ... 'Alpha', Alphas(MaturityIdx), 'Beta', Betas(MaturityIdx), ... 'Rho', Rhos(MaturityIdx), 'Nu', Nus(MaturityIdx))
SABRModel =
SABR with properties:
Alpha: 0.0467
Beta: 0.5000
Rho: 0.1162
Nu: 0.8014
Shift: 0
VolatilityType: "black"
% Create the SABR analytic pricer. SABRPricer = finpricer("Analytic", 'Model', SABRModel, 'DiscountCurve', ZeroCurve)
SABRPricer =
SABR with properties:
DiscountCurve: [1x1 ratecurve]
Model: [1x1 finmodel.SABR]
Чтобы визуализировать подразумеваемую волатильность черного, используемую при ценообразовании свопциона, сначала вычислите текущую ставку форвардного свопа с помощью parswaprate функция.
CurrentForwardSwapRate = parswaprate(Swap,ZeroCurve)
CurrentForwardSwapRate = 0.0384
Затем вычислите волатильность черного цвета, подразумеваемую SABR, для этого Swaption с помощью volatilities и она отмечена красной стрелкой на рисунке внизу.
SABRBlackVolatility = volatilities(SABRPricer, ...
SwaptionExerciseDate, CurrentForwardSwapRate, Strike)SABRBlackVolatility = 0.3665
text (YearsToExercise(MaturityIdx), Strike, SABRBlackVolatility, ... '\leftarrow', 'Color', 'r', 'FontWeight', 'bold', 'FontSize', 22);

Наконец, оцените свопцион с помощью price функции SABR аналитический прайсер.
SwaptionPrice = price(SABRPricer, Swaption)
SwaptionPrice = 13.0141
[1] Хаган, Патрик С., Дип Кумар, Эндрю С. Лесневски и Диана Э. Вудворд. «Управление риском улыбки». Журнал Уилмотт. (январь 2002): 84-108.
[2] Уэст, Грэм. «Калибровка модели SABR на неликвидных рынках». Прикладное математическое финансирование. 12, № 4 (декабрь 2005 года): 371-385.