0% found this document useful (0 votes)
93 views66 pages

Function

This document contains code for pricing financial derivatives using binomial lattice and Black-Scholes models. It includes functions to calculate European put prices using a binomial lattice, compare lattice prices to Black-Scholes prices, and calculate American call prices using a lattice approach versus the Black-Scholes model. The code contains examples of pricing options, calculating Greeks, and analyzing option strategies like spreads and combinations.

Uploaded by

api-616455436
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)
93 views66 pages

Function

This document contains code for pricing financial derivatives using binomial lattice and Black-Scholes models. It includes functions to calculate European put prices using a binomial lattice, compare lattice prices to Black-Scholes prices, and calculate American call prices using a lattice approach versus the Black-Scholes model. The code contains examples of pricing options, calculating Greeks, and analyzing option strategies like spreads and combinations.

Uploaded by

api-616455436
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/ 66

金融商品與設計評價作業

110071602 劉軒瑜
第二週作業

%BS.m
function [C,P]=BS(S0,X,r,sigma,T,q)
d1=(log(S0/X)+(r-q+sigma^2/2)*T)/(sigma*sqrt(T));
d2=d1-(sigma*sqrt(T));

%BS_input.m
C=S0*exp(-q*T)*normcdf(d1)-X*exp(-r*T)*normcdf(d2);
P=X*exp(-r*T)*normcdf(-d2)-S0*exp(-q*T)*normcdf(-d1);
S0=input("S0=");
X=input("X=");
r=input("r=")
T=input("T=")
sigma=input("sigma=")
q=input("q=")

[C,P]=BS(S0,X,r,sigma,T,q)
[c,p]=blsprice(S0,X,r,sigma,T,q)
%pv.m
function x=pv(y,n,Ct)
x=0;
d=1+y;
for i=1:n;
x=x+Ct(i)/d;
d=d*(1+y);
end

%pv_input.m
y=input("y=")
n=input("n=")
Ct=input("Ct=")

x=pv(y,n,Ct)
第三週作業
%pvrate.m
n=3
Ct=[10 10 110]

for y=0:0.001:0.5;
x=pv(y,n,Ct);
plot(y,x,'.blue');
hold on;
end
grid on;
title('bond price');
xlabel('r');
ylabel('bond price');
axis([0 0.5 40 130]);
%plotlongcall.m
X=50;
c=2;
St=40:0.05:60;
subplot(2,2,1);
plot(St,max(St-X,0)-c);
title('long call');
xlabel('S');
ylabel('profit');
axis([40 60 -10 10]);

subplot(2,2,2);
plot(St,c-max(St-X,0));
title('short call');
xlabel('S');
ylabel('profit');
axis([40 60 -10 10]);

subplot(2,2,3);
plot(St,max(X-St,0)-c);
title('long put');
xlabel('S');
ylabel('profit');
axis([40 60 -10 10]);

subplot(2,2,4);
plot(St,c-max(X-St,0));
title('short put');
xlabel('S');
ylabel('profit');
axis([40 60 -10 10]);
%DeltaBLS.m
x=50;
r=0.05;
t=0.5;
sig=0.2;
div=0;
s=30:120;

subplot(2,2,1)
[call_delta,put_delta]=blsdelta(s,x,r,t,sig,div);

plot(s,call_delta,'-');
title('Delta vs.s');
xlabel('s');
ylabel('Delta');
legend('Delta');

