SABR
unknown
matlab
3 years ago
34 kB
7
Indexable
clear
Settle = '16-Jan-2020';
Exercises = [0.25 0.5 1 2 3 4 5 7 10 15 20 30];
ExerciseDate = datemnth(Settle, Exercises*12);
Maturity = datemnth(ExerciseDate, 12);
Basis = 1;
ZeroRates = [-0.600837 -0.610152 -0.607273 -0.581843 -0.488901...
-0.310758 -0.195281 -0.092062 0.036291 0.189322 0.35883]/100;
CurveDates = datemnth(Settle, [0.5 1 2 3 5 8 10 12 15 20 30]*12);
ZeroCurve = IRDataCurve('Zero',Settle,CurveDates,ZeroRates);
RateSpec = toRateSpec(ZeroCurve, ExerciseDate);
Strikes = [-2, -1, -0.5, -0.25, 0, 0.25, 0.5, 1, 2]/100;
% %etta er fyrir 1 rs IRS
%
% MarketVolatilities = [41.64 32.09 21.17 14.94 10.8 18.34 26.18 40.53 66.53;
% 38.33 29.99 20.45 15.14 12.3 18.02 24.78 37.41 60.41;
% 35.26 28.55 21.09 17.38 15.9 19.72 24.88 35.23 54.54;
% 32.73 29.16 25.55 24.44 24.5 26.36 29.15 35.9 49.99;
% 38 35.8 33.23 32.54 32.7 33.84 35.88 41.46 54.44;
% 40.75 40.39 38.8 38.45 38.7 39.45 40.9 45.19 56.23;
% 41.63 42.95 42.47 42.48 42.6 43.43 44.44 47.41 55.7;
% 45.78 47.16 47.44 47.75 48.3 48.93 49.84 52.28 58.97;
% 46.95 49.69 50.77 51.35 52.1 52.7 53.48 55.26 59.66;
% 47.21 50.01 50.99 51.46 51.9 52.43 52.95 54.09 56.87;
% 45.55 48.79 49.75 50.2 50.8 51.14 51.65 52.81 55.79;
% 41.91 46.48 47.25 47.57 47.7 48.27 48.71 49.87 53.4;]/10000;
%
% ATMStrike = [-0.00625 -0.00625 -0.00578 -0.00388 -0.00193 0.00032 0.00272...
% 0.00860 0.01285 0.01016 0.00951 0.00702];
% Maturity = datemnth(ExerciseDate, 12);
% m = 1;
OptSpec = 'call';
Shift = 0.03;
%
%
% % etta er fyrir 5 ra IRS
ATMStrike = [-0.003101428 -0.002685957 -0.001695123 0.00053666 0.003009843 ...
0.005978053 0.008890873 0.01226618 0.011186882 0.009555091 0.009055452 0.007028349];
Maturity = datemnth(ExerciseDate, 12*5);
m = 5;
MarketVolatilities = [63.96 50.51 38.3 32.54 30.5 35.69 43.68 60.35 91.93;
57.67 46.62 36.88 32.67 31.5 35.43 41.77 55.7 82.74;
49.19 41.95 35.87 33.74 33.6 35.92 39.99 49.89 70.37;
45.79 41.94 38.64 37.71 37.8 39.05 41.37 47.81 62.85;
46.36 43.76 41.74 41.33 41.7 42.67 44.46 49.57 62.27;
46.39 45.23 44.33 44.3 44.8 45.58 46.94 50.79 60.93;
45.54 46.25 46.34 46.61 47.1 47.83 48.83 51.51 58.81;
48.18 48.98 49.27 49.58 50.1 50.7 51.54 53.76 59.88;
49.79 51.1 51.59 51.91 52.3 52.83 53.44 55.01 59.4;
48.69 50.47 51 51.29 51.6 51.97 52.4 53.47 56.52;
46.86 49.23 49.79 50.06 50.3 50.72 51.15 52.24 55.48;
43.33 46.98 47.27 47.38 47.7 47.77 48.13 49.27 53.35;]/10000;
%
% etta er fyrir 2 ra IRS
% m = 2;
% MarketVolatilities = [47.39 36.07 23.98 17.26 14 23.09 32.24 49.01 79.38
% 42.2 33.13 23.44 18.33 16.2 21.66 28.52 41.69 65.88
% 35.77 29.64 23.34 20.72 20.4 23.6 28.14 37.8 56.3
% 37.25 33.32 29.52 28.34 28.4 30.06 32.84 39.85 54.86
% 40.92 38.51 35.89 35.21 35.3 36.53 38.58 44.28 57.71
% 41.86 41.36 39.88 39.61 39.8 40.75 42.24 46.55 57.62
% 42.61 43.4 43.02 43.1 43.4 44.16 45.2 48.19 56.4
% 46.05 47.12 47.4 47.72 48.2 48.94 49.87 52.32 59
% 47.13 49.62 50.63 51.19 51.9 52.5 53.27 55.04 59.48
% 46.92 49.72 50.7 51.16 51.6 52.13 52.64 53.76 56.47
% 45.25 48.53 49.5 49.94 50.4 50.85 51.35 52.46 55.28
% 41.98 46.48 47.21 47.51 47.7 48.17 48.6 49.73 53.26]/10000;
%
% Maturity = datemnth(ExerciseDate, 12*2);
%
% ATMStrike = [-0.005827839 -0.005594544 -0.004825977 -0.002900213 -0.000801556 0.001517528 0.00408561 0.01082778 0.012385516 0.009932279 0.009417819 0.007024557];
%
%
%etta er fyrir 3 ra IRS
% MarketVolatilities = [52.89 40.86 28.58 22.11 19.7 27.03 35.89 52.73 83.54
% 47.47 37.76 27.95 23.13 21.5 26.21 32.93 46.46 71.74
% 40.86 34.39 28.14 25.72 25.4 28.25 32.61 42.43 61.8
% 40.78 36.97 33.38 32.32 32.6 33.87 36.47 43.29 58.44
% 43.08 40.85 38.42 37.82 37.8 39.11 41.05 46.56 59.84
% 43.92 43 41.69 41.49 41.7 42.67 44.1 48.27 59.09
% 43.66 44.34 44.13 44.29 44.6 45.42 46.44 49.32 57.21
% 46.79 47.74 48.03 48.36 48.8 49.55 50.45 52.82 59.31
% 48.12 50.19 51.03 51.51 52.2 52.7 53.42 55.12 59.53
% 47.57 50.03 50.86 51.26 51.9 52.13 52.62 53.72 56.55
% 45.91 48.9 49.72 50.11 50.7 50.94 51.41 52.51 55.47
% 41.98 46.48 47.21 47.51 47.7 48.17 48.6 49.73 53.26]/10000;
% m = 3;
% Maturity = datemnth(ExerciseDate, 12*m);
%
% ATMStrike = [-0.00501165 -0.004698029 -0.003852848 -0.001823192 0.000368412 0.002829272 0.005572224 0.012192699 0.011991921 0.0097334 0.009313357 0.007024557];
%
% MarketVolatilities = [59.41 46.65 34.31 28.2 26.3 32.11 40.56 57.46 88.94
% 53.24 42.87 33.03 28.54 27.4 31.37 37.89 51.71 78.08
% 45.49 38.66 32.49 30.23 30.2 32.53 36.73 46.61 66.66
% 43.37 39.63 36.24 35.28 35.6 36.74 39.18 45.8 60.88
% 44.7 42.46 40.21 39.69 39.9 40.98 42.85 48.16 61.21
% 45.49 44.33 43.19 43.06 43.6 44.27 45.66 49.67 60.21
% 44.6 45.26 45.21 45.43 45.8 46.61 47.62 50.4 57.98
% 47.53 48.39 48.68 49.01 49.6 50.16 51.03 53.33 59.63
% 48.91 50.59 51.26 51.67 52.2 52.72 53.39 55.03 59.42
% 48.12 50.23 50.91 51.26 51.7 52.03 52.49 53.58 56.52
% 46.31 48.98 49.67 50 50.4 50.75 51.2 52.3 55.39
% 42.83 46.76 47.19 47.37 47.7 47.85 48.23 49.37 53.26]/10000;
%
% ATMStrike = [-0.004103177 -0.003728767 -0.002798018 -0.000682383 0.001638593 0.004251843 0.007412047 0.012351924 0.011492223 0.009603237 0.009190516 0.007029192];
% m = 4;
% Maturity = datemnth(ExerciseDate, 12*m);
%
%
% MarketVolatilities = [75.63 58.22 44.48 38.02 35 40.39 48.83 66.9 101.42
% 67.15 53.28 42.62 38.02 36 39.97 46.34 60.95 89.79
% 55.87 47.28 40.88 38.56 37.7 39.84 43.53 53.2 73.99
% 49.53 45.21 42.2 41.34 41.3 42.29 44.21 49.91 64
% 49.72 46.53 44.54 44.07 44.1 45.01 46.5 51.02 62.9
% 49.12 47.42 46.39 46.24 46.3 47.15 48.28 51.67 61.11
% 47.92 48.01 47.83 47.95 48.1 48.84 49.65 51.99 58.76
% 49.99 50.19 50.2 50.36 50.6 51.2 51.9 53.89 59.72
% 53.13 52.97 52.71 52.7 52.5 53.06 53.49 54.87 59.53
% 49.82 51.04 51.29 51.46 51.4 51.99 52.4 53.53 57.09
% 48.1 49.84 50.01 50.11 50.1 50.52 50.87 51.95 55.64
% 44.38 47.4 47.17 47.04 46.8 47.06 47.32 48.49 53.27
%
% ]/10000;
% ATMStrike = [-0.000860391 -0.000362457 0.000775512 0.003427966 0.006081091 0.008185933 0.009858971 0.011796839 0.01039123 0.009516782 0.008715851 0.007030036];
% m = 7;
% Maturity = datemnth(ExerciseDate, 12*m);
% MarketVolatilities = [90.76 66.72 50.76 43.15 39.5 44.65 53.86 73.81 112.01
% 78.63 60.15 48.12 42.85 40.5 43.83 50.37 65.85 96.73
% 63.72 52.68 45.76 43.1 41.9 43.23 46.43 55.68 76.5
% 53.14 48.29 45.42 44.52 44.2 44.85 46.25 50.91 63.49
% 52.73 49.05 46.99 46.39 46.2 46.74 47.81 51.48 62.05
% 51.95 49.66 48.36 48.02 47.9 48.37 49.16 51.88 60.26
% 50.8 50.08 49.49 49.37 49.3 49.72 50.26 52.09 58.1
% 52.34 51.77 51.33 51.27 51.2 51.64 52.13 53.77 59.22
% 53.13 52.97 52.71 52.7 52.5 53.06 53.49 54.87 59.53
% 51.63 52.02 51.85 51.84 51.5 52.15 52.52 53.75 58.04
% 50.04 50.86 50.46 50.3 49.8 50.3 50.54 51.61 55.99
% 45.7 47.68 46.71 46.23 45.2 45.7 45.82 47.03 52.82]/10000;
% ATMStrike = [0.0031232 0.003587631 0.004533707 0.006281376 0.007788551 0.009004663 0.010004987 0.011258203 0.01039123 0.009311033 0.008064948 0.007028361];
% m = 10;
% Maturity = datemnth(ExerciseDate, 12*m);
%
% MarketVolatilities = [96.54 71.94 57 49.79 44.7 45.83 51.61 67.26 99.5
% 90.27 68.8 55.91 49.88 45.6 46.34 50.85 64.25 93.02
% 72.58 59.65 52.2 49.03 46.6 46.77 48.56 55.89 74.82
% 59.38 53.51 50.16 48.81 47.6 47.61 48.05 50.91 61.12
% 57.56 53 50.38 49.33 48.3 48.4 48.71 50.93 59.49
% 55.48 52.31 50.39 49.64 48.8 48.95 49.16 50.78 57.58
% 53.18 51.49 50.27 49.79 48.9 49.33 49.45 50.52 55.46
% 52.84 51.6 50.64 50.27 49.3 49.99 50.16 51.23 55.92
% 51.92 51.47 50.86 50.64 49.7 50.6 50.84 51.91 56.29
% 49.26 49.67 49.23 49.06 47.8 49.03 49.24 50.2 54.24
% 47.95 48.42 47.55 47.16 45.7 46.77 46.89 47.92 52.78
% 43.39 45.16 43.72 42.99 41.3 42.07 42.09 43.37 49.74
% ]/10000;
%
% ATMStrike = [0.006540127 0.006737475 0.007153065 0.007940675 0.008631298 0.009217195 0.00967576 0.010134862 0.009280754 0.008216506 0.007565322 0.007029368];
% m = 20;
% Maturity = datemnth(ExerciseDate, 12*m);
% %etta er fyrir 30 ra IRS
%
% MarketVolatilities = [98.21 73.29 58.16 50.77 45.3 45.84 51.23 66.52 98.35;
% 91.85 70.16 57.11 50.9 46.2 46.38 50.45 63.39 91.67;
% 73.75 60.74 53.18 49.87 47.1 47.09 48.57 55.49 74;
% 59.63 54.21 50.96 49.59 48.1 48.14 48.32 50.6 59.83;
% 57.37 53.25 50.7 49.63 48.2 48.49 48.61 50.38 58.12;
% 54.94 52.18 50.32 49.54 48.2 48.69 48.77 50.06 56.22;
% 52.32 50.98 49.8 49.29 48 48.73 48.76 49.61 54.11;
% 51.25 50.29 49.31 48.9 47.4 48.52 48.63 49.57 54.05;
% 49.99 49.67 48.97 48.71 47.1 48.58 48.79 49.86 54.38;
% 46.89 47.45 46.93 46.72 44.9 46.67 46.9 47.99 52.46;
% 45.25 45.88 44.95 44.54 42.4 44.21 44.4 45.65 51.06;
% 40.74 42.19 40.83 40.2 37.9 39.56 39.76 41.36 48.01;]/10000;
% ATMStrike = [0.006983039 0.007101465 0.007352862 0.00783077 0.008247838 0.008599114 0.008870064 0.009133974 0.008587944 0.007849847 0.007399415 0.007029078];
% m = 30;
% Maturity = datemnth(ExerciseDate, 12*m);
%
%
%
ATMVol = MarketVolatilities(:, 5);
%
for j = 1:length(ExerciseDate)
for i = 1:length(Strikes)
MarketStrikes = ATMStrike(i) + Strikes;
Price = swaptionbynormal(RateSpec,OptSpec, MarketStrikes(i),...
Settle, ExerciseDate(j), Maturity(j), MarketVolatilities(j,i),...
'Principal', 100);
swaptionprice(j,i) = Price;
objfun = @(X) (Price - swaptionbyblk(RateSpec, OptSpec, MarketStrikes(i),...
Settle, ExerciseDate(j), Maturity(j), X, 'Shift', Shift, ...
'Principal', 100))*10000000000000;
X = lsqnonlin(objfun, [0.35], [0], [Inf]);
display(Price - swaptionbyblk(RateSpec, OptSpec, MarketStrikes(i),...
Settle, ExerciseDate(j), Maturity(j), X, 'Shift', Shift))
blackprice(j, i) = swaptionbyblk(RateSpec, OptSpec, MarketStrikes(i),...
Settle, ExerciseDate(j), Maturity(j), X, 'Shift', Shift, ...
'Principal', 100);
blackvol(j, i) = X;
end
end
%
]
for i = 1:length(Exercises)
MarketStrikes = ATMStrike(i) + Strikes;
CurrentForwardValue = MarketStrikes(5);
ATMVolatility = ATMVol(i);
CurrentVolatilities = MarketVolatilities(i, :);
CurrentVolatilities = CurrentVolatilities';
% Define the predetermined Beta
Beta1 = 0; % Setting Beta to zero allows negative rates for Normal volatilities
% Calibrate Alpha, Rho, and Nu
objFun = @(X) CurrentVolatilities - ...
normalvolbysabr(X(1), Beta1, X(2), X(3), Settle, ...
ExerciseDate(i), CurrentForwardValue, MarketStrikes, 'Basis', Basis);
% If necessary, tolerances and stopping criteria can be adjusted for lsqnonlin
X = lsqnonlin(objFun, [ATMVolatility 0 0.5], [0 -1 0], [Inf 1 Inf]);
errors = sum(CurrentVolatilities - ...
normalvolbysabr(X(1), Beta1, X(2), X(3), Settle, ...
ExerciseDate(i), CurrentForwardValue, MarketStrikes, 'Basis', Basis))*100;
display(CurrentVolatilities);
display(normalvolbysabr(X(1), Beta1, X(2), X(3), Settle, ...
ExerciseDate(i), CurrentForwardValue, MarketStrikes, 'Basis', Basis));
Alpha1 = X(1);
Rho1 = X(2);
Nu1 = X(3);
sabrnormpara1(i, :) = [Alpha1 Rho1 Nu1 errors];
% Define the predetermined Beta
Beta2 = 0; % Setting Beta to zero allows negative rates for Normal volatilities
% Year fraction from Settle to option maturity
T = yearfrac(Settle, ExerciseDate, Basis);
% This function solves the SABR at-the-money volatility equation as a
% % polynomial of Alpha
alpharootsNormal = @(Rho,Nu) roots([...
Beta2.*(Beta2 - 2)*T/24/CurrentForwardValue^(2 - 2*Beta2) ...
Rho*Beta2*Nu*T/4/CurrentForwardValue^(1 - Beta2) ...
(1 + (2 - 3*Rho^2)*Nu^2*T/24) ...
-ATMVolatility*CurrentForwardValue^(-Beta2)]);
% This function converts at-the-money volatility into Alpha by picking the
% smallest positive real root
atmNormalVol2SabrAlpha = @(Rho,Nu) min(real(arrayfun(@(x) ...
x*(x>0) + realmax*(x<0 || abs(imag(x))>1e-6), alpharootsNormal(Rho,Nu))));
% Calibrate Rho and Nu (while converting at-the-money volatility into Alpha
% using atmVol2NormalSabrAlpha)
objFun = @(X) CurrentVolatilities - ...
normalvolbysabr(atmNormalVol2SabrAlpha(X(1), X(2)), ...
Beta2, X(1), X(2), Settle, ExerciseDate(i), CurrentForwardValue, ...
MarketStrikes, 'Basis', Basis);
% If necessary, tolerances and stopping criteria can be adjusted for lsqnonlin
X = lsqnonlin(objFun, [0 0.5], [-1 0], [1 Inf]);
Rho2 = X(1);
Nu2 = X(2);
errors2 = sum(CurrentVolatilities - ...
normalvolbysabr(atmNormalVol2SabrAlpha(X(1), X(2)), ...
Beta2, X(1), X(2), Settle, ExerciseDate(i), CurrentForwardValue, ...
MarketStrikes, 'Basis', Basis))*100;
% Obtain final Alpha from at-the-money volatility using calibrated parameters
Alpha2 = atmNormalVol2SabrAlpha(Rho2, Nu2);
% Display calibrated parameters
C = {Alpha1 Beta1 Rho1 Nu1;Alpha2 Beta2 Rho2 Nu2};
CC = [Alpha2 Rho2 Nu2 errors2];
format;
CalibratedPrameters = cell2table(C,...
'VariableNames',{'Alpha' 'Beta' 'Rho' 'Nu'},...
'RowNames',{'Method 1';'Method 2'});
PlottingStrikes = (min(MarketStrikes)-0.025:0.001:max(MarketStrikes)+0.025)';
plotss(i,:) = PlottingStrikes;
% Compute volatilities for model calibrated by Method 1
ComputedVols1 = normalvolbysabr(Alpha1, Beta1, Rho1, Nu1, Settle, ...
ExerciseDate(i), CurrentForwardValue, PlottingStrikes, 'Basis', Basis);
% Compute volatilities for model calibrated by Method 2
ComputedVols2 = normalvolbysabr(Alpha2, Beta2, Rho2, Nu2, Settle, ...
ExerciseDate(i), CurrentForwardValue, PlottingStrikes, 'Basis', Basis);
voloutput1(:, i) = ComputedVols1;
voloutput2(:, i) = ComputedVols2;
ComputedVols1 = normalvolbysabr(Alpha1, Beta1, Rho1, Nu1, Settle, ...
ExerciseDate(i), CurrentForwardValue, MarketStrikes, 'Basis', Basis);
% Compute volatilities for model calibrated by Method 2
ComputedVols2 = normalvolbysabr(Alpha2, Beta2, Rho2, Nu2, Settle, ...
ExerciseDate(i), CurrentForwardValue, MarketStrikes, 'Basis', Basis);
volsnormal1(:, i) = ComputedVols1;
volsnormal2(:, i) = ComputedVols2;
sabrnormpara2(i, :) = CC;
end
% figure;
% surf(X1, Y1, voloutput1')
%
ATMVoll = blackvol(:, 5);
for i = 1:length(Exercises)
MarketStrikes = ATMStrike(i) + Strikes;
CurrentForwardValue = MarketStrikes(5);
ATMVolatilityy = blackvol(i, 5);
CurrentVolatilities = blackvol(i, :);
CurrentVolatilities = CurrentVolatilities';
Beta1 = 0.5;
objFun = @(X) (CurrentVolatilities - ...
blackvolbysabr(X(1), Beta1, X(2), X(3), Settle, ...
ExerciseDate(i), CurrentForwardValue, MarketStrikes, ...
'Shift', Shift, 'model', 'Obloj2008'));
X = lsqnonlin(objFun, [ATMVolatilityy 0 0.5], [0, -1 0], [Inf 1 Inf]);
errors = sum(CurrentVolatilities - ...
blackvolbysabr(X(1), Beta1, X(2), X(3), Settle, ...
ExerciseDate(i), CurrentForwardValue, MarketStrikes, ...
'Shift', Shift, 'model', 'Obloj2008'));
Alpha1 = X(1);
Rho1 = X(2);
Nu1 = X(3);
Beta2 = 0.5;
sabrobblkpara1(i, :) = [Alpha1 Beta1 Rho1 Nu1 errors];
T = yearfrac(Settle, ExerciseDate, Basis);
% This function solves the SABR at-the-money volatility equation as a
% polynomial of Alpha
alpharootsShifted = @(Rho,Nu) roots([...
(1-Beta2)^2 * T / 24 / (CurrentForwardValue+Shift)^(2 - 2*Beta2) ...
Rho * Beta2 * Nu * T / 4 / (CurrentForwardValue+Shift)^(1 - Beta2) ...
(1 + (2 - 3*Rho^2)*Nu^2*T/24) ...
-ATMVolatilityy*(CurrentForwardValue+Shift)^(1-Beta2)]);
alpharootsshifted = @(Rho, Nu) roots([...
(1-Beta2)^2*T/24/(CurrentForwardValue+Shift)^(2 - 2*Beta2) ...
Rho * Beta2 * Nu * T/4/(CurrentForwardValue+Shift)^(1-Beta2) ...
(1 + (2 - 3*Rho^2)*Nu^2*T/24) ...
- ATMVolatilityy * (CurrentForwardValue+ Shift) ^(1- Beta2)]);
% This function converts at-the-money volatility into Alpha by picking the
% smallest positive real root
atmShiftedVol2SabrAlpha = @(Rho,Nu) min(real(arrayfun(@(x) ...
x*(x>0) + realmax*(x<0 || abs(imag(x))>1e-6), alpharootsShifted(Rho,Nu))));
objFun = @(X) (CurrentVolatilities - ...
blackvolbysabr(atmShiftedVol2SabrAlpha(X(1), X(2)),...
Beta2, X(1), X(2), Settle, ExerciseDate(i), CurrentForwardValue,...
MarketStrikes, 'Shift', Shift, 'model', 'Obloj2008'));
X = lsqnonlin(objFun, [0, 0.1], [-1, 0], [1, Inf]);
oberrors2 = sum(CurrentVolatilities - ...
blackvolbysabr(atmShiftedVol2SabrAlpha(X(1), X(2)),...
Beta2, X(1), X(2), Settle, ExerciseDate(i), CurrentForwardValue,...
MarketStrikes, 'Shift', Shift, 'model', 'Obloj2008'));
Rho2 = X(1);
Nu2 = X(2);
Alpha2 = atmShiftedVol2SabrAlpha(Rho2, Nu2);
CC = [Alpha2 Beta2 Rho2 Nu2 oberrors2];
PlottingStrikes = (min(MarketStrikes):0.001:max(MarketStrikes)+0.025)';
ComputedVols1 = blackvolbysabr(Alpha1, Beta1, Rho1, Nu1, Settle,...
ExerciseDate(i), CurrentForwardValue, PlottingStrikes,...
'Shift', Shift,'model', 'Obloj2008');
ComputedVols2 = blackvolbysabr(Alpha2, Beta2, Rho2, Nu2, Settle,...
ExerciseDate(i), CurrentForwardValue, PlottingStrikes,...
'Shift', Shift, 'model', 'Obloj2008');
blackobavoloutput1(:, i) = ComputedVols1;
blackobavoloutput2(:, i) = ComputedVols2;
ComputedVols1 = blackvolbysabr(Alpha1, Beta1, Rho1, Nu1, Settle,...
ExerciseDate(i), CurrentForwardValue, MarketStrikes, ...
'Shift', Shift, 'model', 'Obloj2008');
ComputedVols2 = blackvolbysabr(Alpha2, Beta2, Rho2, Nu2, Settle,...
ExerciseDate(i), CurrentForwardValue, MarketStrikes,...
'Shift', Shift, 'model', 'Obloj2008');
volsobblack1(:, i) = ComputedVols1;
volsobblack2(:, i) = ComputedVols2;
sabrobblkpara2(i, :) = CC;
MarketStrikess(i,:) = MarketStrikes;
end
for i = 1:length(Exercises)
MarketStrikes = ATMStrike(i) + Strikes;
CurrentForwardValue = MarketStrikes(5);
ATMVolatilityy = blackvol(i, 5);
CurrentVolatilities = blackvol(i, :);
CurrentVolatilities = CurrentVolatilities';
Beta1 = 0.5;
objFun = @(X) (CurrentVolatilities - ...
blackvolbysabr(X(1), Beta1, X(2), X(3), Settle, ...
ExerciseDate(i), CurrentForwardValue, MarketStrikes, ...
'Shift', Shift));
X = lsqnonlin(objFun, [ATMVolatilityy 0 0.5], [0, -1 0], [Inf 1 Inf]);
errors = sum(CurrentVolatilities - ...
blackvolbysabr(X(1), Beta1, X(2), X(3), Settle, ...
ExerciseDate(i), CurrentForwardValue, MarketStrikes, ...
'Shift', Shift));
Alpha1 = X(1);
Rho1 = X(2);
Nu1 = X(3);
Beta2 = 0.5;
sabrblkpara1(i, :) = [Alpha1 Beta1 Rho1 Nu1 errors];
T = yearfrac(Settle, ExerciseDate, Basis);
% This function solves the SABR at-the-money volatility equation as a
% polynomial of Alpha
alpharootsShifted = @(Rho,Nu) roots([...
(1-Beta2)^2 * T / 24 / (CurrentForwardValue+Shift)^(2 - 2*Beta2) ...
Rho * Beta2 * Nu * T / 4 / (CurrentForwardValue+Shift)^(1 - Beta2) ...
(1 + (2 - 3*Rho^2)*Nu^2*T/24) ...
-ATMVolatilityy*(CurrentForwardValue+Shift)^(1-Beta2)]);
% This function converts at-the-money volatility into Alpha by picking the
% smallest positive real root
atmShiftedVol2SabrAlpha = @(Rho,Nu) min(real(arrayfun(@(x) ...
x*(x>0) + realmax*(x<0 || abs(imag(x))>1e-6), alpharootsShifted(Rho,Nu))));
objFun = @(X) (CurrentVolatilities - ...
blackvolbysabr(atmShiftedVol2SabrAlpha(X(1), X(2)),...
Beta2, X(1), X(2), Settle, ExerciseDate(i), CurrentForwardValue,...
MarketStrikes, 'Shift', Shift));
X = lsqnonlin(objFun, [0, 0.1], [-1, 0], [1, Inf]);
errors2 =(CurrentVolatilities - ...
blackvolbysabr(atmShiftedVol2SabrAlpha(X(1), X(2)),...
Beta2, X(1), X(2), Settle, ExerciseDate(i), CurrentForwardValue,...
MarketStrikes, 'Shift', Shift));
sumerror2 = sum(errors2);
Rho2 = X(1);
Nu2 = X(2);
Alpha2 = atmShiftedVol2SabrAlpha(Rho2, Nu2);
CC = [Alpha2 Beta2 Rho2 Nu2 sumerror2];
PlottingStrikes = (min(MarketStrikes):0.001:max(MarketStrikes)+0.025)';
plots(i,:) = PlottingStrikes;
ComputedVols1 = blackvolbysabr(Alpha1, Beta1, Rho1, Nu1, Settle,...
ExerciseDate(i), CurrentForwardValue, PlottingStrikes,...
'Shift', Shift);
ComputedVols2 = blackvolbysabr(Alpha2, Beta2, Rho2, Nu2, Settle,...
ExerciseDate(i), CurrentForwardValue, PlottingStrikes,...
'Shift', Shift);
blackvoloutput1(:, i) = ComputedVols1;
blackvoloutput2(:, i) = ComputedVols2;
ComputedVols1 = blackvolbysabr(Alpha1, Beta1, Rho1, Nu1, Settle,...
ExerciseDate(i), CurrentForwardValue, MarketStrikes, ...
'Shift', Shift);
ComputedVols2 = blackvolbysabr(Alpha2, Beta2, Rho2, Nu2, Settle,...
ExerciseDate(i), CurrentForwardValue, MarketStrikes,...
'Shift', Shift);
volsblack1(:, i) = ComputedVols1;
volsblack2(:, i) = ComputedVols2;
sabrblkpara2(i, :) = CC;
MarketStrikess(i,:) = MarketStrikes;
end
err(:,1) = sabrblkpara1(:,end);
err(:,2) = sabrblkpara2(:,end);
err(:,3) = sabrobblkpara1(:,end);
err(:,4) = sabrobblkpara2(:,end);
err(:,5) = sabrnormpara1(:,end);
err(:,6) = sabrnormpara2(:,end);
%
figure;
t = tiledlayout(1,2);
i = 9;
nexttile;
plot(MarketStrikess(i,:), blackvol(i, :)*100,'xk',...
plots(i,:),blackobavoloutput1(:,i)*100,'m', ...
plots(i,:), blackobavoloutput2(:,i)*100,'g',...
plots(i,:), blackvoloutput1(:,i)*100,'b',...
plots(i,:), blackvoloutput2(:,i)*100,'r',...
MarketStrikess(i,5), blackvol(i,5)*100,'ok',...
'MarkerSize',10);
xlabel('Strike', 'FontWeight', 'bold');
ylabel('Implied Shifted Volatility (in %)', 'FontWeight', 'bold');
legend('Market Volatilities', 'SABR Model - Oblj (Method 1)',...
'SABR Model - Oblj (Method 2)','Shifted SABR (Method 1)',...
'Shifted SABR (Method 2)', 'At-the-money volatility', 'Location', 'best');
title('Swaption volatility smile for ' + string(Exercises(i)) + 'Y' + string(m) + 'Y swaptions')
i = 10;
nexttile;
plot(MarketStrikess(i,:), blackvol(i, :)*100,'xk',...
plots(i,:),blackobavoloutput1(:,i)*100,'m', ...
plots(i,:), blackobavoloutput2(:,i)*100,'g',...
plots(i,:), blackvoloutput1(:,i)*100,'b',...
plots(i,:), blackvoloutput2(:,i)*100,'r',...
MarketStrikess(i,5), blackvol(i,5)*100,'ok',...
'MarkerSize',10);
xlabel('Strike', 'FontWeight', 'bold');
ylabel('Implied Shifted Volatility (in %)', 'FontWeight', 'bold');
legend('Market Volatilities', 'SABR Model - Oblj (Method 1)',...
'SABR Model - Oblj (Method 2)','Shifted SABR (Method 1)',...
'Shifted SABR (Method 2)', 'At-the-money volatility', 'Location', 'best');
title('Swaption volatility smile for ' + string(Exercises(i)) + 'Y' + string(m) + 'Y swaptions')
figure;
t = tiledlayout(1,2);
i = 11;
nexttile;
plot(MarketStrikess(i,:), blackvol(i, :)*100,'xk',...
plots(i,:),blackobavoloutput1(:,i)*100,'m', ...
plots(i,:), blackobavoloutput2(:,i)*100,'g',...
plots(i,:), blackvoloutput1(:,i)*100,'b',...
plots(i,:), blackvoloutput2(:,i)*100,'r',...
MarketStrikess(i,5), blackvol(i,5)*100,'ok',...
'MarkerSize',10);
xlabel('Strike', 'FontWeight', 'bold');
ylabel('Implied Shifted Volatility (in %)', 'FontWeight', 'bold');
legend('Market Volatilities', 'SABR Model - Oblj (Method 1)',...
'SABR Model - Oblj (Method 2)','Shifted SABR (Method 1)',...
'Shifted SABR (Method 2)', 'At-the-money volatility', 'Location', 'best');
title('Swaption volatility smile for ' + string(Exercises(i)) + 'Y' + string(m) + 'Y swaptions')
i = 12;
nexttile;
plot(MarketStrikess(i,:), blackvol(i, :)*100,'xk',...
plots(i,:),blackobavoloutput1(:,i)*100,'m', ...
plots(i,:), blackobavoloutput2(:,i)*100,'g',...
plots(i,:), blackvoloutput1(:,i)*100,'b',...
plots(i,:), blackvoloutput2(:,i)*100,'r',...
MarketStrikess(i,5), blackvol(i,5)*100,'ok',...
'MarkerSize',10);
xlabel('Strike', 'FontWeight', 'bold');
ylabel('Implied Shifted Volatility (in %)', 'FontWeight', 'bold');
legend('Market Volatilities', 'SABR Model - Oblj (Method 1)',...
'SABR Model - Oblj (Method 2)','Shifted SABR (Method 1)',...
'Shifted SABR (Method 2)', 'At-the-money volatility', 'Location', 'best');
title('Swaption volatility smile for ' + string(Exercises(i)) + 'Y' + string(m) + 'Y swaptions')
%
%
%
%
figure;
t = tiledlayout(1,2);
i = 3;
nexttile;
plot(MarketStrikess(i,:), blackvol(i, :)*100,'xk',...
plots(i,:), blackvoloutput1(:,i)*100,'b',...
plots(i,:), blackvoloutput2(:,i)*100,'r',...
MarketStrikess(i,5), blackvol(i,5)*100,'ok',...
'MarkerSize',10);
xlabel('Strike', 'FontWeight', 'bold');
ylabel('Implied Shifted Volatility (in %)', 'FontWeight', 'bold');
legend('Market Volatilities', 'Shifted SABR Model - (Method 1)',...
'Shfted SABR Model - (Method 2)', 'At-the-money volatility', 'Location', 'best');
title('Swaption volatility smile for ' + string(Exercises(i)) + 'Y' + string(m) + 'Y swaptions')
i = 7;
nexttile;
plot(MarketStrikess(i,:), blackvol(i, :)*100,'xk',...
plots(i,:), blackvoloutput1(:,i)*100,'b',...
plots(i,:), blackvoloutput2(:,i)*100,'r',...
MarketStrikess(i,5), blackvol(i,5)*100,'ok',...
'MarkerSize',10);
xlabel('Strike', 'FontWeight', 'bold');
ylabel('Implied Shifted Volatility (in %)', 'FontWeight', 'bold');
legend('Market Volatilities', 'Shifted SABR Model - (Method 1)',...
'Shfted SABR Model - (Method 2)', 'At-the-money volatility', 'Location', 'best');
title('Swaption volatility smile for ' + string(Exercises(i)) + 'Y' + string(m) + 'Y swaptions')
figure;
t = tiledlayout(1,2);
i = 9;
nexttile;
plot(MarketStrikess(i,:), blackvol(i, :)*100,'xk',...
plots(i,:), blackvoloutput1(:,i)*100,'b',...
plots(i,:), blackvoloutput2(:,i)*100,'r',...
MarketStrikess(i,5), blackvol(i,5)*100,'ok',...
'MarkerSize',10);
xlabel('Strike', 'FontWeight', 'bold');
ylabel('Implied Shifted Volatility (in %)', 'FontWeight', 'bold');
legend('Market Volatilities', 'Shifted SABR Model - (Method 1)',...
'Shfted SABR Model - (Method 2)', 'At-the-money volatility', 'Location', 'best');
title('Swaption volatility smile for ' + string(Exercises(i)) + 'Y' + string(m) + 'Y swaptions')
i = 11;
nexttile;
plot(MarketStrikess(i,:), blackvol(i, :)*100,'xk',...
plots(i,:), blackvoloutput1(:,i)*100,'b',...
plots(i,:), blackvoloutput2(:,i)*100,'r',...
MarketStrikess(i,5), blackvol(i,5)*100,'ok',...
'MarkerSize',10);
xlabel('Strike', 'FontWeight', 'bold');
ylabel('Implied Shifted Volatility (in %)', 'FontWeight', 'bold');
legend('Market Volatilities', 'Shifted SABR Model - (Method 1)',...
'Shfted SABR Model - (Method 2)', 'At-the-money volatility', 'Location', 'best');
title('Swaption volatility smile for ' + string(Exercises(i)) + 'Y' + string(m) + 'Y swaptions')
i=3;
figure;
t = tiledlayout(1,2);
nexttile
plot(MarketStrikess(i,:), MarketVolatilities(i, :)*100,'xk',...
plotss(i,:),voloutput1(:,i)*100,'b', ...
plotss(i,:), voloutput2(:,i)*100,'r',...
MarketStrikess(i,5), MarketVolatilities(i,5)*100,'ok',...
'MarkerSize',10);
xlabel('Strike', 'FontWeight', 'bold');
ylabel('Implied Normal Volatility (in bp)', 'FontWeight', 'bold');
legend('Market Volatilities', 'Normal SABR Model (Method 1)',...
'Normal SABR model (Method 2)', 'At-the-money volatility', 'Location', 'best');
title('Swaption volatility smile for ' + string(Exercises(i)) + 'Y' + string(m) + 'Y swaptions')
i=7;
nexttile
plot(MarketStrikess(i,:), MarketVolatilities(i, :)*100,'xk',...
plotss(i,:),voloutput1(:,i)*100,'b', ...
plotss(i,:), voloutput2(:,i)*100,'r',...
MarketStrikess(i,5), MarketVolatilities(i,5)*100,'ok',...
'MarkerSize',10);
xlabel('Strike', 'FontWeight', 'bold');
ylabel('Implied Normal Volatility (in bp)', 'FontWeight', 'bold');
legend('Market Volatilities', 'Normal SABR Model (Method 1)',...
'Normal SABR model (Method 2)', 'At-the-money volatility', 'Location', 'best');
title('Swaption volatility smile for ' + string(Exercises(i)) + 'Y' + string(m) + 'Y swaptions')
figure;
t = tiledlayout(1,2);
i=9;
nexttile
plot(MarketStrikess(i,:), MarketVolatilities(i, :)*100,'xk',...
plotss(i,:),voloutput1(:,i)*100,'b', ...
plotss(i,:), voloutput2(:,i)*100,'r',...
MarketStrikess(i,5), MarketVolatilities(i,5)*100,'ok',...
'MarkerSize',10);
xlabel('Strike', 'FontWeight', 'bold');
ylabel('Implied Normal Volatility (in bp)', 'FontWeight', 'bold');
legend('Market Volatilities', 'Normal SABR Model (Method 1)',...
'Normal SABR model (Method 2)', 'At-the-money volatility', 'Location', 'best');
title('Swaption volatility smile for ' + string(Exercises(i)) + 'Y' + string(m) + 'Y swaptions')
i=11;
nexttile
plot(MarketStrikess(i,:), MarketVolatilities(i, :)*100,'xk',...
plotss(i,:),voloutput1(:,i)*100,'b', ...
plotss(i,:), voloutput2(:,i)*100,'r',...
MarketStrikess(i,5), MarketVolatilities(i,5)*100,'ok',...
'MarkerSize',10);
xlabel('Strike', 'FontWeight', 'bold');
ylabel('Implied Normal Volatility (in bp)', 'FontWeight', 'bold');
legend('Market Volatilities', 'Normal SABR Model (Method 1)',...
'Normal SABR model (Method 2)', 'At-the-money volatility', 'Location', 'best');
title('Swaption volatility smile for ' + string(Exercises(i)) + 'Y' + string(m) + 'Y swaptions')
%
% figure;
% plot(MarketStrikes,CurrentVolatilities,'xk',...
% PlottingStrikes,ComputedVols1,'b', ...
% PlottingStrikes,ComputedVols2,'r', ...
% CurrentForwardValue,ATMVolatility,'ok',...
% 'MarkerSize',10);
%
% h = gca;
% line([0,0],[min(h.YLim),max(h.YLim)],'LineStyle','--');
%
% xlabel('Strike', 'FontWeight', 'bold');
% ylabel('Implied Normal Volatility (bps)', 'FontWeight', 'bold');
% legend('Market Volatilities', 'Normal SABR Model (Method 1)', ...
% 'Normal SABR Model (Method 2)', 'At-the-money volatility', ...
% 'Location', 'northwest');
%
% [X2, Y2] = meshgrid(PlottingStrikes, Exercises);
% figure;
% surf(volsblack1')
%
% figure;
% surf(volsblack2')
% t = tiledlayout(3,1, 'TileSpacing', 'Compact');
%
% nexttile
% surf(X1, Y1, norm'*1000);
% xlabel('Strikes')
% ylabel('Maturity');
% zlabel('Normal SABR volatility (in bp)')
% title('1 year tenor swaption surface - Normal SABR')
%
% nexttile
% surf(X1, Y1, norm2'*1000);
% xlabel('Strikes')
% ylabel('Maturity');
% zlabel('Normal SABR volatility (in bp)')
% title('2 year tenor swaption surface - Normal SABR')
%
% nexttile
% surf(X1, Y1, norm5'*1000);
% xlabel('Strikes')
% ylabel('Maturity');
% zlabel('Normal SABR volatility (in bp)')
% title('5 year tenor swaption surface - Normal SABR')
%
% figure;
% t = tiledlayout(3,1, 'TileSpacing', 'Compact');
%
% nexttile
% surf(X2, Y2, blac'*100);
% xlabel('Strikes')
% ylabel('Maturity');
% zlabel('Shifted SABR volatility (in %)')
% title('1 year tenor swaption surface - Shifted SABR')
%
% nexttile
% surf(X2, Y2, blac2'*100);
% xlabel('Strikes')
% ylabel('Maturity');
% zlabel('Shifted SABR volatility (in %)')
% title('2 year tenor swaption surface - Shifted SABR')
%
% nexttile
% surf(X2, Y2, blac5'*100);
% xlabel('Strikes')
% ylabel('Maturity');
% zlabel('Shifted SABR volatility (in %)')
% title('5 year tenor swaption surface - Shifted SABR')
%
%This changes beta parameters
% figure;
% plot(PlottingStrikes, blackvolbysabr(Alpha1, 0.7, Rho1, Nu1, Settle,...
% ExerciseDate(12), CurrentForwardValue, PlottingStrikes, 'Basis', Basis, 'Shift', Shift), 'b',...
% PlottingStrikes, betafimm, 'r',...
% PlottingStrikes, blackvolbysabr(Alpha1, 0.3, Rho1, Nu1, Settle,...
% ExerciseDate(12), CurrentForwardValue, PlottingStrikes, 'Basis', Basis, 'Shift', Shift), 'g',...
% MarketStrikes, CurrentVolatilities, 'xk',...
% CurrentForwardValue, ATMVol(12),'ok')
% xlabel('Strike', 'FontWeight', 'bold');
% ylabel('Implied Shifted Black Volatility (%)', 'FontWeight', 'bold');
% legend('Beta = 0.7', 'Beta = 0.5', 'Beta = 0.3', 'Market vol', 'ATM','Location','northeast');
%This changes nu parameters
% figure;
% plot(PlottingStrikes, blackvolbysabr(Alpha1, 0.5, Rho1, 0.9564, Settle,...
% ExerciseDate(12), CurrentForwardValue, PlottingStrikes, 'Basis', Basis, 'Shift', Shift), 'b',...
% PlottingStrikes, betafimm, 'r',...
% PlottingStrikes, blackvolbysabr(Alpha1, 0.5, Rho1, 0.15564, Settle,...
% ExerciseDate(12), CurrentForwardValue, PlottingStrikes, 'Basis', Basis, 'Shift', Shift), 'g',...
% MarketStrikes, CurrentVolatilities, 'xk',...
% CurrentForwardValue, ATMVol(12),'ok')
% xlabel('Strike', 'FontWeight', 'bold');
% ylabel('Implied Shifted Black Volatility (%)', 'FontWeight', 'bold');
% legend('Nu = 0.9564', 'Nu = 0.5564', 'Nu = 0.15564', 'Market vol', 'ATM','Location','northeast');
% %This changes alpha parameters
% figure;
% plot(PlottingStrikes, blackvolbysabr(Alpha1+0.01, 0.5, Rho1, Nu1, Settle,...
% ExerciseDate(12), CurrentForwardValue, PlottingStrikes, 'Basis', Basis, 'Shift', Shift), 'b',...
% PlottingStrikes, betafimm, 'r',...
% PlottingStrikes, blackvolbysabr(Alpha1-0.01, 0.5, Rho1, Nu1, Settle,...
% ExerciseDate(12), CurrentForwardValue, PlottingStrikes, 'Basis', Basis, 'Shift', Shift), 'g',...
% MarketStrikes, CurrentVolatilities, 'xk',...
% CurrentForwardValue, ATMVol(12),'ok')
% xlabel('Strike', 'FontWeight', 'bold');
% ylabel('Implied Shifted Black Volatility (%)', 'FontWeight', 'bold');
% legend('Alpha = ' + string(Alpha1+0.01), 'Alpha = ' + string(Alpha1), 'Alpha = ' + string(Alpha1-0.01), 'Market vol', 'ATM','Location','northeast');
%This changes rho parameters
% figure;
% plot(PlottingStrikes, blackvolbysabr(Alpha1, 0.5,-0.9, Nu1, Settle,...
% ExerciseDate(12), CurrentForwardValue, PlottingStrikes, 'Basis', Basis, 'Shift', Shift), 'b',...
% PlottingStrikes, betafimm, 'r',...
% PlottingStrikes, blackvolbysabr(Alpha1, 0.5, 0, Nu1, Settle,...
% ExerciseDate(12), CurrentForwardValue, PlottingStrikes, 'Basis', Basis, 'Shift', Shift), 'g',...
% MarketStrikes, CurrentVolatilities, 'xk',...
% CurrentForwardValue, ATMVol(12),'ok')
% xlabel('Strike', 'FontWeight', 'bold');
% ylabel('Implied Shifted Black Volatility (%)', 'FontWeight', 'bold');
% legend('Rho = ' + string(-0.9), 'Rho = ' + string(Rho1), 'Rho = ' + string(0), 'Market vol', 'ATM','Location','northeast');
%
Editor is loading...