0% found this document useful (0 votes)
46 views21 pages

HW 12

The document discusses numerical methods for pricing American put options, including explicit, implicit, and Crank-Nicolson (CK) methods. It provides MATLAB code to implement these methods and compares the results to closed-form prices from the Black-Scholes formula. For the explicit method, it plots the option value surface over the time and stock price grid. For the implicit and CK methods, it also varies the grid sizes and time steps to examine convergence. The document concludes that the implicit and CK methods provide more accurate prices than the explicit method for American options.

Uploaded by

api-289357184
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
46 views21 pages

HW 12

The document discusses numerical methods for pricing American put options, including explicit, implicit, and Crank-Nicolson (CK) methods. It provides MATLAB code to implement these methods and compares the results to closed-form prices from the Black-Scholes formula. For the explicit method, it plots the option value surface over the time and stock price grid. For the implicit and CK methods, it also varies the grid sizes and time steps to examine convergence. The document concludes that the implicit and CK methods provide more accurate prices than the explicit method for American options.

Uploaded by

api-289357184
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 21

Homework12

103071509


Down and In call
% DOCallCK.m
function price =
DOCallCK(S0,X,r,T,sigma,Sb,Smax,dS,dt)
% set up grid and adjust increments if necessary
M = round((Smax-Sb)/dS);
dS = (Smax-Sb)/M;
N = round(T/dt);
dt = T/N;
matval = zeros(M+1,N+1);
vetS = linspace(Sb,Smax,M+1)';
vetj = 0:N;
veti = vetS / dS;
% set up boundary conditions
matval(:,N+1) = max(vetS-X,0);
matval(1,:) = 0;
matval(M+1,:) =Smax-X*exp(-r*dt*(N-vetj));
% set up the coefficients matrix
alpha = 0.25*dt*( sigma^2*(veti.^2) - r*veti );
beta = -dt*0.5*( sigma^2*(veti.^2) + r );
gamma = 0.25*dt*( sigma^2*(veti.^2) + r*veti );

M1 = -diag(alpha(3:M),-1) + diag(1-beta(2:M)) diag(gamma(2:M-1),1);


[L,U] = lu(M1);
M2 = diag(alpha(3:M),-1) + diag(1+beta(2:M)) +
diag(gamma(2:M-1),1);
% solve the sequence of linear systems
for j=N:-1:1
matval(2:M,j) = U \ (L \ (M2*matval(2:M,j+1)));
end
% find closest point to S0 on the grid and return
price
% possibly with a linear interpolation
idown = floor((S0-Sb)/dS);
iup = ceil((S0-Sb)/dS);
if idown == iup
price = matval(idown+1,1);
else
price = matval(idown+1,1) + ...
(S0-Sb-idown*dS)*(matval(idown+2,1) matval(idown+1,1))/dS;
end

% CompDICallCK.m
S0=50;
X=50;
r=0.1;
T=5/12;
sigma=0.4;
Sb=40;
Smax=100;
dS=0.5;
dT=5/2400;
DownOutCallCK=DOCallCK(S0,X,r,T,sigma,Sb,Smax,dS,dT);
[c,p]=blsprice(S0,X,r,T,sigma);
DownInCallCK=c-DownOutCallCK;
DownInCallCK

DownInCallCK =
0.6249


American Put (Explicit)
% AmPutExpl1.m
function price =
AmPutExpl1(S0,X,r,T,sigma,Smax,dS,dt)
% set up grid and adjust increments if
necessary
M = round(Smax/dS);
dS = Smax/M;
N = round(T/dt);
dt = T/N;
matval = zeros(M+1,N+1);
vetS = linspace(0,Smax,M+1)';
vetj = 0:N;
veti = 0:M;
% set up boundary conditions
matval(:,N+1) = max(X-vetS,0);
matval(1,:) = X;
matval(M+1,:) = 0;
% set up coefficients
a = 0.5*dt*(sigma^2*veti - r).*veti;
b = 1- dt*(sigma^2*veti.^2 + r);
c = 0.5*dt*(sigma^2*veti + r).*veti;

% solve backward in time