subplot(2,2,2)
[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');

subplot(2,2,3)
call_gamma=blsgamma(s,x,r,t,sig,div);

plot(s,call_gamma,'-');
title('Gamma vs.s');
xlabel('s');
ylabel('Gamma');
legend('Gamma');

subplot(2,2,4)
call_vega=blsvega(s,x,r,t,sig,div);

plot(s,call_vega,'-');
title('Vega vs.s');
xlabel('s');
ylabel('Vega');
legend('Vega')
%deltavst.m
x=50;
r=0.05;
t=0.05:0.01:0.5;
sig=0.2;
div=0;
s=30;

[call_delta,put_delta]=blsdelta(s,x,r,t,sig,div);
grid on;
plot(t,call_delta,'-');
title('Delta vs.t');
xlabel('t');
ylabel('Delta');
legend('Delta');
第四週作業
% protective_call.m protective call
c = 2;
X = 100;
S0 = 90:1:110;
plot(S0, 100-S0, "--");
hold on;
plot(S0, max(S0-X, 0)-c, '.');
plot(S0, 100-S0 + max(S0-X, 0)-c);
grid on;
title('protective call');
xlabel('S0');
ylabel('payoff');
legend('short stock', 'long call', 'protective call',
'Location','southwest')
% covered_put.m Covered put
p = 2;
X = 100;
S0 = 90:1:110;
plot(S0, 100-S0, '--');
hold on;
plot(S0, -(max(X-S0, 0)-p), '.');
plot(S0, 100-S0 - (max(X-S0, 0)-p));
grid on;
title('covered put');
xlabel('S0');
ylabel('profit');
legend('short stock', 'short put', 'covered put',
'Location','northeast')
% bull_spread_arbitrary.m bull spread call 套利
c1=1; c2=3;
X1=100; X2=105;
S0=95:1:110;
plot(S0, max(S0-X1, 0)-c1, '--');
hold on;
plot(S0, -(max(S0-X2, 0)-c2), '.');
plot(S0, max(S0-X1, 0)-c1-(max(S0-X2, 0)-c2));
grid on;
title('bull spread');
xlabel('S0');
ylabel('profit');
plot(S0, zeros(1,16), 'black')
% bull_spread_loss.m bull spread call 虧錢
c1=7; c2=1;
X1=100; X2=105;
S0=95:1:110;
plot(S0, max(S0-X1, 0)-c1, '--');
hold on;
plot(S0, -(max(S0-X2, 0)-c2), '.');
plot(S0, max(S0-X1, 0)-c1-(max(S0-X2, 0)-c2));
grid on;
title('bull spread');
xlabel('S0');
ylabel('profit');
plot(S0, zeros(1,16), 'black')
% bull_spread.m bull spread put
subplot(2,2,1);
c1=3; c2=1;
X1=100; X2=105;
S0=95:1:110;
plot(S0, max(S0-X1, 0)-c1, '--'); % long call
hold on;
plot(S0, -(max(S0-X2, 0)-c2), '.'); % short call
plot(S0, max(S0-X1, 0)-c1-(max(S0-X2, 0)-c2));
grid on;
title('bull spread(call)');
xlabel('S0');
ylabel('profit');
axis([95 110 -4 4]);
plot(S0, zeros(1,16), 'black');

subplot(2,2,2);
p1=1; p2=3;
X1=100; X2=105;
S0=95:1:110;
plot(S0, max(X1-S0,0)-p1, '--'); %long put
hold on;
plot(S0, -(max(X2-S0,0)-p2), '.'); % short put
plot(S0, max(X1-S0, 0)-p1-(max(X2-S0, 0)-p2));
grid on;
title('bull spread(put)');
xlabel('S0');
ylabel('profit');
axis([95 110 -4 4]);
plot(S0, zeros(1,16), 'black')

subplot(2,2,3)
p1=3; p2=1;
X1=105; X2=100;
S0=95:1:110;
plot(S0, max(X1-S0,0)-p1, '--'); %long put
hold on;
plot(S0, -(max(X2-S0,0)-p2), '.'); % short put
plot(S0, max(X1-S0, 0)-p1-(max(X2-S0, 0)-p2));
grid on;
title('bear spread(put)');
xlabel('S0');
ylabel('profit');
axis([95 110 -4 4]);
plot(S0, zeros(1,16), 'black')
subplot(2,2,4)
c1=1; c2=3;
X1=105; X2=100;
S0=95:1:110;
plot(S0, max(S0-X1, 0)-c1, '--'); % long call
hold on;
plot(S0, -(max(S0-X2, 0)-c2), '.'); % short call
plot(S0, max(S0-X1, 0)-c1-(max(S0-X2, 0)-c2));
grid on;
title('bear spread(call)');
xlabel('S0');
ylabel('profit');
axis([95 110 -4 4]);
plot(S0, zeros(1,16), 'black')
% condor.m condor call
c1 = 2; c2 = 2; c3 = 4; c4 = 4;
X1 = 70; X2 = 80; X3 = 130; X4 = 140;
S0 = 50:1:160;
plot(S0, max(S0-X1, 0)-c1, '--'); % long call
hold on;
plot(S0, -(max(S0-X2,0)-c2), '-'); % short call
plot(S0, -(max(S0-X3,0)-c3), '.'); % short call
plot(S0, max(S0-X4, 0)-c4, '+'); % long call
plot(S0, max(S0-X1, 0)-c1 -(max(S0-X2,0)-c2) -(max(S0-X3,0)-c3) + max(S0-X4, 0)-c4, '*');
grid on;
title(['condor(call)']);
xlabel('S0');
ylabel('profit');
axis([55 160 -11 11])
plot(S0, zeros(1,111), 'black');
% diagonal spread
c1 = 3; c2 = 2;
S0 = 100; X1 = 100; X2 = 95; r = 0.02; T = 0.1; sigma = 0.2;
S0 = 90:1:110;
[m, n] = size(S0);
for i = 1:n;
[C(i), P(i)] = blsprice(S0(i), X1, r, T, sigma);
end
plot(S0, C-c2, '--'); % long call
hold on;
plot(S0, -(max(S0-X1, 0)- c1), '.'); % short call
plot(S0, C-c2-(max(S0-X2, 0)- c1));
grid on;
title('diagonal spread');
xlabel('S0');
ylabel('profit');
plot(S0, zeros(1,21), 'black');
第五週作業
% Stock_strangle.m CMBO: Stock Index and strangle
X1=55;
X2=50;
c=2;
St=40:0.05:60;
plot(St,(-max(St-X1,0))+c+(-max(X2-St,0)+c), '.'); % short strangle(short call+short put)
hold on;
plot(St, St-X2, '--'); %long stock
plot(St, St-X2+(-max(St-X1,0))+c+(-max(X2-St,0)+c),
'-');

grid on;
title('CMBO');
xlabel('S0');
ylabel('profit');
legend({'short strangle', 'long stock', 'CMBO'},
'Location', 'SouthEast');
% BXM_Put.m BXM and Put
X1=50;
X2=45;
c=2;
St=40:0.1:60;
plot(St,-max(X2-St,0)+c, '.'); % short put
hold on;
plot(St, St-X2+(c-max(St-X1,0)), '--'); %BXM (long stock + short call)
plot(St, -max(X2-St,0)+c + St-X2 + c-max(St-X1,0), '-');

grid on;
title('CMBO');
xlabel('S0');
ylabel('profit');
legend({'short put', 'BXM', 'CMBO'}, 'Location',
'SouthEast');
% butterfly_spread_and_BS.m
c1 = 6; c2 = 3; c3 = 1;
X1 = 95; X2 = 100; X3 = 105;
S0 = 90:1:115;

r = 0.02; T1 = 0.05; T2 = 0.1; sigma = 0.2;


[m, n] = size(S0);
for i = 1:n;
[C11(i), P1(i)] = blsprice(S0(i), X1, r, T1, sigma);
[C21(i), P2(i)] = blsprice(S0(i), X2, r, T1, sigma);
[C31(i), P3(i)] = blsprice(S0(i), X3, r, T1, sigma);
[C12(i), P1(i)] = blsprice(S0(i), X1, r, T2, sigma);
[C22(i), P2(i)] = blsprice(S0(i), X2, r, T2, sigma);
[C32(i), P3(i)] = blsprice(S0(i), X3, r, T2, sigma);

end
plot(S0, max(S0-X1, 0)-c1 + max(S0-X3, 0)-c3-2*(max(S0-X2, 0)-c2));%T=0
hold on;
plot(S0, (C11-c1)-2*(C21-c2)+(C31-c3), '--'); %T=0.05
plot(S0, (C12-c1)-2*(C22-c2)+(C32-c3), '.'); %T=0.1

grid on;
title('butterfly spread');
xlabel('S0');
ylabel('profit');
legend({'t=0', 't=0.05', 't=0.1'}, 'Location', 'NorthEast');
axis([90 115 -2 5 ]);
第六週作業
% LatticeEurPut.m The CRR Tree-European put option
function [price, lattice] = LatticeEurPut(S0, X, r, T, sigma, 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 j = 0:N
lattice(N+1, j+1)=max(0, X - S0*(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);
% CompLatticeBLSPut.m
S0 = 50;
X = 50;
r = 0.1;
sigma = 0.4;
T = 5/12;
N = 50;
[BlsC,BlsP] = blsprice(S0, X, r, T, sigma);
LatticeP = zeros(1, N);
for i = (1:N)
LatticeP(i)= LatticeEurPut(S0, X, r, T, sigma, i);
end
plot(1:N, ones(1,N)*BlsP);
hold on;
plot(1:N, LatticeP);
title('ComLatticBlsPut');
% LatticeAmCallvsBLS.m
S0 = 50;
X = 50;
r = 0.02;
T = 1;
sigma = 0.2;
N = 10;
div = 0.1;
tau = 3;

% LatticeAmCall vs BLS
subplot(1,2,1);
[BlsC,BlsP] = blsprice(S0, X, r, T, sigma);
LatticeC = zeros(1, N);
for i = (1:N)
LatticeC(i)= LatticeAmCall(S0, X, r, T, sigma, i);
end
plot(1:N, ones(1,N)*BlsC);
hold on;
plot(1:N, LatticeC);
title('LatticeAmCallvsBLS');
% LatticeEurCall
subplot(1,2,2);
[BlsC,BlsP] = blsprice(S0, X, r, T, sigma);
LatticeC = zeros(1, N);
for i = (1:N)
LatticeC(i)= LatticeEurCall(S0, X, r, T, sigma, i);
end
plot(1:N, ones(1,N)*BlsC);
hold on;
plot(1:N, LatticeC);
title('LatticeEurCallvsBLS');
% Dividend.m
S0 = 50;
X = 50;
r = 0.1;
sigma = 0.4;
T = 5/12;
N = 50;
q=0:0.1:1;
[m,n]=size(q);

for i = 1:n
Lattice_Am(i) = LatticeAmCall_q(S0, X, r, T, sigma, N, q(i));
Lattice_Eur(i) = LatticeEurCall_q(S0, X, r, T, sigma, N, q(i));
end

plot(q, Lattice_Am);
hold on;
plot(q, Lattice_Eur);
title('Dividend');
legend({'LatticeAmCall+q', 'LatticeEurCall+q'}, 'Location', ['SouthWest']);
第七週作業
% LatticeEurCallDivP.m dividend proportion
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, 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) = 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) = exp(-r*deltaT)...
*(p*lattice(i+2, j+2)+(1-p)*lattice(i+2, j+1));
end
end
price = lattice(1,1);

% LatticeAmCallDivP.m
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(S0*u^j*d^(i-j)*(1-div)-X,...
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(S0*u^j*d^(i-j)-X,...
exp(-r*deltaT)*(p*lattice(i+2, j+2)+(1-p)*lattice(i+2, j+1)));
end
end
price = lattice(1,1);

% LatticeEurPutDivP.m
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)...
*(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);

% LatticeEurCallDivD.m Dividend dollar EurCall


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, S0a*(u^j)*(d^(N-j))-X);
end
for i = N-1:-1:tau
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
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);

