0% found this document useful (0 votes)
67 views13 pages

HW 6

The document discusses using lattice and trinomial tree models to price European and American options under different dividend scenarios. Specifically, it compares: 1) Pricing European and American calls with proportional vs dollar dividends using lattice models. 2) Developing a lattice model to price European puts with proportional and dollar dividends. 3) Using trinomial tree models to price European and American puts and comparing convergence to Black-Scholes prices.

Uploaded by

api-465474049
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)
67 views13 pages

HW 6

The document discusses using lattice and trinomial tree models to price European and American options under different dividend scenarios. Specifically, it compares: 1) Pricing European and American calls with proportional vs dollar dividends using lattice models. 2) Developing a lattice model to price European puts with proportional and dollar dividends. 3) Using trinomial tree models to price European and American puts and comparing convergence to Black-Scholes prices.

Uploaded by

api-465474049
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/ 13

金融商品設計與評價 HW6

第六組

一、​Dividend (Proportion)

LatticeEurCallDivP vs LatticeAmCallDivP

用 LatticeEurCallDivP 和 LatticeAmCallDivP 這兩個函數分別計算歐式和美式買權在支付股


票股利下的價格,再用函數 Comp_LatticeAmCallDivP_LatticeEurCallDivP 計算歐式與美式買
權價格在股利不同大小 (div) 與不同時間 (tau) 下的差額,畫出 3-D 圖。

% LatticeEurCallDivP vs LatticeAmCallDivP
function​ Comp_LatticeAmCallDivP_LatticeEurCallDivP()
S0=50; X=50; r=0.02; T=1; sigma=0.2; N=10;
div=0.05:0.05:0.5; tau=1:N-1;
LatticeAmCallDiv_price = zeros(length(tau),length(div));
LatticeEurCallDiv_price = zeros(length(tau),length(div));

for​ i=1:length(tau) ​%different tau


​for​ j=1:length(div) ​%different dividend
[LatticeAmCallDiv_price(i,j),~] =
LatticeAmCallDivP(S0,X,r,T,sigma,N,div(j),tau(i));
[LatticeEurCallDiv_price(i,j),~] =
LatticeEurCallDivP(S0,X,r,T,sigma,N,div(j));
​end
end

[A,B] = meshgrid(div,tau);
figure
Code Diff = LatticeAmCallDiv_price - LatticeEurCallDiv_price;
surf(A,B,Diff);
title(​"Difference between AmCall and EurCall"​)
xlabel(​'dividend'​);
ylabel(​'tau'​);
zlabel(​'AmCall - EurCall'​);
colorbar
end

%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);
end

%LatticeEurCallDivP.m
function​[price,lattice]=LatticeEurCallDivP(S0,X,r,T,sigma
,N,div)
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: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);
end
Outcome

LatticeEurPutDivP

計算歐式賣權在支付股票股利下的價格。

% LatticeEurPutDivP.m
function​ [price, lattice] =
LatticeEurPutDivP(S0,X,r,T,sigma,N,div)
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 ,
Code
X-S0*(u^j)*(d^(N-j))*(1-div));
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);
end
% test :
[price,lattice]=LatticeEurPutDivP(50,50,0.02,1,0.2,10,0.0
5)

Outcome

二、​Dividend (Dollar)

LatticeEurCallDivD vs LatticeAmCallDivD

用 LatticeEurCallDivD 和 LatticeAmCallDivD 這兩個函數分別計算歐式和美式買權在支付現


金股利下的價格,再用函數 Comp_LatticeCallDivD_EurVsAm 計算歐式與美式買權價格在股
利不同大小 (D) 與不同時間 (tau) 下的差額,畫出 3-D 圖。

% LatticeEurCallDivD vs. LatticeAmCallDivD


function​ Comp_LatticeCallDivD_EurVsAm()
S0=52; X=50; r=0.1; sigma=0.4; T=5/12; N=10;
D=0.5:0.5:10; tau=1:N-1;

EurPrice = zeros(length(tau), length(D));


AmPrice = zeros(length(tau), length(D));

for​ i=1:length(tau) ​% change tau


​for​ j=1:length(D) ​%change dividend
Code [EurPrice(i,j),~] =
LatticeEurCallDivD(S0,X,r,T,sigma,N,D(j),tau(i));
[AmPrice(i,j),~] =
LatticeAmCallDivD(S0,X,r,T,sigma,N,D(j),tau(i));
​end
end

[A, B] = meshgrid(D, tau);


