Этот пример показывает, как оценить swaptions с отрицательными забастовками при помощи модели Shifted SABR. Рынок Переключенные Черные колебания используется, чтобы калибровать Переключенные параметры модели SABR. Калиброванная модель Shifted SABR затем используется, чтобы вычислить Переключенные Черные колебания для отрицательных забастовок.
swaptions с отрицательными забастовками затем оценены с помощью вычисленных Переключенных Черных колебаний и функции swaptionbyblk
с набором параметра 'Shift'
к предзаданному сдвигу. Точно так же Переключенные греки SABR могут быть вычислены при помощи функции
optsensbysabr
путем установки 'Shift'
параметра. Наконец, от swaption цен, плотность вероятности базового актива вычисляется, чтобы показать, что swaption цены подразумевают положительные плотности вероятности для некоторых отрицательных забастовок.
Во-первых, загрузите рыночные процентные ставки и swaption данные об энергозависимости. Рынок swaption колебания заключается в кавычки с точки зрения Переключенных Черных колебаний со сдвигом процента 0.8
.
Задайте RateSpec
.
ValuationDate = '5-Apr-2016'; EndDates = datemnth(ValuationDate,[1 2 3 6 9 12*[1 2 3 4 5 6 7 8 9 10 12]])'; ZeroRates = [-0.34 -0.29 -0.25 -0.13 -0.07 -0.02 0.010 0.025 ... 0.031 0.040 0.052 0.090 0.190 0.290 0.410 0.520]'/100; Compounding = 1; RateSpec = intenvset('ValuationDate',ValuationDate,'StartDates',ValuationDate, ... 'EndDates',EndDates,'Rates',ZeroRates,'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: 736425
ValuationDate: 736425
Basis: 0
EndMonthRule: 1
Задайте swaption.
SwaptionSettle = '5-Apr-2016'; SwaptionExerciseDate = '5-Apr-2017'; SwapMaturity = '5-Apr-2022'; Reset = 1; OptSpec = 'call'; TimeToExercise = yearfrac(SwaptionSettle,SwaptionExerciseDate);
Используйте swapbyzero
, чтобы вычислить прямой уровень подкачки.
LegRate = [NaN 0]; % To compute the forward swap rate, set the fixed rate to NaN. [~, CurrentForwardValue] = swapbyzero(RateSpec,LegRate,SwaptionSettle,SwapMaturity,... 'StartDate',SwaptionExerciseDate)
CurrentForwardValue = 6.6384e-04
Укажите, что сумма переключает десятичные числа на нижний регистр для моделей Shifted Black и Shifted SABR.
Shift = 0.008; % 0.8 percent shift
Загрузите подразумеваемые Переключенные Черные данные об энергозависимости рынка для swaptions.
MarketShiftedBlackVolatilities = [21.1; 15.3; 14.0; 14.6; 16.0; 17.7; 19.8; 23.9; 26.2]/100; StrikeGrid = [-0.5; -0.25; -0.125; 0; 0.125; 0.25; 0.5; 1.0; 1.5]/100; MarketStrikes = CurrentForwardValue + StrikeGrid; ATMShiftedBlackVolatility = MarketShiftedBlackVolatilities(StrikeGrid==0);
Чтобы лучше представлять рынок энергозависимость в деньгах, значение параметров Alpha
подразумевается рынком энергозависимость в деньгах. Это подобно "Методу 2" в, Калибруют Модель SABR. Однако отметьте сложение Shift
к CurrentForwardValue
и использованию параметра 'Shift'
с blackvolbysabr
. Beta
параметр предопределяется в 0.5
.
Beta = 0.5;
Эта функция решает Переключенный SABR уравнение энергозависимости в деньгах как полином Alpha
. Отметьте сложение Shift
к CurrentForwardValue
.
alpharoots = @(Rho,Nu) roots([... (1 - Beta)^2*TimeToExercise/24/(CurrentForwardValue + Shift)^(2 - 2*Beta) ... Rho*Beta*Nu*TimeToExercise/4/(CurrentForwardValue + Shift)^(1 - Beta) ... (1 + (2 - 3*Rho^2)*Nu^2*TimeToExercise/24) ... -ATMShiftedBlackVolatility*(CurrentForwardValue + Shift)^(1 - Beta)]);
Эта функция преобразовывает энергозависимость в деньгах в Alpha
путем выбора самого маленького положительного действительного корня.
atmVol2ShiftedSabrAlpha = @(Rho,Nu) min(real(arrayfun(@(x) ...
x*(x>0) + realmax*(x<0 || abs(imag(x))>1e-6), alpharoots(Rho,Nu))));
Соответствуйте Rho
и Nu
(при преобразовании энергозависимости в деньгах в Alpha
). Обратите внимание, что параметр 'Shift'
blackvolbysabr
устанавливается на предзаданный сдвиг.
objFun = @(X) MarketShiftedBlackVolatilities - ... blackvolbysabr(atmVol2ShiftedSabrAlpha(X(1), X(2)), ... Beta, X(1), X(2), SwaptionSettle, SwaptionExerciseDate, CurrentForwardValue, ... MarketStrikes, 'Shift', Shift); options = optimoptions('lsqnonlin','Display','none'); X = lsqnonlin(objFun, [0 0.5], [-1 0], [1 Inf], options); Rho = X(1); Nu = X(2);
Получите итоговый Alpha
от калиброванных параметров.
Alpha = atmVol2ShiftedSabrAlpha(Rho, Nu)
Alpha = 0.0133
Покажите калиброванные Переключенные параметры SABR.
CalibratedPrameters = array2table([Shift Alpha Beta Rho Nu],... 'VariableNames',{'Shift' 'Alpha' 'Beta' 'Rho' 'Nu'},... 'RowNames',{'1Y into 5Y'})
CalibratedPrameters=1×5 table
Shift Alpha Beta Rho Nu
_____ ________ ____ _______ _______
1Y into 5Y 0.008 0.013345 0.5 0.46698 0.49816
Используйте blackvolbysabr
с 'Shift'
параметром.
Strikes = (-0.6:0.01:1.6)'/100; % Include negative strikes. SABRShiftedBlackVolatilities = blackvolbysabr(Alpha, Beta, Rho, Nu, SwaptionSettle, ... SwaptionExerciseDate, CurrentForwardValue, Strikes, 'Shift', Shift); figure; plot(MarketStrikes, MarketShiftedBlackVolatilities, 'o', ... Strikes, SABRShiftedBlackVolatilities); h = gca; line([0,0],[min(h.YLim),max(h.YLim)],'LineStyle','--'); ylim([0.13 0.31]) xlabel('Strike'); legend('Market quotes','Shifted SABR', 'location', 'southeast'); title (['Shifted Black Volatility (',num2str(Shift*100),' percent shift)']);
Используйте swaptionbyblk
с 'Shift'
параметром, чтобы вычислить swaption цены с помощью модели Shifted Black.
SwaptionPrices = swaptionbyblk(RateSpec, OptSpec, Strikes, SwaptionSettle, SwaptionExerciseDate, ... SwapMaturity, SABRShiftedBlackVolatilities, 'Reset', Reset, 'Shift', Shift); figure; plot(Strikes, SwaptionPrices, 'r'); h = gca; line([0,0],[min(h.YLim),max(h.YLim)],'LineStyle','--'); xlabel('Strike'); title ('Swaption Price');
Используйте optsensbysabr
с 'Shift'
параметром, чтобы вычислить Delta
с помощью модели Shifted SABR.
ShiftedSABRDelta = optsensbysabr(RateSpec, Alpha, Beta, Rho, Nu, SwaptionSettle, ... SwaptionExerciseDate, CurrentForwardValue, Strikes, OptSpec, 'Shift', Shift); figure; plot(Strikes,ShiftedSABRDelta,'r-'); ylim([-0.002 1.002]); h = gca; line([0,0],[min(h.YLim),max(h.YLim)],'LineStyle','--'); xlabel('Strike'); title ('Delta');
Нейтральная к риску плотность вероятности терминальных цен базового актива может быть аппроксимирована как вторая производная swaption цен относительно забастовки (Breeden и Litzenberger, 1978). Как видно в графике ниже, вычисленная плотность вероятности положительна для некоторых отрицательных уровней выше-0.8 процентов (нижняя граница, определенная 'Shift'
).
NumGrids = length(Strikes); ProbDensity = zeros(NumGrids-2,1); dStrike = mean(diff(Strikes)); for k = 2:(NumGrids-1) ProbDensity(k-1) = (SwaptionPrices(k-1) - 2*SwaptionPrices(k) + SwaptionPrices(k+1))/dStrike^2; end ProbDensity = ProbDensity./sum(ProbDensity); ProbStrikes = Strikes(2:end-1); figure; plot(ProbStrikes,ProbDensity,'r-'); h = gca; line([0,0],[min(h.YLim),max(h.YLim)],'LineStyle','--'); xlabel('Strike'); title ('Probability Density');
Хейган, P. S. Кумар, D., Лесниевский, A. S. и лесничий, D. E. "Управляя риском улыбки". Журнал Wilmott. 2002.
Kienitz, J. Объясненные производные процентной ставки. Издание 1. Пэлгрэйв Макмиллан, 2014.
Breeden, D. T. и Litzenberger, R. H. "Цены заявлений состояния сопряженных, неявных в ценах опции". Бизнес журнала. Издание 51. 1978.
capbyblk
| capbynormal
| capvolstrip
| floorbyblk
| floorbynormal
| floorvolstrip
| optsensbysabr
| swaptionbyblk
| swaptionbynormal