You are on page 1of 8

金融商品設計與評價 HW11

第六組

石油債券訂價

石油債券可由兩個不同履約價格的Call option 加上一個零息債券所組成,我們藉由調整兩個Call


option 的履約價來調整契約的價值大小,經由試誤法所調出來的參數為X1=25及X2=35,由此參
數所組出來的石油債券價格剛好等於面額。

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

Use control variates to price barrier options

定義新的變數 ​ControlVars = NewOptionVals + c * (NewStockVals - ExpY),此


變數的期望值與 NewOptionVals 相同,但可降低變異。

function​ [Price, CI] =


Code DOPutMCCV2(S0,X,r,T,sigma,Sb,NSteps,NRepl)
% compute parameters first
OptionVals = zeros(10,1);
StockVals = zeros(10,1);

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

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


[Price, VarPrice, CI] = normfit(ControlVars);
Outcome

Use Quasi MC to price barrier options

在產生AssetPath時,不使用內建的 randn 函數,改成使用 Halton 加上 Box-Muller 產生Normal


分配的隨機變數。

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

Code % Generate asset paths


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

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

[P,~,CI] = normfit( exp(-r*T) * Payoff);

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

Increments = nudt + sidt*norm;


LogPaths = cumsum([log(S0)*ones(1,1) , Increments] , 2);
SPaths = exp(LogPaths);
end

function​ Norm = Halton_BoxMuller(NPoints,Base1,Base2)


% 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];
Norm = transpose(Norm);
end

function​ Seq = GetHalton(HowMany, Base)

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 中,Put的地方換成 Call,改成計算 Down-and-Out Call。另外,由於原本


的參數會使得跨過門檻的機率太低,因此將 ​Sb​ 從30調整至45 。

% 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

if​ (NCrossed > 0)


[Caux, Paux] =
blsprice(StockVals(1:NCrossed),X,r,T-Times(1:NCrossed),sigm
a);
Payoff(1:NCrossed) = exp(-r*Times(1:NCrossed)) .* Caux;
end
[Cdo, aux, CI] = normfit(Call - Payoff);

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

Increments = nudt + sidt*randn(NRepl, NSteps);


LogPaths = cumsum([log(S0)*ones(NRepl,1) , Increments] ,
2);
SPaths = exp(LogPaths);
end

% S0=50; X=52; r=0.1; T=2/12; sigma=0.4; Sb=45; NSteps=60;


NRepl=200000;
Outcome

You might also like