Você está na página 1de 13

Homework11

101071010

EuCallExpl.m

function [price,matval,vetS,vetT] = EuCallExpl(S0,X,r,T,sigma,Smax,dS,dt)


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(vetS-X,0);
matval(1,:) = 0;
matval(M+1,:) = (Smax-X).*exp(-r*dt*(N-vetj));
% 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) = 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*dS)*(matval(idown+2,1) - matval(idown+1,1))/dS;
end

CompEuCallExpl.m

S0=50;
X=50;
r=0.1;
T=5/12;
sigma=0.3;
Smax=100;
dS=2; or dS=1.6;
dt=5/1200;
[call,put]=blsprice(S0,X,r,T,sigma);
[price,matval,vetS,vetT] = EuCallExpl(S0,X,r,T,sigma,Smax,dS,dt);
mesh(vetT,vetS,matval);
xlabel('Time');
ylabel('Stock price');
title('European Call Option, Explicit Method');
>>call=4.8851 %dS=2
>>price=4.8695 %dS=2

dS=2
European Call Option, Explicit Method

50
40
30
20
10
0
100
80

0.5
60

0.4
0.3

40

0.2

20
Stock price

0.1
0
Time

dS=1.6
European Call Option, Explicit Method

16

x 10
1.5
1
0.5
0
-0.5
-1
-1.5
-2
100

90
80
70
60
50
40
30
20
10
0
Stock price

0.05

0.1

0.15

0.2

Time

0.25

0.3

0.35

0.4

0.45

EuCallImpl.m

function [price,matval,vetS,vetT] = EuCallImpl(S0,X,r,T,sigma,Smax,dS,dt)


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(vetS-X,0);
matval(1,:) = 0;
matval(M+1,:) = (Smax-X).*exp(-r*dt*(N-vetj));
% 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));
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

CompEuCallImpl.m

S0=50;
X=50;
r=0.1;
T=5/12;
sigma=0.3;
Smax=100;
dS=2;
dt=5/1200;
[call,put]=blsprice(S0,X,r,T,sigma);
[price,matval,vetS,vetT] = EuCallImpl(S0,X,r,T,sigma,Smax,dS,dt)
mesh(vetT,vetS,matval);
xlabel('Time');
ylabel('Stock price');
title('European Call Option, Implicit Method');
>>call=4.8851
>>price=4.8266

dS=2
European Call Option, Implicit Method

50
40
30
20
10
0
100
0.5
0.4

50

0.3
0.2

Stock price

0.1
0

Time

SIGNMC.m

function [ P, Var, CI ] = SIGNMC(S0,X,r,sigma,T,NRepl)


Days = T * 250;
Payoffs = zeros(NRepl,1);
Paths = AssetPaths(S0,r,sigma,T,Days,NRepl);
for i = 1 : NRepl
Pm = mean( Paths(i,Days-32:Days-2) );
if Pm >= X
Payoffs(i) = 10 * (1+(Pm-X)/X);
else
Payoffs(i) = 10;
end
end
[P, Var, CI] = normfit(Payoffs);

SIGNbintree.m

function [ price, lattice ] = SIGNbintree(S0,X,r,sigma,T,N)


deltaT = T/N;
u = exp(sigma*sqrt(deltaT));
d = 1/u;
p = (exp(r*deltaT)-d) / (u-d);
lattice=zeros(N+1,N+1);
for i=0:N
s= S0*u^(i)*d^(N-i);
if s<X
lattice(N+1,i+1)=10;
else
lattice(N+1,i+1)=10*(1+(s-X)/X);
end
end
for i=N-1:-1:0
for j=0:i
lattice(i+1,j+1)= max(10, exp(-r*deltaT) * ( lattice(i+2,j+2)*p + lattice(i+2,j+1)*(1-p) ));
end
end
price=lattice(1,1);

CompSIGN.m

S0 = 400;
X = 336.69;
r = 0.01;
sigma = 0.4;
T = 1;
N = 5000;
NRepl = 5000;
>>signmc =12.7679
>>signbintree =12.7937

Você também pode gostar