% LatticeAmCallDivD.m Dividend dollar AmCall


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, S0a*(u^j)*(d^(N-j))-X);
end
for i = N-1:-1:tau
for j = 0:i
lattice(i+1, j+1) = max(S0a*(u^j)*(d^(i-j))-X,...
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(S0a*(u^j)*(d^(i-j))-X-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);

% LatticeEurPutDivD.m Dividend dollar EurPut


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:tau
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
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);
第九週作業
% TriEurPut.m Trinomial Tree for European Put 4/12hw1
function [price, lattice] = TriEurPut(S0, X, r, T, sigma, N, lambda)
deltaT = T/N;
u = exp(lambda * sigma * sqrt(deltaT));
d = exp(-lambda * sigma * sqrt(deltaT));
mu = r - (sigma^2/2);
Pu = 1/(2*lambda^2) + (mu * sqrt(deltaT))/(2 * lambda* sigma);
Pm = 1 - 1/(lambda^2);
Pd = 1- Pu -Pm;
lattice = zeros(N+1, 2*N+1);

for j = 1:N+1
lattice(N+1, j) = max(0, X-S0*(d^(N-j+1)));
end
for j = N+2: 2*N+1
lattice(N+1, j) = max(0, X-S0*(u^(j-N-1)));
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
price = lattice(1,1);

