В этом примере показано, как оценить свопционы с отрицательными ударами с помощью модели Shifted SABR. Рыночные Сдвинутые Черные волатильности используются для калибровки параметров Сдвинутой модели SABR. Калиброванная модель Shifted SABR затем используется для вычисления изменчивости Сдвинутого Черного для отрицательных ударов.
Свопционы с отрицательными ударами затем оцениваются с помощью вычисленных Сдвинутых Черных волатильностей и swaptionbyblk
функция со 'Shift'
Набор параметров к предварительно заданной смене. Точно так же сдвинутые греки SABR могут быть вычислены с помощью optsensbysabr
функция путем установки 'Shift'
параметр. Наконец, из цен свопциона вычисляется плотность вероятностей базового актива, чтобы показать, что цены свопциона подразумевают положительные плотности вероятностей для некоторых негативных ударов.
Во-первых, загрузите рыночные процентные ставки и данные о волатильности свопциона. Рыночные волатильности свопциона котируются с точки зрения Сдвинутых Черных волатильностей с 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
Определите свопцию.
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
Задайте количество сдвига десятичных десятичных чисел для Сдвинутых Черных и Сдвинутых моделей SABR.
Shift = 0.008; % 0.8 percent shift
Загрузите рыночные данные о сдвинутой волатильности черного цвета для свопционов.
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
. The Beta
параметр предопределен на 0.5
.
Beta = 0.5;
Эта функция решает Сдвинутое уравнение волатильности в деньгах как полином 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
Отображение калиброванных параметров Shifted 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'
параметр для вычисления цен свопциона с помощью модели Shitted 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
использование модели Shitted 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');
Нейтральная к риску плотность вероятностей базовых цен на активы терминала может быть аппроксимирована как вторая производная от цен свопциона в отношении забастовки (Breeden and 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');
Хаган, П. С., Кумар, Д., Лесневски, А. С. и Вудворд, Д. Е. «Управление риском улыбки». Журнал Wilmott. 2002.
Kienitz, J. Разъяснение производных по процентной ставке. Том 1. Палгрейв Макмиллан, 2014.
Breeden, D. T. and Litzenberger, R. H. «Цены условных государственных претензий, неявных в опционных ценах». Журнал Бизнес. Том 51. 1978.
capbyblk
| capbynormal
| capvolstrip
| floorbyblk
| floorbynormal
| floorvolstrip
| optsensbysabr
| swaptionbyblk
| swaptionbynormal