for j=N:-1:1
for i=2:M
matval(i,j) =max(XvetS(i),a(i)*matval(i-1,j+1) +
b(i)*matval(i,j+1)+ ...
c(i)*matval(i+1,j+1));
end
end
% find closest point to S0 on the grid and
return price
% possibly with a linear interpolation
idown = floor(S0/dS);
iup = ceil(S0/dS);
if idown == iup
price = matval(idown+1,1);
else
price = matval(idown+1,1) + ...
(S0-(idown+1)*dS)*(matval(iup+1,1)matval(iup,1))/dS;
end

% CompAmBlsExpl.m Compare blsprice and BlsExpl


S0=50;
X=50;
r=0.1;
T=5/12;
sigma1=0.4;
sigma2=0.3;
Smax=100;
dS1=2;
dS2=1.5;
dS3=1;
dT=5/1200;
[c1,p04]=blsprice(S0,X,r,T,sigma1);
Exps04=AmPutExpl1(S0,X,r,T,sigma1,Smax,dS1,dT);
[c2,p03]=blsprice(S0,X,r,T,sigma2);
Exps03dS2=AmPutExpl1(S0,X,r,T,sigma2,Smax,dS1,dT);
ExpdS15=AmPutExpl1(S0,X,r,T,sigma2,Smax,dS2,dT);
ExpdS1=AmPutExpl1(S0,X,r,T,sigma2,Smax,dS3,dT);
p04
Exps04
p03
Exps03dS2
ExpdS15
ExpdS1

p04 =
4.0760
Exps04 =
4.2890
p03 =
2.8446
Exps03dS2 =
3.0373
ExpdS15 =
3.6903
ExpdS1 =
2.9274e+12

% AmPutExplall.m
function [price,matval,vetS,vetT] =
AmPutExplall(S0,X,r,T,sigma,Smax,dS,dt)
% set up grid and adjust increments if
necessary
M = round(Smax/dS);
dS = Smax/M;
N = round(T/dt);
dt = T/N;
matval = zeros(M+1,N+1);
vetS = linspace(0,Smax,M+1)';
vetj = 0:N;
veti = 0:M;
vetT= linspace(0,T,N+1)';
% set up boundary conditions
matval(:,N+1) = max(X-vetS,0);
matval(1,:) = X;
matval(M+1,:) = 0;
% set up coefficients
a = 0.5*dt*(sigma^2*veti - r).*veti;
b = 1- dt*(sigma^2*veti.^2 + r);
c = 0.5*dt*(sigma^2*veti + r).*veti;

% solve backward in time


for j=N:-1:1
for i=2:M
matval(i,j) = max(X-vetS(i),a(i)*matval(i1,j+1) + b(i)*matval(i,j+1)+ ...
c(i)*matval(i+1,j+1));
end
end
% find closest point to S0 on the grid and
return price
% possibly with a linear interpolation
idown = floor(S0/dS);
iup = ceil(S0/dS);
if idown == iup
price = matval(idown+1,1);
else
price = matval(idown+1,1) + ...
(S0 - idown*dS)*(matval(idown+2,1) matval(idown+1,1))/dS;
end

% CompAmPutExpl3D.m Compare blsprice and BlsHalton