% TriAmPut.m Trinomial Tree for European Put 4/12hw2


function [price, lattice] = TriAmPut(S0, X, r, T, sigma, N, lambda)
deltaT = T/N;
u = exp(lambda * sigma * sqrt(deltaT));
d = exp(-lambda * sigma * sqrt(deltaT));
mu = r - (sigma^2/2);
Pu = 1/(2*lambda^2) + (mu * sqrt(deltaT))/(2 * lambda* sigma);
Pm = 1 - 1/(lambda^2);
Pd = 1- Pu -Pm;
lattice = zeros(N+1, 2*N+1);

for j = 1:N+1
lattice(N+1, j) = max(0, X-S0*(d^(N-j+1)));
end
for j = N+2: 2*N+1
lattice(N+1, j) = max(0, X-S0*(u^(j-N-1)));
end
for i = N-1:-1:0
for j = 1:2*i+1
p = max(X-S0*(d^(N-j+1)), X-S0*(u^(j-N-1)));
lattice(i+1, j) = max(p, exp(-r*deltaT)*...
(Pd*lattice(i+2, j) + Pm*lattice(i+2, j+1) +...
Pu*lattice(i+2, j+2)));
end
end
price = lattice(1,1);
第十週作業
% ComBlsMc_P.m European put 4/19 hw1
S0 = 50;
X = 52;
r = 0.1;
T = 5/12;
sigma = 0.4;
NRepl1 = 1000;
NRepl2 = 200000;

