В этом примере показано, как оценить свопцион с помощью модели SABR. Во-первых, поверхность свапсионной волатильности строится из волатильности рынка. Это осуществляется путем калибровки параметров модели SABR отдельно для каждой зрелости свопциона. Цена свопциона затем вычисляется путем использования подразумеваемой волатильности черного цвета на поверхности в качестве входов для swaptionbyblk
функция.
Загрузка рынка подразумевается Черные данные волатильности для своптионов.
Settle = '12-Jun-2013'; ExerciseDates = {'12-Sep-2013';'12-Jun-2014';'12-Jun-2015';... '12-Jun-2016';'12-Jun-2017';'12-Jun-2018';'12-Jun-2020';... '12-Jun-2023'}; YearsToExercise = yearfrac(Settle, ExerciseDates, 1); NumMaturities = length(YearsToExercise); MarketVolatilities = [ ... 57.6 53.7 49.4 45.6 44.1 41.1 35.2 32.0 46.6 46.9 44.8 41.6 39.8 37.4 33.4 31.0 35.9 39.3 39.6 37.9 37.2 34.7 30.5 28.9 34.1 36.5 37.8 36.6 35.0 31.9 28.1 26.6 41.0 41.3 39.5 37.8 36.0 32.6 29.0 26.0 45.8 43.4 41.9 39.2 36.9 33.2 29.6 26.3 50.3 46.9 44.0 40.0 37.5 33.8 30.2 27.3]/100; MarketStrikes = [ ... 1.00 1.25 1.68 2.00 2.26 2.41 2.58 2.62; 1.50 1.75 2.18 2.50 2.76 2.91 3.08 3.12; 2.00 2.25 2.68 3.00 3.26 3.41 3.58 3.62; 2.50 2.75 3.18 3.50 3.76 3.91 4.08 4.12; 3.00 3.25 3.68 4.00 4.26 4.41 4.58 4.62; 3.50 3.75 4.18 4.50 4.76 4.91 5.08 5.12; 4.00 4.25 4.68 5.00 5.26 5.41 5.58 5.62]/100; CurrentForwardValues = MarketStrikes(4,:)
CurrentForwardValues = 1×8
0.0250 0.0275 0.0318 0.0350 0.0376 0.0391 0.0408 0.0412
ATMVolatilities = MarketVolatilities(4,:)
ATMVolatilities = 1×8
0.3410 0.3650 0.3780 0.3660 0.3500 0.3190 0.2810 0.2660
Текущие базовые форвардные ставки и соответствующие волатильности по деньгам через восемь сроков своптирования представлены в четвертых строках двух матриц.
Использование модели, реализованной в функции blackvolbysabr
, статическая модель SABR, где параметры модели приняты постоянными относительно времени, параметры калибруются отдельно для каждого срока свопции (годы для упражнений) в for
цикл. Чтобы лучше представлять волатильность рынка на деньгах, Alpha
значения параметров подразумеваются рыночной волатильностью по цене (см. «Метод 2» для калибровки модели SABR).
Задайте предопределенную Beta
, калибруйте параметры модели SABR для каждой зрелости свопции и отобразите калиброванные параметры в таблице.
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) - ... blackvolbysabr(atmVol2SabrAlpha(X(1), X(2)), ... Beta, X(1), X(2), Settle, 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 CalibratedPrameters = 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'})
CalibratedPrameters=8×4 table
Alpha Beta Rho Nu
________ ____ ________ _______
3M into 10Y 0.051947 0.5 0.39572 1.4146
1Y into 10Y 0.054697 0.5 0.2955 1.1257
2Y into 10Y 0.058433 0.5 0.24175 0.93463
3Y into 10Y 0.058484 0.5 0.20568 0.79647
4Y into 10Y 0.056054 0.5 0.13685 0.76993
5Y into 10Y 0.051072 0.5 0.060285 0.73595
7Y into 10Y 0.04475 0.5 0.083385 0.66341
10Y into 10Y 0.044548 0.5 0.02261 0.49487
Используйте калиброванную модель для вычисления новых волатильностей при любом значении удара, чтобы получить плавную улыбку для заданной зрелости. Это может быть повторено для каждой зрелости, чтобы сформировать поверхность волатильности
Вычислите волатильности с помощью калиброванных моделей для каждой зрелости и постройте график поверхности волатильности.
PlottingStrikes = (0.95:0.1:5.8)'/100; ComputedVols = zeros(length(PlottingStrikes), NumMaturities); for k = 1:NumMaturities ComputedVols(:,k) = blackvolbysabr(Alphas(k), Betas(k), Rhos(k), Nus(k), Settle, ... 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
значения параметров, стремящиеся уменьшаться со зрелостью свопциона, как показано ранее в таблице для CalibratedPrameters
.
swaptionbyblk
для ценообразования свопциона.Используйте поверхность волатильности, чтобы оценить свопцион, который созревает через пять лет. Определите свопцион (для 10-летнего свопа), срок погашения которого истекает через пять лет, и используйте структуру срока процентной ставки на момент свопциона Settle
дата для определения RateSpec
. Используйте RateSpec
для вычисления текущей скорости прямого свопа с помощью swapbyzero
функция. Вычислите SABR-подразумеваемую волатильность черного цвета для этого свопциона, используя blackvolbysabr
функция (и она помечается красной стрелой на следующем рисунке). Оцените свопцию, используя SABR подразумеваемую волатильность черного цвета в качестве входов swaptionbyblk
функция.
% Define the swaption SwaptionSettle = '12-Jun-2013'; SwaptionExerciseDate = '12-Jun-2018'; SwapMaturity = '12-Jun-2028'; Reset = 1; OptSpec = 'call'; Strike = 0.0263; % Define RateSpec ValuationDate = '12-Jun-2013'; EndDates = {'12-Jul-2013';'12-Sep-2013';'12-Dec-2013';'12-Jun-2014';... '12-Jun-2015';'12-Jun-2016';'12-Jun-2017';'12-Jun-2018';... '12-Jun-2019';'12-Jun-2020';'12-Jun-2021';'12-Jun-2022';... '12-Jun-2023';'12-Jun-2025';'12-Jun-2028';'12-Jun-2033'}; Rates = [0.2 0.3 0.4 0.7 0.5 0.7 1.0 1.4 1.7 1.9 ... 2.1 2.3 2.5 2.8 3.1 3.3]'/100; Compounding = 1; RateSpec = intenvset('ValuationDate', ValuationDate, 'StartDates', ValuationDate, ... 'EndDates', EndDates, 'Rates', Rates, 'Compounding', Compounding)
RateSpec = struct with fields:
FinObj: 'RateSpec'
Compounding: 1
Disc: [16x1 double]
Rates: [16x1 double]
EndTimes: [16x1 double]
StartTimes: [16x1 double]
EndDates: [16x1 double]
StartDates: 735397
ValuationDate: 735397
Basis: 0
EndMonthRule: 1
% Use swapbyzero LegRate = [NaN 0]; % To compute the forward swap rate, set the coupon rate to NaN. [~, CurrentForwardSwapRate] = swapbyzero(RateSpec, LegRate, SwaptionSettle, SwapMaturity,... 'StartDate', SwaptionExerciseDate); % Use blackvolbysabr SABRBlackVolatility = blackvolbysabr(Alphas(6), Betas(6), Rhos(6), Nus(6), SwaptionSettle, ... SwaptionExerciseDate, CurrentForwardSwapRate, Strike)
SABRBlackVolatility = 0.3932
text (YearsToExercise(6), Strike, SABRBlackVolatility, '\leftarrow',... 'Color', 'r', 'FontWeight', 'bold', 'FontSize', 22);
% Use swaptionbyblk Price = swaptionbyblk(RateSpec, OptSpec, Strike, SwaptionSettle, SwaptionExerciseDate, ... SwapMaturity, SABRBlackVolatility, 'Reset', Reset)
Price = 14.2403
[1] Hagan, P. S., Kumar, D., Lesniewski, A. S. and Woodward, D. E., «Managing Smile Risk», Wilmott Magazine, 2002.
[2] West, G., «Calibration of the SABR Model in Illiquid Markets», Applied Mathematical Finance, 12 (4), pp. 371-385, 2004 .
blackvolbysabr
| swapbyzero
| swaptionbyblk