S0=50;
X=50;
r=0.1;
T=5/12;
sigma=0.3
Smax=100;
dS=2;
dT=5/1200;
[ExpdS1,matval,vetS,vetT]=AmPutExplall(S0,X,r,T,sigma,Smax,d
S,dT);
matval
ExpdS1
mesh(vetT,vetS,matval);
ylabel('Stock price'); xlabel('Time'); title('American Put Option,
Explicit Method');

% CompAmPutExpl3D.m Compare blsprice and BlsHalton


S0=50;
X=50;
r=0.1;
T=5/12;
sigma=0.3
Smax=100;
dS=1.5;
dT=5/1200;
[ExpdS1,matval,vetS,vetT]=AmPutExplall(S0,X,r,T,sigma,Smax,dS,dT);
matval
ExpdS1
mesh(vetT,vetS,matval);
ylabel('Stock price'); xlabel('Time'); title('American Put Option, Explicit
Method');

American Put (Implicit)


% AmPutImpl.m
function price =
AmPutImpl(S0,X,r,T,sigma,Smax,dS,dt)
% set up grid and adjust increments if necessary
M = round(Smax/dS);
dS = Smax/M;
N = round(T/dt);
dt = T/N;
matval = zeros(M+1,N+1);
vetS = linspace(0,Smax,M+1)';
vetj = 0:N;
veti = 0:M;
% set up boundary conditions
matval(:,N+1) = max(X-vetS,0);
matval(1,:) = X;
matval(M+1,:) = 0;
% set up the tridiagonal coefficients matrix
a = 0.5*(r*dt*veti-sigma^2*dt*(veti.^2));
b = 1+sigma^2*dt*(veti.^2)+r*dt;
c = -0.5*(r*dt*veti+sigma^2*dt*(veti.^2));
coeff = diag(a(3:M),-1) + diag(b(2:M)) +
diag(c(2:M-1),1);
[L,U] = lu(coeff);

% solve the sequence of linear systems


aux = zeros(M-1,1);
for j=N:-1:1
aux(1) = - a(2) * matval(1,j);
%matval(2:M,j) = U \ (L \ (matval(2:M,j+1) + aux));
matval(2:M,j) = max(coeff \ (matval(2:M,j+1) +
aux),X*ones(M-1,1)-vetS(2:M));
end
% find closest point to S0 on the grid and return
price
% possibly with a linear interpolation
idown = floor(S0/dS);
iup = ceil(S0/dS);
if idown == iup
price = matval(idown+1,1);
else
price = matval(idown+1,1) + ...
(S0 - idown*dS)*(matval(idown+2,1) matval(idown+1,1))/dS;
end

% CompBlsAmPutImpl.m Compare blsprice and


BlsHalton
S0=50;
X=50;
r=0.1;
T=5/12;
sigma=0.4;
Smax=100;
dS=2;
dT=5/2400;
[c,p]=blsprice(S0,X,r,T,sigma);
Impl=AmPutImpl(S0,X,r,T,sigma,Smax,dS,dT);
p
Impl

p=
4.0760
Impl =
4.2604

% CompBlsAmPutImpl.m Compare blsprice and BlsHalton


S0=50;
X=50;
r=0.1;
T=5/12;
sigma=0.4;
Smax=100;
dS=0.5;
dT=5/2400;
[c,p]=blsprice(S0,X,r,T,sigma);
Impl=AmPutImpl(S0,X,r,T,sigma,Smax,dS,dT);
p
Impl

p=
4.0760
Impl =
4.2763

% CompAmPutImpl3D.m Compare blsprice and BlsHalton


S0=50;
X=50;
r=0.1;
T=5/12;
sigma=0.3
Smax=100;
dS=2;
dT=5/1200;
[price,matval,vetS,vetT]=AmPutImplall(S0,X,r,T,sigma,Smax,dS,dT);
matval
price
mesh(vetT,vetS,matval);
ylabel('Stock price'); xlabel('Time'); title('American Put Option, Implicit
Method');

% CompAmPutImpl3D.m Compare blsprice and BlsHalton


S0=50;
X=50;
r=0.1;
T=5/12;
sigma=0.3
Smax=100;
dS=0.5;
dT=5/1200;
[price,matval,vetS,vetT]=AmPutImplall(S0,X,r,T,sigma,Smax,
dS,dT);
matval
price
mesh(vetT,vetS,matval);
ylabel('Stock price'); xlabel('Time'); title('American Put
Option, Implicit Method');

American Put (CK)


% AmDOPutCK.m
function price
=AmDOPutCK(S0,X,r,T,sigma,Sb,Smax,dS,dt)
% set up grid and adjust increments if
necessary
M = round((Smax-Sb)/dS);
dS = (Smax-Sb)/M;
N = round(T/dt);
dt = T/N;
matval = zeros(M+1,N+1);
vetS = linspace(Sb,Smax,M+1)';
vetj = 0:N;
veti = vetS / dS;
% set up boundary conditions
matval(:,N+1) = max(X-vetS,0);
matval(1,:) = 0;
matval(M+1,:) = 0;
% set up the coefficients matrix
alpha = 0.25*dt*( sigma^2*(veti.^2) - r*veti );
beta = -dt*0.5*( sigma^2*(veti.^2) + r );
gamma = 0.25*dt*( sigma^2*(veti.^2) +
r*veti );

M1 = -diag(alpha(3:M),-1) + diag(1-beta(2:M)) diag(gamma(2:M-1),1);


[L,U] = lu(M1);
M2 = diag(alpha(3:M),-1) + diag(1+beta(2:M))
+ diag(gamma(2:M-1),1);
% solve the sequence of linear systems
for j=N:-1:1
matval(2:M,j) = max(U \ (L \
(M2*matval(2:M,j+1))),X*ones(M-1,1)vetS(2:M));
end
% find closest point to S0 on the grid and
return price
% possibly with a linear interpolation
idown = floor((S0-Sb)/dS);
iup = ceil((S0-Sb)/dS);
if idown == iup
price = matval(idown+1,1);
else
price = matval(idown+1,1) + ...
(S0-Sb-idown*dS)*(matval(idown+2,1) matval(idown+1,1))/dS;
end

% CompAmDOPutCK.m Compare
blsprice and BlsHalton

DownOutPut =
0.5424

S0=50;
X=50;
DownOutPutCK =
r=0.1;
T=5/12;
4.0774
sigma=0.4;
Sb=40;
Smax=100;
dS=0.5;
dT=5/2400;
DownOutPut=DOPut(S0,X,r,T,sigma
,Sb);
DownOutPutCK=AmDOPutCK(S0,X,
r,T,sigma,Sb,Smax,dS,dT);
DownOutPut
DownOutPutCK

% AmDOPutCKall.m
function [price,matval,vetS,vetT] =
AmDOPutCKall(S0,X,r,T,sigma,Sb,Smax,dS,dt)
% set up grid and adjust increments if
necessary
M = round((Smax-Sb)/dS);
dS = (Smax-Sb)/M;
N = round(T/dt);
dt = T/N;
matval = zeros(M+1,N+1);
vetS = linspace(Sb,Smax,M+1)';
vetj = 0:N;
veti = vetS / dS;
vetT= linspace(0,T,N+1)';
% set up boundary conditions
matval(:,N+1) = max(X-vetS,0);
matval(1,:) = 0;
matval(M+1,:) = 0;
% set up the coefficients matrix
alpha = 0.25*dt*( sigma^2*(veti.^2) - r*veti );
beta = -dt*0.5*( sigma^2*(veti.^2) + r );
gamma = 0.25*dt*( sigma^2*(veti.^2) +
r*veti );
M1 = -diag(alpha(3:M),-1) + diag(1-beta(2:M)) -

diag(gamma(2:M-1),1);
[L,U] = lu(M1);
M2 = diag(alpha(3:M),-1) + diag(1+beta(2:M)) +
diag(gamma(2:M-1),1);
% solve the sequence of linear systems
for j=N:-1:1
matval(2:M,j) =max(U \ (L \
(M2*matval(2:M,j+1))),X*ones(M-1,1)vetS(2:M));
end
% find closest point to S0 on the grid and return
price
% possibly with a linear interpolation
idown = floor((S0-Sb)/dS);
iup = ceil((S0-Sb)/dS);
if idown == iup
price = matval(idown+1,1);
else
price = matval(idown+1,1) + ...
(S0 - (idown+1)*dS)*(matval(idown+2,1) matval(idown+1,1))/dS;
end

% CompAmDOPutCK3D.m Compare blsprice and BlsHalton


S0=50;
X=50;
r=0.1;
T=5/12;
sigma=0.3;
Sb=40;
Smax=100;
dS=1.5;
dT=5/1200;
[ExpdS1,matval,vetS,vetT]=AmDOPutCKall(S0,X,r,T,sigma,Sb,S
max,dS,dT);
matval
ExpdS1
mesh(vetT,vetS,matval);
ylabel('Stock price'); xlabel('Time'); title('Down and Out Put
Option');78

You might also like