Bls = blsprice(S0, X, r, T, sigma);


randn('seed', 0);
[MC1000, Pl1000] = BlsMC_P(S0, X, r, T, sigma, NRepl1);
randn('seed', 0);
[MC200000, Pl200000] = BlsMC_P(S0, X, r, T, sigma, NRepl2);

Bls
MC1000
Pl1000
MC200000
Pl200000
% BlsMC_P.m BlsMC-Put
function[Price, Pl] = BlsMC_P(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, Pl] = normfit(DiscPayoff);

%compBlsMCAV_P.m
S0 = 50;
X = 52;
r = 0.1;
T = 5/12;
sigma = 0.4;
NRepl1 = 200000;
NRepl2 = 100000;

Bls = blsprice(S0, X, r, T, sigma);


randn('seed', 0);
[MC_P1, Pl1] = BlsMC_P(S0, X, r, T, sigma, NRepl1);
randn('seed', 0);
[MCAV_P2, Pl2] = BlsMCAV_P(S0, X, r, T, sigma, NRepl2);
Bls
MC_P1
Pl1
MCAV_P2
Pl2

% BlsMCAV_P
function [Price, Cl] = BlsMCAV_P(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, Cl] = normfit(DiscPayoff);
第十三週作業
% LatticeAmPut_5.m 莎莉美公司 二項是模式評估五年期選擇權

function [price, lattice] = LatticeAmPut_5(S0, X1, X2, X3, X4, par, r, T, sigma, N)
deltaT = T/N;
n = N/5;
strike = [X1, X2, X3, X4];
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(par, X4 - S0*(u^j)*(d^(N-j)));
end

for i = N-1:-1:N-n
for j = 0:i
lattice(i+1, j+1) = max(X4 - S0*(u^j)*(d^(N-j)), ...
exp(-r*deltaT)*(p * lattice(i+2, j+2) + (1-p)*lattice(i+2, j+1)));
end
end
for i = N-n-1:-1:N-2*n
for j = 0:i
lattice(i+1, j+1) = max(X3 - S0*(u^j)*(d^(N-j)), ...
exp(-r*deltaT)*(p * lattice(i+2, j+2) + (1-p)*lattice(i+2, j+1)));
end
end

for i = N-2*n-1:-1:N-3*n
for j = 0:i
lattice(i+1, j+1) = max(X2 - S0*(u^j)*(d^(N-j)), ...
exp(-r*deltaT)*(p * lattice(i+2, j+2) + (1-p)*lattice(i+2, j+1)));
end
end

for i = N-3*n-1:-1:0
for j = 0:i
lattice(i+1, j+1) = max(X1 - S0*(u^j)*(d^(N-j)), ...
exp(-r*deltaT)*(p * lattice(i+2, j+2) + (1-p)*lattice(i+2, j+1)));
end
end

price = lattice(1,1);
end

%LAMP5_input.m
S0 = 1/131.75;
X1 = 1/131.75;
X2 = 1/129.50;
X3 = 1/127.00;
X4 = 1/124.50;
par = 9.25;
r = 0.001;
sigma = 0.5;
T = 5;
N = 100;

PUT = LatticeAmPut_5(S0, X1, X2, X3, X4, par, r, T, sigma, N)

% MCIntegration2.m

rand('seed', 0);
N = 1000;
meanexp = zeros(1, N);
for i = (1:N)
meanexp(i) = 2 * mean(exp(2 * rand(1, i)));
end