figure
Diff = AmPrice - EurPrice;
surf(A, B, Diff)
title(​"Difference between AmCall and EurCall"​)
xlabel(​'dividend'​);
ylabel(​'tau'​);
zlabel(​'AmCall - EurCall'​);
colorbar
end

% LatticeEurCallDivD.m
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: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);
end

% LatticeAmCallDivD.m
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)+D*exp(-r*(tau-i)*deltaT)-X , ​...
exp(-r*deltaT) *(p * lattice(i+2,j+2) + (1-p) *
lattice(i+2,j+1)));
​end
end
price = lattice(1,1);
end

Outcome

LatticeEurPutDivD

計算歐式賣權在支付現金股利下的價格。

% LatticeEurPutDivD
function​ [price, lattice] =
LatticeEurPutDivD(S0,X,r,T,sigma,N,D,tau)
deltaT = T/N;
Code
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);
end

Outcome

三、​Trinomial Trees

TriEurPut

用三元樹模型計算歐式賣權的價格。

% TriEurPut.m
function​ [price, lattice] =
TriEurPut(S0,X,r,T,sigma,N,lamda)
deltaT = T/N;
u=exp(lamda*sigma * sqrt(deltaT));
Code d=1/u;
pu=1/(2*lamda^2)+(r-(sigma^2/2))*sqrt(deltaT)/(2*lamda*si
gma);
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 , 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);
end
 

Outcome

CompBlsBinTri_EurPut

比較歐式賣權用內建Black–Scholes函數、二元樹模型與三元樹模型訂價的價格差異。從結果
可知,用三元樹模型時價格收斂較快。

% CompBlsBinTri_EurPut.m
function​ CompBlsBinTri_EurPut()
S0=50; X=50; r=0.04879; sigma=0.2; T=7/12; N=70;
lamda=1.41421;

[~, BlsP] = blsprice(S0,X,r,T,sigma);


LatticeC1 = zeros(1,N);
Code LatticeC2 = zeros(1,N);

for​ i=(1:N)
[LatticeC1(i),~] = LatticeEurPut(S0,X,r,T,sigma,i);
[LatticeC2(i),~] = TriEurPut(S0,X,r,T,sigma,i,lamda);
end

plot(1:N, ones(1,N)*BlsP);
hold ​on​;
plot(1:N, LatticeC1);
plot(1:N, LatticeC2);
title(​'Bls vs. BinTree vs. TriTree'​);
xlabel(​'N'​);
ylabel(​'Price of European Put'​);
legend(​'Bls'​,​'LatticeEurPut'​,​'TriEurPut'​)
end

% LatticeEurPut.m
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);
end
Outcome

TriAmPut

用三元樹模型計算美式賣權的價格。

% TriAmPut.m
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*si
gma);
pm=1-1/(lamda^2);
Code pd=1-pu-pm;
lattice = zeros(N+1,2*N+1);

% Calculate the payoff at maturity


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
% Backward Induction
for​ i=N-1:-1:0 ​% the number of period
​for​ j=1:i+1 ​% the number of up, middle, and down
lattice(i+1,j) = max( X-S0*(d^(i-j+1))
,exp(-r*deltaT) * ​...
(pd * lattice(i+2,j) + pm * lattice(i+2,j+1)+
...
pu*lattice(i+2,j+2)));
​end
​for​ j=i+2:2*i+1
lattice(i+1,j) = max( X-S0*(u^(j-i-1)) ,
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);
end

Outcome

CompBinTri_AmPut

比較美式賣權用二元樹模型與三元樹模型訂價的價格差異。

% CompBlsBinTri.m
function​ CompBinTri_AmPut()
S0=50; X=50; r=0.04879; sigma=0.2; T=7/12; N=70;
lamda=1.41421;

Code
LatticeC1 = zeros(1,N);
LatticeC2 = zeros(1,N);

for​ i=(1:N) ​% the number of periods


[LatticeC1(i),~] = LatticeAmPut(S0,X,r,T,sigma,i);
[LatticeC2(i),~] = TriAmPut(S0,X,r,T,sigma,i,lamda);
end

plot(1:N, LatticeC1);
hold ​on
plot(1:N, LatticeC2);
title(​'BinTree vs. TriTree'​);
xlabel(​'N'​);
ylabel(​'Price of American Put'​);
legend(​'LatticeAmPut'​,​'TriAmPut'​)

end

% LatticeAmPut.m
function​ [price, lattice] =
LatticeAmPut(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) = 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);
end
Outcome

You might also like