В этом примере показано, как оценить 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.
optsensbysabr
| capbyblk
| floorbyblk
| capvolstrip
| floorvolstrip
| swaptionbyblk
| capbynormal
| floorbynormal
| swaptionbynormal