exp = exp(2) - 1
exp10 = meanexp(10)
exp100 = meanexp(100)
exp1000 = meanexp(1000)
plot(1:N, meanexp);
第十四週作業
% Halton + Box Muller
function Price = HaltonBox_put(S0, X, r, T, sigma, Npoints, Base1, Base2)

nuT = (r - 0.5 * sigma^2) * T;


siT = sigma * sqrt(T);

% HaltonBox_put.m Use Box Muller to generate standard normals


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);
% ComHaltonBox_put.m
S0=50;
X=52;
r=0.1;
T=5/12;
sigma=0.4;
NRepl=5000;
Base11=2;Base12=7;
Base21=11;Base22=7;
Base31=2;Base32=4;

[call, put]=blsprice(S0,X,r,T,sigma);
Halton27 = BlsHalton_put(S0,X,r,T,sigma,NRepl,Base11,Base12);
Halton117 = BlsHalton_put(S0,X,r,T,sigma,NRepl,Base21,Base22);
Halton24 = BlsHalton_put(S0,X,r,T,sigma,NRepl,Base31,Base32);

put
Halton27
Halton117
Halton24
% Haltoncdf_put.m
% Halton + cdf
function Price = Haltoncdf_put(S0, X, r, T, sigma, Npoints, Base1, Base2)

nuT = (r - 0.5 * sigma^2) * T;


siT = sigma * sqrt(T);

% Use Box Muller to generate standard normals


H1 = GetHalton(ceil(Npoints/2), Base1);
H2 = GetHalton(ceil(Npoints/2), Base2);

Norm1 = norminv(H1);
Norm2 = norminv(H2);
Norm = [Norm1 ; Norm2];

DiscPayoff = exp(-r*T) * max(0, X - S0*exp(nuT + siT * Norm));


Price = mean(DiscPayoff);

% CompHaltoncdf.m
S0=50;
X=52;
r=0.1;
T=5/12;
sigma=0.4;
NRepl=5000;
Base11=2;Base12=7;
Base21=11;Base22=7;
Base31=2;Base32=4;

[call, put]=blsprice(S0,X,r,T,sigma);
Halton27 = Haltoncdf_put(S0,X,r,T,sigma,NRepl,Base11,Base12);
Halton117 = Haltoncdf_put(S0,X,r,T,sigma,NRepl,Base21,Base22);
Halton24 = Haltoncdf_put(S0,X,r,T,sigma,NRepl,Base31,Base32);

put
Halton27
Halton117
Halton24
% randBox_put.m
% Random + Box Muller
function Price = randBox_put(S0, X, r, T, sigma, Npoints)

nuT = (r - 0.5 * sigma^2) * T;


siT = sigma * sqrt(T);

% Use Random to generate standard normals


H1 = rand(ceil(Npoints/2), 1);
H2 = rand(ceil(Npoints/2), 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);

% ComrandBox.m
S0=50;
X=52;
r=0.1;
T=5/12;
sigma=0.4;
NRepl=5000;

[call, put]=blsprice(S0,X,r,T,sigma);
rand = randBox_put(S0,X,r,T,sigma,NRepl);

put
rand
% randcdf_put.m
% Rand + cdf
function Price = randcdf_put(S0, X, r, T, sigma, Npoints)

nuT = (r - 0.5 * sigma^2) * T;


siT = sigma * sqrt(T);

% Use Random to generate standard normals


H1 = rand(ceil(Npoints/2), 1);
H2 = rand(ceil(Npoints/2), 1);

Norm1 = norminv(H1);
Norm2 = norminv(H2);
Norm = [Norm1 ; Norm2];

DiscPayoff = exp(-r*T) * max(0, X - S0*exp(nuT + siT * Norm));


Price = mean(DiscPayoff);

% Comprandcdf
S0=50;
X=52;
r=0.1;
T=5/12;
sigma=0.4;
NRepl=5000;

[call, put]=blsprice(S0,X,r,T,sigma);
rand = randcdf_put(S0,X,r,T,sigma,NRepl);

put
rand
第十五週作業
%DOPutMCCV.m
function [P,Cl,NCrossed] = DOPutMCCV(S0,x,r,T,sigma,Sb,NRepl,NPilot)

nuT = (r - 0.5*sigma^2) * T;
siT = sigma * sqrt(T);

