Professional Documents
Culture Documents
110071511 郭家豪
Week 2
BS
function [c,p] = bs(S0,X,r,T,sigma)
d1 = (log(S0/X)+(r+1/2*sigma^2)*T)/(sigma*sqrt(T));
d2 = d1 - sigma*sqrt(T);
c = S0*normcdf(d1)-X*exp(-r*T)*normcdf(d2);
p = X*exp(-r*T)*normcdf(-d2)-S0*normcdf(-d1);
end
pv
function x = pv(y,Ct,n)
x=0;
d=1+y;
for i=1:n
x=x+Ct(i)/d;
d=d*(1+y);
end
end
Week 3
Plotbond_price
Ct = [10 10 110];
n = 3;
bond_p = [];
r = [0 : 0.05 :0.5];
for i = 1: length(r)
x = pv(r(i),Ct,n);
bond_p = [bond_p x]
end
plot(r,bond_p);
title('bond price');
xlabel('r');
ylabel('bond price');
axis([0 0.5 40 130]);
grid on ;
Plot_optoins
X = 50 ;
c=2;
p=2;
St = 40 : 0.5 : 60 ;
x = 50;
r =0.05;
t = 0.1:0.1:2;
sig = 0.2;
div = 0;
s = 50 ;
% Delta
[call_delta, puut_delta] = blsdelta(s,x,r,t,sig,div);
plot(t,call_delta,'-');
title('Delta vs. T');
xlabel('T');
ylabel('Delta');
legend('Delta');
Week 4
Protective_call
c = 2;
X = 100;
S0 = 90:1:110;
plot(S0, -(S0-100),"--");
hold on;
call_payoff = max(0, S0-X)
plot(S0, call_payoff-c, ".");
plot(S0, -(S0-100)+call_payoff-c);
grid on;
title('protective call');
xlabel("S0");
ylabel('profit');
Covered_put
p = 2;
X = 105;
S0 = 92:1:112;
plot(S0, -(S0-105), "--");
hold on;
put_payoff = max(0, 105-S0);
plot(S0, -put_payoff+p, ".");
plot(S0, -(S0-X)-put_payoff+p);
grid on;
title("covered put");
xlabel("S0");
ylabel("profit");
BullSpreadCall_mispricing1
c1 = 3; c2 = 4;
X1 = 100; X2 =105;
S0 = 95:1:110;
%此處先假設為long
c1_profit = max(S0-X1,0)-c1
c2_profit = max(S0-X2,0)-c2
%此處先假設為long
c1_profit = max(S0-X1,0)-c1
c2_profit = max(S0-X2,0)-c2
%此處先假設為long
p1_profit = max(X1-S0,0)-p1
p2_profit = max(X2-S0,0)-p2
%此處先假設為long
p1_profit = max(X1-S0,0)-p1
p2_profit = max(X2-S0,0)-p2
figure(2)
plot(S0, -p1_profit, "--");
hold on;
plot(S0, p2_profit, ".");
plot(S0, -p1_profit+p2_profit);
grid on;
title("Bear spread");
xlabel("S0");
ylabel("profit");
plot(S0, zeros(1,16), "black");
BearSpread_Call
c1 = 3; c2 = 1;
X1 = 100; X2 =103;
S0 = 95:1:110;
%此處先假設為long
c1_profit = max(S0-X1,0)-c1
c2_profit = max(S0-X2,0)-c2
figure(1)
plot(S0, -c1_profit, "--");
hold on;
plot(S0, c2_profit, ".");
plot(S0, -c1_profit+c2_profit);
grid on;
title("Bear spread");
xlabel("S0");
ylabel("profit");
plot(S0, zeros(1,16), "black");
Butterfly_mispricing1
c1 = 5.5; c2 = 4; c3 = 1; plot(S0, c1_profit, "--");
X1 = 95; X2 = 100; X3 = 105; hold on;
S0 = 90:1:110; plot(S0, -2*c2_profit, "*");
% 理論c1+c3-2c2 > 0 才合理 plot(S0, c3_profit, ".");
% 執行價需對稱 plot(S0, c1_profit-2*c2_profit+c3_profit)
grid on;
c1_profit = max(S0-X1,0)-c1; title("butterfly spread");
c2_profit = max(S0-X2,0)-c2; xlabel("S0");
c3_profit = max(S0-X3,0)-c3; ylabel("profit");
plot(S0,zeros(1,21),"black");
Butterfly_mispricing2
c1_profit = max(S0-X1,0)-c1;
% 計算尚未到期call價格
for i = 1: length(S0)
[C(i),P(i)] = bs(S0(i), X2, r, T, sigma);
end
% 畫圖
plot(S0, -c1_profit);
hold on;
plot(S0, C-c2, "--");
plot(S0, C-c2-c1_profit);
title('Digonal Spread');
xlabel("S0");
ylabel('profit');
Week 5
Butterfly_Spread_andBS
clear;
c1 = 5; c2 = 2.5; c3 = 2; % 畫圖
X1 = 92; X2 = 100; X3 = 108; plot(S0, c1_profit - 2*c2_profit + c3_profit);
S0 = 85:1:115; hold on;
r = 0.02; T1 = 0.05; T2 = 0.1; sigma = 0.2; plot(S0, C11-2*C21+C31-c1+2*c2-c3,'--');
plot(S0, C12-2*C22+C32-c1+2*c2-c3,'.');
c1_profit = max(S0-X1,0)-c1; plot(S0,zeros(1,length(S0)),'black');
c2_profit = max(S0-X2,0)-c2; grid on;
c3_profit = max(S0-X3,0)-c3; title('butttfly spread');
xlabel('S0');
% 算 call 價格 ylabel('profit');
for i = 1:length(S0) legend({'t=0','t=0.5','t=0.1'},'Location','SouthEast');
[C11(i),P11(i)] = bs(S0(i),X1,r,T1,sigma);
[C21(i),P21(i)] = bs(S0(i),X2,r,T1,sigma);
[C31(i),P31(i)] = bs(S0(i),X3,r,T1,sigma);
[C12(i),P12(i)] = bs(S0(i),X1,r,T2,sigma);
[C22(i),P22(i)] = bs(S0(i),X2,r,T2,sigma);
[C32(i),P32(i)] = bs(S0(i),X3,r,T2,sigma);
end
Butterfly_Spread_andBS
CBOE1
clear; % 畫圖
S = 100; % 現在股價 figure(1);
S0 =85:1:115; % 到期日股價 plot(S0,stockIndex_profit-call_profit,'--blue'); % BXM
hold on;
X1 = 100*0.98; % call 執行價 2% out-of-money plot(S0,-put_profit,'--green'); % short put
X2 = S; % put 執行價 at-the-money plot(S0,stockIndex_profit-call_profit-put_profit,'-red');
title('CBOE')
r = 0.01; T = 1; sigma = 0.2; xlabel("S0");
c = 5; p = 4; ylabel("profit");
grid on;
stockIndex_profit = S0 - S; plot(S0, zeros(1,length(S0)),'-black');
call_profit = max(S0-X1,0)-c; legend({'BXM','short put','CBOE'},'Location','SouthEast');
put_profit = max(X2-S0,0)-p;
CBOE1
CBOE2
clear; figure(2);
S = 100; % 現在股價 plot(S0, stockIndex_profit,'--blue');
S0 =85:1:115; % 到期日股價 hold on;
plot(S0,-(call_profit+put_profit),'--green')
X1 = 100*0.98; % call 執行價 2% out-of-money plot(S0, stockIndex_profit-(call_profit+put_profit), '-red');
X2 = S; % put 執行價 at-the-money title('CBOE')
xlabel("S0");
r = 0.01; T = 1; sigma = 0.2; ylabel("profit");
c = 5; p = 4; grid on;
plot(S0, zeros(1,length(S0)),'-black');
stockIndex_profit = S0 - S; legend({'stock index','short
call_profit = max(S0-X1,0)-c; strangle','CBOE'},'Location','SouthEast');
put_profit = max(X2-S0,0)-p;
CBOE2
Week 6
LatticeEurPut
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);
CompAmLatticeBLS_Call
% 變數設定 % 畫圖
S0 = 50; figure(2)
X = 50; plot(1:N, ones(1,N)*BlsC);
r = 0.1; hold on;
sigma = 0.4; plot(1:N, LatticeC);
T = 5/12; title('CallpriceCompare');
N = 50; xlabel("N");
q = 0; ylabel('call price');
legend({'BS','CRR trees'},'Location','SouthEast');
% 用BS和二項樹算put的價格
[BlsC,BlsP] = blsprice(S0, X, r, T, sigma)
LatticeC = zeros(1,N);
for i = 1:N
LatticeC(i) = LatticeAmCall(S0, X, r, T, sigma, q, i);
end
CompLatticeBLS_Put
% 變數設定 % 畫圖
S0 = 50; plot(1:N, ones(1,N)*BlsP);
X = 50; hold on;
r =0.1; plot(1:N, LatticeC);
sigma = 0.4; title('PUTpricre__Compare');
T = 5/12; xlabel("N");
N = 50; ylabel('put price');
legend({'BS','CRR trees'},'Location','SouthEast');
% 用BS和二項樹算put的價格
[BlsC,BlsP] = blsprice(S0, X, r, T, sigma)
LatticeC = zeros(1,N);
for i = 1:N
LatticeC(i) = LatticeEurPut(S0, X, r, T, sigma, i);
end
LatticeC
CompAmEur_Call
% 變數設定 % 畫圖
S0 = 50; plot(1:N, LatticeAm_C);
X = 50; hold on;
r = 0.1; plot(1:N, LatticeEur_C);
sigma = 0.4; title('CallpricreCompare');
T = 5/12; xlabel("N");
q = 0.1; % q 要夠大,美式才會提早執行 ylabel('call price');
N = 50; legend({'Am','Eur'},'Location','SouthEast');
% 算美式和歐式call的價格
LatticeAm_C = zeros(1,N);
LatticeEur_C = zeros(1,N);
for i = 1:N
LatticeAm_C(i) = LatticeAmCall_q(S0, X, r, T, sigma, q, i);
end
for i = 1:N
LatticeEur_C(i) = LatticeEurCall_q(S0, X, r, T, sigma, q, i);
end
Week 7
LatticeEurCallDiv_D
function [price, lattice ] = LatticeEurCallDiv_D(S0, X, r, T, sigma,
N, D, tau)
% 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); % 將未來的股利折現到現在
先扣掉
LatticeEurCallDiv_D
% 建二項樹 % 倒數第二行折現回來
lattice = zeros(N+1, N+1);
for i = N-1:-1:0
% 寫最後一行 for j = 0:i
% 第一列為全部下跌狀況, 股價由低排到高 lattice(i+1, j+1) = ...
for j = 0:N exp(-r*deltaT)*(p*lattice(i+2,j+2)+(1-p)*lattice(i+2, j+1)) ;
lattice(N+1, j+1) = max ( 0, S0a*(u^j)*(d^(N-j))-X ); end
end end
price = lattice(1,1);
LatticeEurPutDiv_D
% 變數設定
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); % 將未來的股利折現到現在
先扣掉
LatticeEurPutDiv_D
% 建二項樹 % 倒數第二行折現回來
lattice = zeros(N+1, N+1);
for i = N-1:-1:0
% 寫最後一行 for j = 0:i
% 第一列為全部下跌狀況, 股價由低排到高 lattice(i+1, j+1) = ...
for j = 0:N exp(-r*deltaT)*(p*lattice(i+2,j+2)+(1-p)*lattice(i+2, j+1)) ;
lattice(N+1, j+1) = max ( 0, X-S0a*(u^j)*(d^(N-j)) ); end
end end
price = lattice(1,1);
LatticeAmPutDiv_D
% 變數設定
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); % 將未來的股利折線到現在
先扣掉
LatticeAmPutDiv_D
% 建二項樹 % 發股利前
lattice = zeros(N+1, N+1); 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(-
for j = 0:N r*(tau-i)*deltaT),...
lattice(N+1, j+1) = max ( 0, X-S0a*(u^j)*(d^(N-j)) ); exp(-r*deltaT)*(p*lattice(i+2,j+2)+(1-p)*lattice(i+2,
end j+1)) );
end
% 發股利(tau)之後到 倒數第二行 End
for i = N-1:-1:tau
for j = 0:i price = lattice(1,1);
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
LatticeAmCallDiv_D
% 變數設定
deltaT = T/N;
u = exp(sigma*sqrt(deltaT));
d = 1/u;
p = ( exp(r*deltaT)-d )/ (u-d) ; % u-d 要括號不然會先除u
S0a = S0-D*exp(-r*tau*deltaT);
LatticeAmCallDiv_D
% 發股利前
% 建二項樹
for i = tau-1:-1:0
lattice = zeros(N+1, N+1);
for j = 0:i
lattice(i+1, j+1) = max( S0a*(u^j)*(d^(i-j))+D*exp(-r*(tau-
% 寫最後一行
i)*deltaT)-X,...
% 第一列為全部下跌狀況, 股價由低排到高
exp(-r*deltaT)*(p*lattice(i+2,j+2)+(1-p)*lattice(i+2,
for j = 0:N
j+1)) );
lattice(N+1, j+1) = max ( 0, S0a*(u^j)*(d^(N-j))-X );
end
end
end
% 發股利(tau)之後到 倒數第二行
price = lattice(1,1);
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
LatticeEurCallDiv_P
function [price, lattice ] = LatticeEurCallDiv_P(S0, X, r, T, sigma,
N, div, tau)
% tau 為第幾期發股利
% 歐式選擇權第幾期發股利沒差
% 變數設定
deltaT = T/N;
u = exp(sigma*sqrt(deltaT));
d = 1/u;
p = ( exp(r*deltaT)-d )/ (u-d) ; % u-d 要括號不然會先除u
LatticeEurCallDiv_P
% 建二項樹 % 發股利前
lattice = zeros(N+1, N+1); %{
for i = tau-1:-1:0
% 寫最後一行 for j = 0:i
% 第一列為全部下跌狀況, 股價由低排到高 lattice(i+1, j+1) = ...
for j = 0:N exp(-r*deltaT)*(p*lattice(i+2,j+2)+(1-p)*lattice(i+2, j+1)) ;
lattice(N+1, j+1) = max ( 0, S0*(u^j)*(d^(N-j))*(1-div)-X ); end
end end
%}
% 發股利(tau)之後到 倒數第二行
price = lattice(1,1);
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
LatticeEurPutDiv_P
% 變數設定
deltaT = T/N;
u = exp(sigma*sqrt(deltaT));
d = 1/u;
p = ( exp(r*deltaT)-d )/ (u-d) ; % u-d 要括號不然會先除u
LatticeEurPutDiv_P
% 建二項樹
lattice = zeros(N+1, N+1); % 發股利前
for i = tau-1:-1:0
% 寫最後一行 for j = 0:i
% 第一列為全部下跌狀況, 股價由低排到高 lattice(i+1, j+1) = ...
for j = 0:N exp(-r*deltaT)*(p*lattice(i+2,j+2)+(1-p)*lattice(i+2, j+1)) ;
lattice(N+1, j+1) = max ( 0, X-S0*(u^j)*(d^(N-j))*(1-div) ); end
end 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
LatticeAmPutDiv_P
% 變數設定
deltaT = T/N;
u = exp(sigma*sqrt(deltaT));
d = 1/u;
p = ( exp(r*deltaT)-d )/ (u-d) ; % u-d 要括號不然會先除u
LatticeAmPutDiv_P
% 建二項樹 % 發股利前
lattice = zeros(N+1, N+1); 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,
for j = 0:N j+1)) );
lattice(N+1, j+1) = max ( 0, X-S0*(u^j)*(d^(N-j))*(1-div) ); end
end 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
LatticeAmCallDiv_P
% 變數設定
deltaT = T/N;
u = exp(sigma*sqrt(deltaT));
d = 1/u;
p = ( exp(r*deltaT)-d )/ (u-d) ; % u-d 要括號不然會先除u
LatticeAmCallDiv_P
% 建二項樹 % 發股利前
lattice = zeros(N+1, N+1); 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,
for j = 0:N j+1)) );
lattice(N+1, j+1) = max ( 0, S0*(u^j)*(d^(N-j))*(1-div)-X ); end
end 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
Week 9
TriEurPut
lattice = zeros(N+1, 2*N+1);
function [price, lattice] = TriEurPut(S0, X, r, T, sigma, N, lamda)
for j = 1:N+1
lattice(N+1, j) = max(0, X - S0*d^(N-j+1));
deltaT = T/N;
end
u = exp(lamda*sigma*sqrt(deltaT));
for j = N+2:2*N+1
d = 1/u;
lattice(N+1, j) = max(0, X - S0*u^(j-N-1));
pu = 1/(2*lamda^2) + (r-
end
sigma^2/2)*sqrt(deltaT)/(2*lamda*sigma);
for i = N-1:-1:0
pm = 1-1/(lamda^2);
for j = 1 : 2*i+1
pd = 1-pu-pm;
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
function [price, lattice] = TriAmPut(S0, X, r, T, sigma, N, lamda) % 有N期要計算,再加上第零期,所以矩陣有N+1行
% 矩陣從(1,1)開始,所以每一期在矩陣的表示皆要+1
deltaT = T/N; for i = N-1:-1:0
u = exp(lamda*sigma*sqrt(deltaT)); for j = 1 : 2*i+1 % 因為u和d互為倒數,下面當(i-j+1)小於
d = 1/u; 零時,表示上漲
pu = 1/(2*lamda^2) + (r- lattice(i+1, j) = max( X - S0*d^(i-j+1), exp(-r*deltaT)*...
sigma^2/2)*sqrt(deltaT)/(2*lamda*sigma); ( pd*lattice(i+2, j) + pm*lattice(i+2, j+1) + pu*lattice(i+2,
pm = 1-1/(lamda^2); j+2))...
pd = 1-pu-pm; );
end
lattice = zeros(N+1, 2*N+1); end
for j = 1:N+1
lattice(N+1, j) = max(0, X - S0*d^(N-j+1)); price = lattice(1,1);
end
for j = N+2:2*N+1
lattice(N+1, j) = max(0, X- S0*u^(j-N-1));
end
CompPut_Bls_Bin_Tri
S0 = 50; plot(1:N, ones(1,N)*BlsP, 'black');
X = 50; hold on;
r = 0.04879; plot(1:N, C1, 'b');
sigma = 0.2; plot(1:N, C2, 'red');
T = 7/12; title('PutpricreCompare');
q = 0; xlabel("N");
N = 70; ylabel('put price');
lamda = 1.41421; legend({"BS", 'Bin','Tri'}, 'Location','SouthEast')
for i = 1:NRepl
for j = 1: NSteps
SPaths(i, j+1) = SPaths(i, j)* exp(nudt+sidt*randn);
end
end
AssetPaths1
dt = T/NSteps;
nudt = (mu - 0.5*sigma^2)*dt;
sidt = sigma* sqrt(dt);
randn('seed', 0);
paths = AssetPaths(50, 0.1, 0.3, 1, 365, 10);
length(paths)
size(paths)
for i = 1:10
plot(1:length(paths),paths(i,:))
hold on
end
BlsMC if type == 0
DiscPayoff = exp(-r*T) * max( 0 , …
S0*exp(nuT+siT*randn(NRepl,1)) - X);
% 利用幾何布朗運動算未來股價ST的數字,根據公式推導 [Price, VarPrice, CI] = normfit(DiscPayoff)
T 數值可以很大,不影響結果,所以直接讓S0一步到ST elseif type == 1
DiscPayoff = exp(-r*T) * max( 0 , X - ….
function [Price, CI] = BlsMC(S0,X,r,T,sigma,NRepl, type) S0*exp(nuT+siT*randn(NRepl,1)) );
% 一步到ST, 所以不用設NSteps [Price, VarPrice, CI] = normfit(DiscPayoff)
% type = 0 表 Call elseif type == 2
% = 1 表 Put stimu_list = S0*exp(nuT+siT*randn(NRepl,1));
% = 2 表 ANCall for i = 1:length(stimu_list)
if stimu_list(i) - X < 0
nuT = (r - 0.5*sigma^2)*T; stimu_list(i) = 0;
siT = sigma * sqrt(T); end
end
DiscPayoff = exp(-r*T)*stimu_list;
[Price, VarPrice, CI] = normfit(DiscPayoff)
end
CompAssetPath
% 比較 AssetPaths、 AssetPaths1 兩個方法的速度
tic,paths = AssetPaths(50,0.1,0.3,1,10,10); toc % tic + toc
用來計算花費時間
Bls=blsprice(S0,X,r,T,sigma);
randn('seed',0);
[MC1000, CI1000] = BlsMC(S0,X,r,T,sigma,NRepl1, 0);
randn('seed',0);
[MC200000, CI200000] = BlsMC(S0,X,r,T,sigma,NRepl2, 0);
CompBlsMC_Put
% CompBlsMC.m Compare Put blsprice and BlsMC1000 and Ans:
BlsMC200000 Put;
MC1000;
S0=50; CI1000;
X=52; MC200000;
r=0.1; CI200000;
T=5/12;
sigma=0.4;
NRepl1=1000;
NRepl2=200000;
%{
Exotic Options- Assets or Nothing
ANCall = ST , if ST > K
= 0 , others
ANCall = S0*e^(-qT)*N(d1)
%}
d1 = ( log(S0/X)+(r-q+0.5*sigma^2)*T ) / ( sigma*sqrt(T) );
d2 = d1 - sigma*sqrt(sigma);
Call = S0*exp(-q*T)*normcdf(d1);
CompBlsMC_ANCall
% CompBlsMC.m Compare ANCall and CallMC1000 and Ans:
CallMC200000
AN
S0=50; MC1000
X=52; CI1000
r=0.1; MC200000
T=5/12; CI200000
sigma=0.4;
q = 0.05;
NRepl1=1000;
NRepl2=200000;
AN = ANCall(S0,X,r,T,sigma,q);
randn('seed',0);
[MC1000, CI1000] = BlsMC(S0,X,r,T,sigma,NRepl1, 2);
randn('seed',0);
[MC200000, CI200000] = BlsMC(S0,X,r,T,sigma,NRepl2, 2);
Week 13
MCIntergration
% MCIntergration 將積分視為一個均勻(0,1)的分配
% 此題對e^x做積分, 從0積到2
answer = exp(2)-1;
plot(1:N, ans_MC)
hold on;
plot(1:N, ones(1,N)*answer)
SallieMae_AmPut % 最後一年
for j = 0:N
lattice(N+1, j+1) = max(9.25, X(5) - S0*(u^j)*(d^(N-j)) );
end
for i = N-1 :-1:N-n+1
for j = 0:i
function [price, lattice] = SallieMae_AmPut(S0, X, r, T, sigma, q, lattice(i+1, j+1)= max( X(5) - S0* u^j * d^(i-j) ,...
N) exp(-r*deltaT)*( p*lattice(i+2,j+2)+(1-
% 標的資產為日幣,因此,價格為多少美元可以買1日幣, p)*lattice(i+2,j+1) )...
S0、X的值必<1 );
% 變數設定 end
deltaT = T/N; end
n = N/5; for peroid = 1:4 % 有多個執行價,所以要分不同層去跑
for i = N-peroid*n :-1:N-(peroid+1)*n+1
u = exp(sigma*sqrt(deltaT));
for j = 0:i
d = 1/u; lattice(i+1, j+1)= max( X(5-peroid) - S0* u^j * d^(i-j) ,...
p = ( exp((r-q)*deltaT)-d) /(u-d); exp(-r*deltaT)*( p*lattice(i+2,j+2)+(1-
p)*lattice(i+2,j+1) )...
% 二項樹 );
lattice = zeros(N+1, N+1); end
end
end
lattice(1,1) = max( X(1)-S0,...
exp(-r*deltaT)*( p*lattice(2,2)+(1-p)*lattice(2,1) ) );
price = lattice(1,1);
SallieMae_Pricing
nuT = (r - 0.5*sigma^2) * T;
siT = sigma *sqrt(T);
nuT = (r - 0.5*sigma^2) * T;
siT = sigma *sqrt(T);
% Box Muller
VLog = sqrt(-2 * log (H1));
% Use rand 生成 standard normals
Norm1 = VLog.* cos(2*pi*H2);
H1 = rand(ceil(Npoints/2), 1);
Norm2 = VLog.* sin(2*pi*H2);
H2 = rand(ceil(Npoints/2), 1);
Norm = [Norm1; Norm2]; % [ ; ] 把兩個接起來
% cdf
Norm = norminv(H1);
% 因為H1的值介於0到1之間,可以視為一個標準常態的cdf,
藉由norminv 找到標準常態上對應的X
randcdf_OptoinsPrices
% Random + cdf法 得到標準常態分佈,在計算Options Prices
% cdf
Norm = norminv(H1);
% 因為H1的值介於0到1之間,可以視為一個標準常態的cdf,藉由norminv 找到標準常態上對應的X
Base11 = 2; Base12 = 7;
Base21 = 11; Base22 = 7;
Base31 = 2 ; Base32 = 4;
% benchmark
[call, put] = blsprice(S0, X, r, T, sigma);
% Halton_Box
[Halton_Box27_call, Halton_Box27_put] = HaltonBox_OptoinsPrices(S0, X, r, T, sigma, NRepl, Base11, Base12);
[Halton_Box117_call, Halton_Box117_put] = HaltonBox_OptoinsPrices(S0, X, r, T, sigma, NRepl, Base21, Base22);
[Halton_Box24_call, Halton_Box24_put] = HaltonBox_OptoinsPrices(S0, X, r, T, sigma, NRepl, Base31, Base32);
Comp_getsOptoinsPrice_method
% Halton_cdf
[Halton_cdf2_call, Halton_cdf2_put] = Haltoncdf_OptoinsPrices(S0, X, r, T, sigma, NRepl, Base11);
[Halton_cdf7_call, Halton_cdf7_put] = Haltoncdf_OptoinsPrices(S0, X, r, T, sigma, NRepl, Base12);
[Halton_cdf4_call, Halton_cdf4_put] = Haltoncdf_OptoinsPrices(S0, X, r, T, sigma, NRepl, Base32);
% rand_Box
[rand_Box_call, rand_Box_put] = randBox_OptoinsPrices(S0, X, r, T, sigma, NRepl);
% rand_cdf
[rand_cdf_call, rand_cdf_put] = randcdf_OptoinsPrices(S0, X, r, T, sigma, NRepl);
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);
DOPutMCCV
% 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);
a = (Sb/S0) ^ (-1+(2*r/sigma^2)) ;
b = (Sb/S0) ^ ( 1+(2*r/sigma^2)) ;
% 未跨過,傳統put
if crossed == 0
Payoff(i) = max(0,Path(NSteps+1)-x); % 從S0開始往前走n步,共n+1個值
else % 跨過
Payoff(i) = 0;
NCrossed = NCrossed+1;
end
End
[Call,aux,Cl] = normfit(exp(-r*T)*Payoff);
UOCallMCCond
dt = T/NSteps;
[Call,Put] = blsprice(S0,x,r,T,sigma);
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);
% 計算當跨過去時,尚有剩餘時間的歐式買權價格,因為當跨過去之後就視為正常的call了
Payoff(1:NCrossed) = exp(-r*Times(1:NCrossed)) .* Caux;
% 有一排不同時間點的call價格,根據時點折現
end
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);
UOCallMCCondIS
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);
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