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