Payoff1 = zeros(NPilot,1);
Payoff2 = zeros(NRepl,1);
NCrossed = 0;

% compute parameters
StockVals = S0*exp(nuT+siT*randn(NPilot,1));
for i = 1:NPilot
crossed = any (StockVals(i)<=Sb);

% 未跨過,傳統 put
if crossed == 0
Payoff1(i) = max(0,x-StockVals(i));
% 跨過
else
Payoff1(i) = 0;
NCrossed = NCrossed+1;
end
end

OptionVals = exp(-r*T) * Payoff1;

MatCov = zeros(2,2);
MatCov = cov(StockVals, OptionVals);
VarY = S0^2 * exp(2*r*T) * (exp(T * sigma^2) - 1);
c = - MatCov(1,2) / VarY;
ExpY = S0 * exp(r*T);

% simulation
NCrossed = 0;
NewStockVals = S0*exp(nuT+siT*randn(NRepl,1));

for i=1:NRepl
crossed = any(NewStockVals(i) <= Sb);

if crossed == 0
Payoff2(i) = max(0, x -NewStockVals(i));
else
Payoff2(i) = 0;
NCrossed = NCrossed + 1;
end
end

NewOptionVals = mean(exp(-r*T) * Payoff2);

ControlVars = NewOptionVals + c * (NewStockVals - ExpY);


[P,VarPrice,Cl] = normfit(ControlVars);

End

% CompDOPutMCCV.m
clear;

S0 = 50;
X = 50;
r = 0.1;
T = 2/12;
sigma = 0.4;
Sb = 40;
NSteps = 60;
NRepl = 50000;
NPilot = 5000;
randn('seed',0);

[DOPutMC,CI1,NCrossed1] = DOPutMC(S0,X,r,T,sigma,Sb,NSteps,NRepl);
[DOPutMCCV,CI2,NCrossed2]=DOPutMCCV(S0,X,r,T,sigma,Sb,NRepl,NPilot);

DOPutMC
DOPutMCCV
CI2
NCrossed2

%HaltonDOPut.m
function [Price,Cl,NCrossed] = HaltonDOPut(S0,X,r,T,sigma,Sb,NPoints,Base1,Base2)

nuT = (r - 0.5*sigma^2)*T;
siT = sigma * sqrt(T);

% Use Box Muller to generate standard normals


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];

% Generate asset paths


Payoff = zeros(NPoints,1);
NCrossed = 0;
for i=1:NPoints
Path=S0*exp(nuT+siT*Norm);
crossed = any(Path <= Sb);
if crossed == 0
Payoff(i) = max(0, X - Path(NPoints));
else
Payoff(i) = 0;
NCrossed = NCrossed + 1;
end
end

[Price,VarPrice,Cl] = normfit(ControlVars);

end
% UOCallMCCondIS.m
function [Cuo,Cl,NCrossed] = UOCallMCCondIS(S0,x,r,T,sigma,Sb,NSteps,NRepl,bp)

dt = T/NSteps;
nudt = (r-0.5*sigma^2)*dt;
b = bp*nudt;
sidt = sigma * sqrt(dt);
[Call,Put] = blsprice(S0,x,r,T,sigma);

% Generate asset paths and payoff for the down and in option
NCrossed = 0;
Payoff = zeros(NRepl,1);
Times = zeros(NRepl,1);
StockVals = zeros(NRepl,1);
ISRatio = zeros(NRepl,1);

for i = 1:NRepl

% generate normal
vetZ = nudt -b +sidt*randn(1,NSteps);
LogPath = cumsum([log(S0),vetZ]);
Path = exp(LogPath);
tcrossed = min(find(Path>=Sb));
if not(isempty(tcrossed))
NCrossed = NCrossed+1;
TBreach = tcrossed-1;
Times(NCrossed) = TBreach*dt;
StockVals(NCrossed) = Path(tcrossed);

ISRatio(NCrossed) = exp(TBreach * b^2/2/sigma^2/dt +...


b/sigma^2/dt *sum(vetZ(1:TBreach)) - TBreach * b/sigma^2*(r-sigma^2/2));
end

end

if (NCrossed>0)
[Caux,Paux] = blsprice(StockVals(1:NCrossed),x,r,T-Times(1:NCrossed),sigma);
Payoff(1:NCrossed) = exp(-r*Times(1:NCrossed)) .* Caux .* ISRatio(1:NCrossed);
end

