You are on page 1of 6

金融商品設計與評價 HW13

第六組

一、Finite Difference Methods - Explicit Method

European Call

使用 ​EuPutExpl1.m ​原本的程式碼修改,在 boundary conditions 的部分將到期日的報酬改


為 S-X ,且 ​matval(1,:)​與 ​matval(M+1,:)​的報酬互換,就能計算 European Call 的價
格。

% EuPutExpl1.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); ​% adjust the payoff
matval(1,:) = 0;
matval(M+1,:) = X*exp(-r*dt*(N-vetj));
Code
% 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

end

% S0=50; X=50; r=0.1; T=5/12; sigma=0.3; Smax=100; dS=2;


dt=5/1200;

Outcome

Compare the Finite Difference Method with BS formula

比較內建的 ​blsprice ​函數與有限差分法所計算的 European Call 之價格。從結果看來,


sigma 為 0.4 時兩種方法的差異較大,但 sigma 為 0.3 時的價格差不多。

% CompBlsExpl.m Compare blsprice and BlsExpl


function​ CompBlsExpl_EuCall()
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,~]=blsprice(S0,X,r,T,sigma1);
Code
Exps04=EuCallExpl1(S0,X,r,T,sigma1,Smax,dS1,dT);
[c03,~]=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

end

Outcome

American Put

同樣由 ​EuPutExpl1.m ​的程式碼修改 boundary conditions。到期日報酬 ​matval (:,N+1)


和股價最高時的 matval(M+1,:) 都​與原本的 European Put 相同,但因 American Put 可
以提早執行,在股價最低的狀況下 ​matval(1,:) ​報酬都會是執行價格 ​X ,不需要將 X 折
現​。另外,在逆向推導(Backward Induction)時,要檢查是否會提早執行。從結果來看,當
其他條件皆相同時,American Put 的價格略高於 European Put。

% EuPutExpl1.m
function​ price = AmPutExpl1(S0,X,r,T,sigma,Smax,dS,dt)
Code % 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; ​% no need to discount
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) = max(X-vetS(i), a(i)*matval(i-1,j+1)
+ b(i)*matval(i,j+1)+ ​...
c(i)*matval(i+1,j+1)); ​% check early exercise

​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

end

% S0=50; X=50; r=0.1; T=5/12; sigma=0.3; Smax=100; dS=2;


dt=5/1200;
Outcome

American Call

類似於 American Put ,可以從 ​EuCallExpl1 ​函數修改。到期日報酬 ​matval (:,N+1)和


股價最低時的 matval(1,:) 都​與原本的 European Call 相同,但因 American Call 可以提
早執行,在股價最高的狀況下 ​matval(M+1,:) ​報酬都會是執行價格 ​X ,不需要將 X 折
現​。另外,在逆向推導(Backward Induction)時,要檢查是否會提早執行。根據計算結果,
American Call 與 European Call 的價格非常接近,這與我們已知 American Call 不會提早執
行的推論相符。

% EuPutExpl1.m
function​ price = AmCallExpl1(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;
Code

% set up boundary conditions


matval(:,N+1) = max(vetS-X,0); ​% adjust the payoff
matval(1,:) = 0;
matval(M+1,:) = X; ​% no need to discount
% 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) = max(vetS(i)-X, a(i)*matval(i-1,j+1) +
b(i)*matval(i,j+1)+ ​...
c(i)*matval(i+1,j+1)); ​% check early exercise
​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

end

% S0=50; X=50; r=0.1; T=5/12; sigma=0.3; Smax=100; dS=2;


dt=5/1200;

Outcome

You might also like