В этом примере показано, как оценить swaption использование SABR
модель. Во-первых, вы создаете swaption поверхность энергозависимости из волатильности рынка путем калибровки SABR
параметры модели отдельно для каждой swaption зрелости с помощью SABR
аналитический калькулятор цен. Вы затем вычисляете swaption цену при помощи подразумеваемой Черной энергозависимости на поверхности с SABR
аналитический калькулятор цен.
Загрузите кривую нулевой ширины, и рынок подразумевал Черные данные об энергозависимости для swaptions.
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
Текущие базовые форвардные курсы и соответствующие колебания в деньгах через восемь swaption сроков платежа представлены в четвертых строках этих двух матриц.
Когда вы используете статический SABR
модель, где параметры модели приняты постоянным относительно времени, параметры, калибруется отдельно для каждой swaption зрелости (годы, чтобы тренироваться) в 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');
Обратите внимание на то, что на этой поверхности энергозависимости, улыбки имеют тенденцию становиться более плоскими для дольше swaption сроки платежа (годы, чтобы тренироваться). Это сопоставимо со значениями параметров Ню, имеющими тенденцию уменьшиться с swaption зрелостью, как показано в таблице для CalibratedParameters
.
SABR
аналитический калькулятор цен, чтобы оценить swaption.Используйте SABR
аналитический калькулятор цен, чтобы оценить swaption, который назревает за пять лет. Во-первых, создайте базовый 10-летний инструмент подкачки, запускающийся через пять лет, и создайте Swaption
инструмент для этого базового Swap
. Затем создайте SABR
модель для этого swaption, назревающего за пять лет, который используется для создания 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 подразумевало, что Черная энергозависимость, используемая в оценке swaption, сначала вычисляет текущий прямой уровень подкачки при помощи 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);
Наконец, оцените swaption использование price
функция SABR
аналитический калькулятор цен.
SwaptionPrice = price(SABRPricer, Swaption)
SwaptionPrice = 13.0141
[1] Хейган, Патрик С., глубокий Кумар, Эндрю С. Лесниевский и Диана Э. Лесничий. "Управляя риском улыбки". Журнал Wilmott. (Январь 2002): 84–108.
[2] Запад, Грем. "Калибровка Модели SABR на Неликвидных Рынках". Прикладные Математические Финансы. 12, № 4 (декабрь 2005): 371–385.