[Cuo,aux,Cl] = normfit(Call - Payoff);

end
%UOCallMCCond.m
function [Cuo,Cl,NCrossed] = UOCallMCCond(S0,x,r,T,sigma,Sb,NSteps,NRepl)

dt = T/NSteps;
[Call,Put] = blsprice(S0,x,r,T,sigma);

% Generate asset paths and payoff for the down and in option
NCrossed = 0;
Payoff = zeros(NRepl,1);
Times = zeros(NRepl,1);
StockVals = zeros(NRepl,1);

for i = 1:NRepl
Path = AssetPaths1(S0,r,sigma,T,NSteps,1);
tcrossed = min(find(Path>=Sb));

if not(isempty(tcrossed))
NCrossed = NCrossed+1;
Times(NCrossed) = (tcrossed-1)*dt;
StockVals(NCrossed) = Path(tcrossed);

end
end
if (NCrossed>0)
[Caux,Paux] = blsprice(StockVals(1:NCrossed),x,r,T-Times(1:NCrossed),sigma);
Payoff(1:NCrossed) = exp(-r*Times(1:NCrossed)) .* Caux;
end

[Cuo,aux,Cl] = normfit(Call - Payoff);

end

%UOCallMC.m
function [P,Cl,NCrossed] = UOCallMC(S0,x,r,T,sigma,Sb,NSteps,NRepl)

% Generate asset paths


Payoff = zeros(NRepl,1);
NCrossed = 0;

% simulation
for i = 1:NRepl
Path = AssetPaths1(S0,r,sigma,T,NSteps,1);
crossed = any (Path>=Sb);

% 未跨過,傳統 put
if crossed == 0
Payoff(i) = max(0,Path(NSteps+1)-x);
% 跨過
else
Payoff(i) = 0;
NCrossed = NCrossed+1;
end

end

[P,aux,Cl] = normfit(exp(-r*T)*Payoff);

end
% UOCall.m
function C = UOCall(S0,X,r,T,sigma,Sb)

a = (Sb/S0) ^ (-1+(2*r/sigma^2)) ;
b = (Sb/S0) ^ ( 1+(2*r/sigma^2)) ;

d1 = (log(S0/X ) + (r + sigma^2/2)*T) / (sigma*sqrt(T));


d2 = (log(S0/X ) + (r - sigma^2/2)*T) / (sigma*sqrt(T));
d3 = (log(S0/Sb) + (r + sigma^2/2)*T) / (sigma*sqrt(T));
d4 = (log(S0/Sb) + (r - sigma^2/2)*T) / (sigma*sqrt(T));
d5 = (log(S0/Sb) - (r - sigma^2/2)*T) / (sigma*sqrt(T));
d6 = (log(S0/Sb) - (r + sigma^2/2)*T) / (sigma*sqrt(T));
d7 = (log(S0*X/Sb^2) - (r - sigma^2/2)*T) / (sigma*sqrt(T));
d8 = (log(S0*X/Sb^2) - (r + sigma^2/2)*T) / (sigma*sqrt(T));

C = S0 * (normcdf(d1) -normcdf(d3) -b *(normcdf(d6)-normcdf(d8)) )...


-X*exp(-r*T) * (normcdf(d2) -normcdf(d4) +-a *(normcdf(d5)-normcdf(d7)) );

End
第十六週作業
% EuCallExpl1.m
function price = EuCallExpl1(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(vetS - X, 0);
matval(1,:) = 0;
matval(M+1,:) = (M+1)*dS-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+1)*dS)*(matval(iup+1,1) - matval(iup,1))/dS;
end

% CompBlsExpl_Call.m Compare blsprice and BlsExplCall

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;
[c04,p1]=blsprice(S0,X,r,T,sigma1);
Exps04=EuCallExpl1(S0,X,r,T,sigma1,Smax,dS1,dT);
[c03,p2]=blsprice(S0,X,r,T,sigma2);
Exps03dS2=EuCallExpl1(S0,X,r,T,sigma2,Smax,dS1,dT);
ExpdS15=EuCallExpl1(S0,X,r,T,sigma2,Smax,dS2,dT);
ExpdS1=EuCallExpl1(S0,X,r,T,sigma2,Smax,dS3,dT);

c04
Exps04
c03
Exps03dS2
ExpdS15
ExpdS1

You might also like