Professional Documents
Culture Documents
第六組
石油債券訂價
function price=bond_pricing(S0,X1,X2,r,T,sigma,C)
Call1=blsprice(S0,X1,r,T,sigma);
Call2=blsprice(S0,X2,r,T,sigma);
Code bond=C/((1+r)^T);
price=bond+Call1-Call2;
%S0=40;X1=25;X2=35;r=0.02;T=5/12;sigma=0.4;C=1000
Outcome
for i=1:10
Path=AssetPaths1(S0,r,sigma,T,NSteps,1);
StockVals(i) = Path(NSteps+1);
crossed = any(Path <= Sb);
if crossed == 0
OptionVals(i) = max(0, X - Path(NSteps));
else
OptionVals(i) = 0;
end
end
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);
NewOptionVals = zeros(NRepl,1);
NewStockVals = zeros(NRepl,1);
for i=1:NRepl
Path=AssetPaths1(S0,r,sigma,T,NSteps,1);
NewStockVals(i) = Path(NSteps+1);
crossed = any(Path <= Sb);
if crossed == 0
NewOptionVals(i) = max(0, X - Path(NSteps+1));
else
NewOptionVals(i) = 0;
end
end
% DOPutMC.m
% S0=50; X=52; r=0.1; T=0.1667; sigma=0.4; Sb=45;
NSteps=60; NRepl=100;
function [P,CI,NCrossed] =
DOPutMC_Quasi(S0,X,r,T,sigma,Sb,NSteps,NRepl)
prime_num = myprimes(NRepl+1);
for i=1:NRepl
Path=AssetPaths1(S0,r,sigma,T,NSteps,2,prime_num(i+1));
crossed = any(Path <= Sb);
if crossed == 0
Payoff(i) = max(0, X - Path(NSteps+1));
else
Payoff(i) = 0;
NCrossed = NCrossed + 1;
end
end
end
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
end
% AssetPaths1.m
function
SPaths=AssetPaths1(S0,mu,sigma,T,NSteps,Prime1,Prime2)
dt = T/NSteps;
nudt = (mu-0.5*sigma^2)*dt;
sidt = sigma*sqrt(dt);
norm = Halton_BoxMuller(NSteps,Prime1,Prime2);
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
end
Outcome
DOPutMCCond 改成call
% DOPutMCCond.m
function [Cdo,CI,NCrossed] =
DOCallMCCond(S0,X,r,T,sigma,Sb,NSteps,NRepl)
dt = T/NSteps;
[Call,Put] = blsprice(S0,X,r,T,sigma);
Code
% Generate asset paths and payoffs 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
end
% 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);