|
|
![]() |
|
|
Financial product design and pricing |
|
|
經歷
興趣
Top |
|
Top |
|
|
Top |
|
Top |
|
HW1
function X=BSCall(S,K,r,sigma,T)
Q=(log(S/K)+(r+sigma^2/2)*T)/(sigma*sqrt(T));
W=Q-(sigma*sqrt(T));
X=S*normcdf(Q)-K*(exp(-r*T)*normcdf(W));
function X=BSPut(S,K,r,sigma,T)
Q=(log(S/K)+(r+sigma^2/2)*T)/(sigma*sqrt(T));
W=Q-(sigma*sqrt(T));
X=-S*normcdf(-Q)+K*(exp(-r*T)*normcdf(-W));
function B = PV(y,n,C)
for i=1:n
D(i)= 1/((1+y)^(i-1));
end
D*C
HW2 Deltax=50; r=0.05; t=0.5:0.5:10; sig=0.2; div=0; s=60; call_delta1= blsdelta(s,x,r,t,sig,div); call_delta2= blsdelta(s-10,x,r,t,sig,div); call_delta3= blsdelta(s-20,x,r,t,sig,div); plot(t,call_delta1,'-') hold on; plot(t,call_delta2,'-r') plot(t,call_delta3,'-g') title('Delta vs. T') xlabel('T') ylabel('Delta') legend('in the money','at the money','out of the money') axis([0 10 0 1.2]); Gamma
x=50; r=0.05; t=0.5; sig=0.2; div=0; s=30:120; call_gamma = blsgamma(s,x,r,t,sig,div); plot(s,call_gamma,'-') title('Gamma vs. s') xlabel('s') ylabel('Gamma') legend('Gamma') Theta
x=50; r=0.05; t=0.5; sig=0.2; div=0; s=30:120; [call_theta,put_theta]=blstheta(s,x,r,t,sig,div); plot(s,call_theta,'-') title('Theta vs. s') xlabel('s') ylabel('Theta') legend('Theta') Vega
x=50; r=0.05; t=0.5; sig=0.2; div=0; s=30:120; call_vega = blsvega(s,x,r,t,sig,div); plot(s,call_vega,'-') title('Vega vs. s') xlabel('s') ylabel('Vega') legend('Vega')
HW4
%Callprice.m
function [C,P] = blsprice(S0,X,r,T,sigma)
X=20:1:80;
S0=50;
r=0.08;
sigma=0.4;
T=1;
[C,P] = blsprice(S0,X,r,T,sigma);
plot(X,C,'-r');
hold on;
T=0;
[C,P] = blsprice(S0,X,r,T,sigma);
plot(X,C,'-blue');
hold on;
axis([20 80 0 25]);
title('Call price v.s. Exercise Price');
xlabel('Exercise price');
ylabel('Call price');
legend('EurCall value','內含價值(T=0)');
function [C,P] = blsprice(S0,X,r,T,sigma)
X=20:1:80;
S0=50;
r=0.08;
sigma=0.4;
T=1;
[C,P] = blsprice(S0,X,r,T,sigma);
plot(X,P,'-r');
hold on;
T=0;
[C,P] = blsprice(S0,X,r,T,sigma);
plot(X,P,'-blue');
hold on;
axis([20 80 0 25]);
title('Put price v.s. Exercise Price');
xlabel('Exercise price');
ylabel('Put price');
legend('EurPut value','內含價值(T=0)');
HW5
function [price, lattice] = LatticeAmCallDivD(S0,X,r,T,sigma,N,D,tau)
deltaT = T/N;
u=exp(sigma * sqrt(deltaT));
d=1/u;
p=(exp(r*deltaT) - d)/(u-d);
S0a=S0-D*exp(-r*tau*deltaT);
lattice = zeros(N+1,N+1);
for j=0:N
lattice(N+1,j+1)=max(0 , -X+S0a*(u^j)*(d^(N-j)));
end
for i=N-1:-1:tau
for j=0:i
lattice(i+1,j+1) = max( -X+S0a*u^j*d^(i-j) , ...
exp(-r*deltaT) *(p * lattice(i+2,j+2) + (1-p) * lattice(i+2,j+1)));
end
end
for i=tau-1:-1:0
for j=0:i lattice(i+1,j+1) = max( -X+S0a*u^j*d^(i-j)+D*exp(-r*(tau-i)*deltaT) , ...
exp(-r*deltaT) *(p * lattice(i+2,j+2) + (1-p) * lattice(i+2,j+1)));
end
end
price = lattice(1,1);
function [price, lattice] = LatticeAmCallDivP(S0,X,r,T,sigma,N,div,tau)
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 j=0:N
lattice(N+1,j+1)=max(0 , S0*(u^j)*(d^(N-j))*(1-div)-X);
end
for i=N-1:-1:tau
for j=0:i
lattice(i+1,j+1) = max(-X+S0*u^j*d^(i-j)*(1-div) , ...
exp(-r*deltaT) *(p * lattice(i+2,j+2) + (1-p) * lattice(i+2,j+1)));
end
end
for i=tau-1:-1:0
for j=0:i
lattice(i+1,j+1) = max(-X+S0*u^j*d^(i-j) , ...
exp(-r*deltaT) *(p * lattice(i+2,j+2) + (1-p) * lattice(i+2,j+1)));
end
end
price = lattice(1,1);
function [price, lattice] = LatticeEurCallDivD(S0,X,r,T,sigma,N,D,tau)
deltaT = T/N;
u=exp(sigma * sqrt(deltaT));
d=1/u;
p=(exp(r*deltaT) - d)/(u-d);
S0a=S0-D*exp(-r*tau*deltaT);
lattice = zeros(N+1,N+1);
for j=0:N
lattice(N+1,j+1)=max(0 , -X+S0a*(u^j)*(d^(N-j)));
end
for i=N-1:-1:0
for j=0:i
lattice(i+1,j+1) = exp(-r*deltaT)*...
(p*lattice(i+2,j+2)+(1-p)*lattice(i+2,j+1));
end
end
price = lattice(1,1);
function [price, lattice] = LatticeEurCallDivP(S0,X,r,T,sigma,N,div,tau)
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 j=0:N
lattice(N+1,j+1)=max(0,-X+S0*(u^j)*(d^(N-j))*(1-div));
end
for i=N-1:-1:tau
for j=0:i
lattice(i+1,j+1) = exp(-r*deltaT)*(1-div)*...
(p*lattice(i+2,j+2)+(1-p)*lattice(i+2,j+1));
end
end
for i=tau-1:-1:0
for j=0:i
lattice(i+1,j+1) = exp(-r*deltaT)*...
(p*lattice(i+2,j+2)+(1-p)*lattice(i+2,j+1));
end
end
price = lattice(1,1);
function [price, lattice] = LatticeEurPutDivD(S0,X,r,T,sigma,N,D,tau)
deltaT = T/N;
u=exp(sigma * sqrt(deltaT));
d=1/u;
p=(exp(r*deltaT) - d)/(u-d);
S0a=S0-D*exp(-r*tau*deltaT);
lattice = zeros(N+1,N+1);
for j=0:N
lattice(N+1,j+1)=max(0 , X-S0a*(u^j)*(d^(N-j)));
end
for i=N-1:-1:0
for j=0:i
lattice(i+1,j+1) = exp(-r*deltaT)*...
(p*lattice(i+2,j+2)+(1-p)*lattice(i+2,j+1));
end
end
price = lattice(1,1);
function [price, lattice] = LatticeEurPutDivP(S0,X,r,T,sigma,N,div,tau)
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 j=0:N
lattice(N+1,j+1)=max(0,X-S0*(u^j)*(d^(N-j))*(1-div));
end
for i=N-1:-1:tau
for j=0:i
lattice(i+1,j+1) = exp(-r*deltaT)*(1-div)*...
(p*lattice(i+2,j+2)+(1-p)*lattice(i+2,j+1));
end
end
for i=tau-1:-1:0
for j=0:i
lattice(i+1,j+1) = exp(-r*deltaT)*...
(p*lattice(i+2,j+2)+(1-p)*lattice(i+2,j+1));
end
end
price = lattice(1,1);
function [price, lattice] = TriAmPut(S0,X,r,T,sigma,N,lamda)
deltaT = T/N;
u=exp(lamda*sigma * sqrt(deltaT));
d=1/u;
pu=1/(2*lamda^2)+(r-(sigma^2/2))*sqrt(deltaT)/(2*lamda*sigma);
pm=1-1/(lamda^2);
pd=1-pu-pm;
lattice = zeros(N+1,2*N+1);
for j=1:N+1
lattice(N+1,j)=max(0 , -S0*(d^(N-j+1)) + X);
end
for j=N+2:2*N+1
lattice(N+1,j)=max(0 , -S0*(u^(j-N-1)) + X);
end
for i=N-1:-1:0
for j=1:2*i+1
lattice(i+1,j+1) = max( X-S0*u^j*d^(i-j) , ...
(pd * lattice(i+2,j) + pm * lattice(i+2,j+1)+ ...
pu*lattice(i+2,j+2)));
end
end
function [price, lattice] = TriEurPut(S0,X,r,T,sigma,N,lamda)
deltaT = T/N;
u=exp(lamda*sigma * sqrt(deltaT));
d=1/u;
pu=1/(2*lamda^2)+(r-(sigma^2/2))*sqrt(deltaT)/(2*lamda*sigma);
pm=1-1/(lamda^2);
pd=1-pu-pm;
lattice = zeros(N+1,2*N+1);
for j=1:N+1
lattice(N+1,j)=max(0 , -S0*(d^(N-j+1)) + X);
end
for j=N+2:2*N+1
lattice(N+1,j)=max(0 , -S0*(u^(j-N-1)) + X);
end
for i=N-1:-1:0
for j=1:2*i+1
lattice(i+1,j) = exp(-r*deltaT) * ...
(pd * lattice(i+2,j) + pm * lattice(i+2,j+1)+ ...
pu*lattice(i+2,j+2));
end
end
HW6
% BlsMCAVD.m
function [Price, CI] = BlsMCAVD(S0,X,r,T,sigma,NRepl,q)
nuT = ((r-q)-0.5*sigma^2)*T;
siT = sigma*sqrt(T);
Veps = randn(NRepl,1);
Payoff1 = max( 0 , S0*exp(nuT+siT*Veps)-X);
Payoff2 = max( 0 , S0*exp(nuT+siT*(-Veps))-X);
DiscPayoff = exp(-r*T)*0.5*(Payoff1+Payoff2);
[Price, VarPrice, CI] = normfit(DiscPayoff);
% BlsMCAVDP.m
function [Price, CI] = BlsMCAVDP(S0,X,r,T,sigma,NRepl,q)
nuT = ((r-q)-0.5*sigma^2)*T;
siT = sigma*sqrt(T);
Veps = randn(NRepl,1);
Payoff1 = max( 0 ,X-S0*exp(nuT+siT*Veps));
Payoff2 = max( 0 ,X-S0*exp(nuT+siT*(-Veps)));
DiscPayoff = exp(-r*T)*0.5*(Payoff1+Payoff2);
[Price, VarPrice, CI] = normfit(DiscPayoff);
% BlsMCAVP.m
function [Price, CI] = BlsMCAVP(S0,X,r,T,sigma,NRepl)
nuT = (r - 0.5*sigma^2)*T;
siT = sigma * sqrt(T);
Veps = randn(NRepl,1);
Payoff1 = max( 0 , X-S0*exp(nuT+siT*Veps));
Payoff2 = max( 0 , X-S0*exp(nuT+siT*(-Veps)));
DiscPayoff = exp(-r*T) * 0.5 * (Payoff1+Payoff2);
[Price, VarPrice, CI] = normfit(DiscPayoff);
% BlsMCD.m
function [Price, CI] = BlsMCD(S0,X,r,T,sigma,NRepl,q)
nuT = ((r-q)-0.5*sigma^2)*T;
siT = sigma * sqrt(T);
DiscPayoff = exp(-r*T) * max( 0 , S0*exp(nuT+siT*randn(NRepl,1)) - X);
[Price, VarPrice, CI] = normfit(DiscPayoff);
% BlsMCDP.m
function [Price, CI] = BlsMCDP(S0,X,r,T,sigma,NRepl,q)
nuT = ((r-q)-0.5*sigma^2)*T;
siT = sigma * sqrt(T);
DiscPayoff = exp(-r*T) * max( 0 ,X-S0*exp(nuT+siT*randn(NRepl,1)));
[Price, VarPrice, CI] = normfit(DiscPayoff);
% BlsMCP.m
function [Price, CI] = BlsMCP(S0,X,r,T,sigma,NRepl)
nuT = (r - 0.5*sigma^2)*T;
siT = sigma * sqrt(T);
DiscPayoff = exp(-r*T) * max( 0 ,X-S0*exp(nuT+siT*randn(NRepl,1)));
[Price, VarPrice, CI] = normfit(DiscPayoff);
% CompBlsMCAVD.m Compare blsprice and BlsMCD200000 and BlsMCAVD100000
S0=50;
X=52;
r=0.1;
T=5/12;
sigma=0.4;
q=0.05;
NRepl1=100000;
NRepl2=200000;
Bls=blsprice(S0,X,r,T,sigma,q);
randn('seed',0);
[MC200000, CI1] = BlsMCD(S0,X,r,T,sigma,NRepl2,q);
randn('seed',0);
[MCAV100000, CI2] = BlsMCAVD(S0,X,r,T,sigma,NRepl1,q);
Bls
MC200000
CI1
MCAV100000
CI2
% CompBlsMCAVD.m Compare blsprice and BlsMCD200000 and BlsMCAVD100000
S0=50;
X=52;
r=0.1;
T=5/12;
sigma=0.4;
q=0.05;
NRepl1=100000;
NRepl2=200000;
[BlsC, BlsP]=blsprice(S0,X,r,T,sigma,q);
randn('seed',0);
[MC200000, CI1] = BlsMCDP(S0,X,r,T,sigma,NRepl2,q);
randn('seed',0);
[MCAV100000, CI2] = BlsMCAVDP(S0,X,r,T,sigma,NRepl1,q);
BlsP
MC200000
CI1
MCAV100000
CI2
% ComBlsMCAVP.m Compare blsprice and BlsMc200000 and BlsMCAV100000
S0=50;
X=52;
r=0.1;
T=5/12;
sigma=0.4;
NRepl1=100000;
NRepl2=200000;
[BlsC, BlsP]=blsprice(S0,X,r,T,sigma);
randn('seed',0);
[MCP200000, CI1] = BlsMCP(S0,X,r,T,sigma,NRepl2);
randn('seed',0);
[MCAVP100000, CI2] = BlsMCAVP(S0,X,r,T,sigma,NRepl1);
BlsP
MCP200000
CI1
MCAVP100000
CI2
% ComBlsMCP.m Compare blsprice and BlsMCP1000 and BlsMCP200000
S0=50;
X=52;
r=0.1;
T=5/12;
sigma=0.4;
NRepl1=1000;
NRepl2=200000;
[BlsC, BlsP]=blsprice(S0,X,r,T,sigma);
randn('seed',0);
[MCP1000, CI1000] = BlsMCP(S0,X,r,T,sigma,NRepl1);
randn('seed',0);
[MCP200000, CI200000] = BlsMCP(S0,X,r,T,sigma,NRepl2);
BlsP
MCP1000
CI1000
MCP200000
CI200000
HW8
%BlsHaltonEurCall.m
function Price = BlsHaltonEurCall(S0,X,r,T,sigma,NPoints,Base1,Base2)
nuT = (r-0.5*sigma^2)*T;
siT = sigma*sqrt(T);
rand('seed',0);
H1 = GetHalton(ceil(NPoints/2),Base1);
H2 = GetHalton(ceil(NPoints/2),Base2);
VLog = sqrt(-2*log(H1));
Norm1 = VLog.*cos(2*pi*H2);
Norm2 = VLog.*sin(2*pi*H2);
Norm = [Norm1;Norm2];
DiscPayoff = exp(-r*T) * max( 0 , S0*exp(nuT+siT*Norm) -X );
Price = mean(DiscPayoff);
%{
S0=50;
X=52;
r=0.1;
T=5/12;
sigma=0.4;
NPoints=5000;
%}
%BlsHaltonEurPut.m
function Price = BlsHaltonEurPut(S0,X,r,T,sigma,NPoints,Base1,Base2)
nuT = (r-0.5*sigma^2)*T;
siT = sigma*sqrt(T);
rand('seed',0);
H1 = GetHalton(ceil(NPoints/2),Base1);
H2 = GetHalton(ceil(NPoints/2),Base2);
VLog = sqrt(-2*log(H1));
Norm1 = VLog.*cos(2*pi*H2);
Norm2 = VLog.*sin(2*pi*H2);
Norm = [Norm1;Norm2];
DiscPayoff = exp(-r*T) * max( 0 , X-S0*exp(nuT+siT*Norm));
Price = mean(DiscPayoff);
%{
S0=50;
X=52;
r=0.1;
T=5/12;
sigma=0.4;
NPoints=5000;
%}
function Price = BlsRandBox(S0,X,r,T,sigma,NPoints)
nuT = (r - 0.5*sigma^2)*T;
siT = sigma * sqrt(T);
% Use Box to generate standard normals
rand('seed',0);
H1 = rand(NPoints,1);
H2 = rand(NPoints,1);
VLog = sqrt(-2*log(H1));
Norm1 = VLog.*cos(2*pi*H2);
Norm2 = VLog.*sin(2*pi*H2);
Norm = [Norm1;Norm2];
DiscPayoff = exp(-r*T) * max( 0 , X - S0*exp(nuT+siT*Norm) );
Price = mean(DiscPayoff);
end
%{
S0=50;
X=52;
r=0.1;
T=5/12;
sigma=0.4;
NPoints=5000;
%}
function Price = BlsRandBoxCall(S0,X,r,T,sigma,NPoints)
nuT = (r - 0.5*sigma^2)*T;
siT = sigma * sqrt(T);
% Use Box to generate standard normals
rand('seed',0);
H1 = rand(NPoints,1);
H2 = rand(NPoints,1);
VLog = sqrt(-2*log(H1));
Norm1 = VLog.*cos(2*pi*H2);
Norm2 = VLog.*sin(2*pi*H2);
Norm = [Norm1;Norm2];
DiscPayoff = exp(-r*T) * max( 0 , S0*exp(nuT+siT*Norm) -X );
Price = mean(DiscPayoff);
end
%{
S0=50;
X=52;
r=0.1;
T=5/12;
sigma=0.4;
NPoints=5000;
%}
function Seq = GetHalton(HowMany, Base)
Seq = zeros(HowMany,1);
NumBits = 1+ceil(log(HowMany)/log(Base));
VetBase = Base.^(-(1:NumBits));
WorkVet = zeros(1,NumBits);
for i=1:HowMany
% increment last bit and carry over if necessary
j=1;
ok = 0;
while ok == 0
WorkVet(j) = WorkVet(j)+1;
if WorkVet(j) < Base
ok = 1;
else
WorkVet(j) = 0;
j = j+1;
end
end
Seq(i) = dot(WorkVet,VetBase);
end
function h=HaltonSeq(m,b)
seq=zeros(m,1);
for n=1:m
n0 = n;
h(n) = 0;
f = 1/b;
while (n0 > 0)
n1 = floor(n0/b);
r = n0 - n1*b;
h(n) = h(n)+f*r;
f = f/b;
n0=n1;
end
end
% CompRandHalton
% Rand
for i=1:1000
U1 = rand()
U2 = rand()
VLog = sqrt(-2*log(U1));
X = VLog * cos(2*pi*U2);
Y = VLog * sin(2*pi*U2);
plot(X,Y,'o');
hold on
end
title('rand Box-Muller distribution');
grid on
HW9
function C=compound(s0,K1,K2,r,T1,T2,sigma,q)
sstar=fzero(@(x) blsprice(x,K2,r,T2-T1,sigma,q)-K1,99);
a1=(log(s0/sstar)+(r-q+(sigma^2)/2)*T1)/(sigma*sqrt(T1));
a2=a1-sigma*sqrt(T1);
b1=(log(s0/K2)+(r-q+(sigma^2)/2)*T2)/(sigma*sqrt(T2));
b2=b1-sigma*sqrt(T2);
C=s0*exp(-q*T2)*binorm(a1,b1,T1,T2)-K2*exp(-r*T2)*binorm(a2,b2,T1,T2)-K1*exp(-r*T1)*normcdf(a2);
end
function Q=binorm(a,b,T1,T2)
fun=@(x,y) (1/(2*pi*sqrt(1-T1/T2)))*exp(-(1/(1-T1/T2))*(x.^2-2*sqrt(T1/T2)*x*y+y.^2)/2);
Q=dblquad(fun,-10,a,-10,b);
end
function z=integrnd(x,y)
T1=0.25;
T2=1;
z=(1/(2*pi*sqrt(1-T1/T2)))*exp(-(1/(1-T1/T2))*(x.^2-2*sqrt(T1/T2)*x*y+y.^2)/2);
end
s0=100;
K1=8;
K2=100;
r=0.1;
T1=1;
T2=1.1;
sigma=0.2;
q=0.05;
Cp=[];
Ce1=[];
for T1=1:0.005:(T2)
C=compound(s0,K1,K2,r,T1,T2,sigma,q);
Cp=[Cp;C];
Ce=blsprice(s0,K1+K2,r,T2,sigma,q);
Ce1=[Ce1;Ce];
end
Cp=[Cp;C]
Ce1=[Ce1;Ce]
plot(Cp)
hold on;
plot(Ce1,'r')
xlabel('T1');
ylabel('price');
axis([1 8 1 15]);
HW10
function Price=BlsMCO(v0,u0,r,qv,qu,T,sigmav,sigmau,N,rho)
nuvT=(r-qv-0.5*sigmav^2)*T;
nuuT=(r-qu-0.5*sigmau^2)*T;
sivT=sigmav*sqrt(T);
siuT=sigmau*sqrt(T);
[x1,x2]=cholesky(rho,N);
DiscPayoff=exp(-r*T)*max(0,v0*exp(nuvT+sivT*x1)-u0*exp(nuuT+siuT*x2));
Price=normfit(DiscPayoff);
function [x1,x2]=cholesky(rho,N)
randn('seed',0);
x1=randn(N,1);
x2=rho*x1+sqrt(1-rho^2)*randn(N,1);
end
function C=outperform(v0,u0,qv,qu,sigmav,sigmau,T,rho)
sigma=sqrt(sigmav^2+sigmau^2-2*rho*sigmav*sigmau);
d1=(log(v0/u0)+(qu-qv+(sigma^2)/2)*T)/(sigma*sqrt(T));
d2=d1-sigma*sqrt(T);
C=v0*exp(-qv*T)*normcdf(d1)-u0*exp(-qu*T)*normcdf(d2);
end
v0=30;
u0=50;
qv=0.2;
qu=0.3;
sigmav=0.25;
sigmau=0.2;
T=1;
rho=0.2;
r=0.1;
BlsO=outperform(v0,u0,qv,qu,sigmav,sigmau,T,rho)
MCO100=BlsMCO(v0,u0,r,qv,qu,T,sigmav,sigmau,100,rho)
MCO1000=BlsMCO(v0,u0,r,qv,qu,T,sigmav,sigmau,1000,rho)
MCO10000=BlsMCO(v0,u0,r,qv,qu,T,sigmav,sigmau,10000,rho)
MCO100000=BlsMCO(v0,u0,r,qv,qu,T,sigmav,sigmau,100000,rho)
HW12
% AssetPaths1.m
function SPaths=AssetPaths1(S0,mu,sigma,T,NSteps,NRepl)
dt = T/NSteps;
nudt = (mu-0.5*sigma^2)*dt;
sidt = sigma*sqrt(dt);
Increments = nudt + sidt*randn(NRepl, NSteps);
LogPaths = cumsum([log(S0)*ones(NRepl,1) , Increments] , 2);
SPaths = exp(LogPaths);
%computeLookbackMCHalton
S0=50;
X=50;
r=0.1;
T=1;
sigma=0.4;
NSteps=300;
NRepl=1000;
PMC=LookbackMC(S0,r,T,sigma,NRepl,NSteps);
PHalton = LookbackHalton(S0,r,T,sigma,NRepl,NSteps);
PMC
PHalton
% HaltonPaths.m
function SPaths=HaltonPaths(S0,mu,sigma,T,NSteps,NRepl)
dt = T/NSteps;
nudt = (mu-0.5*sigma^2)*dt;
sidt = sigma*sqrt(dt);
NRepl = 2*ceil(NRepl/2); % make sure it's even
% Use Box Muller to generate standard normals
RandMat = zeros(NRepl, NSteps);
seeds = myprimes(2*NSteps);
Base1 = seeds(1:NSteps);
Base2 = seeds((NSteps+1):(2*NSteps));
for i=1:NSteps
H1 = GetHalton(NRepl/2,Base1(i));
H2 = GetHalton(NRepl/2,Base2(i));
VLog = sqrt(-2*log(H1));
Norm1 = VLog .* cos(2*pi*H2);
Norm2 = VLog .* sin(2*pi*H2);
RandMat(:,i) = [Norm1 ; Norm2];
end
Increments = nudt + sidt*RandMat;
LogPaths = cumsum([log(S0)*ones(NRepl,1) , Increments] , 2);
SPaths = exp(LogPaths);
%LookbackOptionHalton
function P = LookbackHalton(S0,r,T,sigma,NRepl,NSteps)
Payoff = zeros(NRepl,1);
Path = HaltonPaths(S0,r,sigma,T,NSteps,NRepl);
SMax=max(Path,[],2);
Payoff = max (0, SMax-Path(NSteps+1));
[P,aux,CI] = normfit(exp(-r*T)*Payoff);
%LookbackOptionMC
function [P,CI] = LookbackMC(S0,r,T,sigma,NRepl,NSteps)
Payoff = zeros(NRepl,1);
for i=1:NRepl
Path = AssetPaths1(S0,r,sigma,T,NSteps,1);
SMax = max(Path);
Payoff(i) = max (0, SMax-Path(NSteps+1));
end
[P,aux,CI]=normfit(exp(-r*T)*Payoff);
function p = myprimes(N)
found = 0;
trynumber = 2;
p = [];
while (found < N)
if isprime(trynumber)
p = [p , trynumber];
found = found + 1;
end
trynumber = trynumber + 1;
end
HW13
% EuPutExpl1.m
function price = EuPutExpl1(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*exp(-r*dt*(N-vetj));
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) = 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
HW14
function [price,callprice,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;
callprice=zeros(M+1,N+1);
vetS=linspace(0,Smax,M+1)';
vetj=0:N;
veti=0:M;
vetT=linspace(0,T,N+1)';
callprice(:,N+1)=max(vetS-X,0);
callprice(1,:)=0;
callprice(M+1,:)=Smax-X*exp(-r*dt*(N-vetj));
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);
aux=zeros(M-1,1);
for j=N:-1:1
aux(M-1)=-c(M)*callprice(M+1,j);
%matval(2:M,j)=U\(L\(matval(2:M,j+1)+aux));
callprice(2:M,j)=coeff\(callprice(2:M,j+1)+aux);
end
idown=floor(S0/dS);
iup=ceil(S0/dS);
if idown==iup
price=callprice(idown+1,1);
else
price=callprice(idown+1,1)+(S0-idown*dS)*(callprice(idown+2,1)-callprice(idown+1,1))/dS;
end
function [C,callprice,vetS,vetT]=EurCallExp(S0,X,r,T,sigma,Smax,dS,dt)
M=round(Smax/dS);
dS=Smax/M;
N=round(T/dt);
dt=T/N;
callprice=zeros(M+1,N+1);
vetS=linspace(0,Smax,M+1)';
vetj=0:N;
veti=0:M;
vetT=linspace(0,T,N+1)';
callprice(:,N+1)=max(vetS-X,0);
callprice(1,:)=0;
callprice(M+1,:)=Smax-X*exp(-r*dt*(N-vetj));
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;
for j=N:-1:1
for i=2:M
callprice(i,j)=a(i)*callprice(i-1,j+1)+b(i)*callprice(i,j+1)+c(i)*callprice(i+1,j+1);
end
end
idown=floor(S0/dS);
iup=ceil(S0/dS);
if isequal(idown,iup)
C=callprice(idown+1,1);
else
C=callprice(idown+1,1)+(S0-(idown+1)*dS)*(callprice(iup+1,1)-callprice(iup,1))/dS;
end
S0=50;
X=50;
r=0.1;
T=5/12;
sigma=0.4;
Smax=100;
dS1=0.5;
dS2=1;
dS3=2;
dT=5/2400;
c=blsprice(S0,X,r,T,sigma);
ImpcalldS1=EuCallImpl(S0,X,r,T,sigma,Smax,dS1,dT);
ImpcalldS2=EuCallImpl(S0,X,r,T,sigma,Smax,dS2,dT);
ImpcalldS3=EuCallImpl(S0,X,r,T,sigma,Smax,dS3,dT);
c
ImpcalldS1
ImpcalldS2
ImpcalldS3
[price,callprice,vetS,vetT]=EuCallImpl(S0,X,r,T,sigma,Smax,dS1,dT);
%callprice
mesh(vetT,vetS,callprice);
ylabel('Stock price'); xlabel('Time'); title('European Call Option, Implicit Method');
S0=50;
X=50;
r=0.1;
T=5/12;
sigma=0.3;
Smax=100;
dS=2;
dT=5/1200;
[C,callprice,vetS,vetT]=EurCallExp(S0,X,r,T,sigma,Smax,dS,dT);
%callprice
C
mesh(vetT,vetS,callprice);
ylabel('Stock price'); xlabel('Time'); title('European Call Option, Explicit Method');