You are on page 1of 11

金融商品設計與評價 HW7

第六組

European put

以BlsMCEurPut的function跑European Put在蒙地卡羅模擬下的價格,output部分,5.0689為Put
之BLS Price,5.3861為模擬1000次的價格(CI1000為模擬1000次下的信賴區間),5.0722則為模
擬200000次的價格(CI200000為模擬200000次下的信賴區間),可得出模擬愈多次信賴區間越
小。

% CompBlsMCEurPut.m
function​ CompBlsMCEurPut()
S0=50; X=52; r=0.1; T=5/12; sigma=0.4;
NRepl1=1000; NRepl2=200000;

[~,Put]=blsprice(S0,X,r,T,sigma);
randn(​'seed'​,0);
[MC1000, CI1000] = BlsMCEurPut(S0,X,r,T,sigma,NRepl1);
randn(​'seed'​,0);
[MC200000, CI200000] =
BlsMCEurPut(S0,X,r,T,sigma,NRepl2);

Put
MC1000
Code CI1000
MC200000
CI200000
end

% BlsMCEurPut.m
function​ [Price, CI] = BlsMCEurPut(S0,X,r,T,sigma,NRepl)
nuT = (r - 0.5*sigma^2)*T;
siT = sigma * sqrt(T);

DiscPayoff = exp(-r*T) * max( 0 , X -


S0*exp(nuT+siT*randn(NRepl,1)));
[Price, ~, CI] = normfit(DiscPayoff);
end
Outcome

Other European options - European Put

Veps是從亂數產生器所抽出的標準常態分配序列,然後產生完全負相關的兩組賣權​payoff​:
Payoff1和Payoff2。
將每次得到之兩個到期報酬取平均並折現到今日,得到報酬DiscPayoff。
最後利用normfit得到選擇權目前價值的期望值Price和信賴區間CI,輸入參數值:
S0=100; X=110; r=0.1; T=5/12; sigma=0.3; NRepl=1000;
加入反向變數法的蒙地卡羅法模擬1000次所求出的選擇權價值為10.8822,其信賴區間為
10.6359到11.1284之間。

% BlsMCAV.m
function​ [Price, CI] = BlsMCAV_put(S0,X,r,T,sigma,NRepl)
nuT = (r - 0.5*sigma^2)*T;
siT = sigma * sqrt(T);
Code Veps = randn(NRepl,1);

Payoff1 = max( 0 , X - S0*exp(nuT+siT*Veps));


Payoff2 = max( 0 , X - S0*exp(nuT+siT*(-Veps)));
DiscPayoff = exp(-r*T) * 0.5 * (Payoff1+Payoff2);
[Price, ~, CI] = normfit(DiscPayoff);
% S0=100; X=110; r=0.1; T=5/12; sigma=0.3; NRepl=1000;

Outcome

Other European options - Bull Spread (call)

Veps是從亂數產生器所抽出的標準常態分配序列,然後產生完全負相關的股價:
Stocks1和Stocks2。
利用find分別算出不同區間股價之payoff1以及payoff2,將每次得到之到期報酬取平均並
折現到今日,得到以買權組成之牛市價差之報酬payoff。
最後利用normfit得到選擇權目前價值的期望值Price、價格的變異數VarPrice和信賴區
間CI,輸入參數值:​S0=100; r=0.2; T=5/12; sigma=0.4; NRepl=1000; X1=95;
X2=105;
加入反向變數法的蒙地卡羅法模擬1000次所求出的選擇權價值為5.2805,其信賴區間為
5.2004到5.3606之間。

%Bullspread_MC_AV1
function ​[P,CI]=Bull_MC_AV1(S0,r,T,sigma,NRepl,X1,X2)
nuT=(r-0.5*sigma^2)*T;
siT=sigma*sqrt(T);
Veps=randn(NRepl,1);

Stocks1=S0*exp(nuT+siT*Veps);
Code Stocks2=S0*exp(nuT+siT*(-Veps));

payoff1=zeros(NRepl,1);
payoff2=zeros(NRepl,1);

In=find((Stocks1>X1)&(Stocks1<X2));
payoff1(In)=(Stocks1(In)-X1);
In=find((Stocks1>X2));
payoff1(In)=(X2-X1);

In=find((Stocks2>X1)&(Stocks2<X2));
payoff2(In)=(Stocks2(In)-X1);
In=find((Stocks2>X2));
payoff2(In)=(X2-X1);

payoff=0.5*exp(-r*T)*(payoff1+payoff2);
[P,V,CI]=normfit(payoff);
% S0=100; r=0.2; T=5/12; sigma=0.4; NRepl=1000; X1=95;
X2=105;

Outcome

Other European options - Bear Spread (put)

Veps是從亂數產生器所抽出的標準常態分配序列,然後產生完全負相關的股價:
Stocks1和Stocks2。
利用find分別算出不同區間股價之payoff1以及payoff2,將每次得到之到期報酬取平均並
折現到今日,得到以賣權組成之熊市價差之payoff。
最後利用normfit得到選擇權目前價值的期望值Price、價格的變異數VarPrice和信賴區
間CI,輸入參數值:​S0=100; r=0.1; T=5/12; sigma=0.4; NRepl=1000; X1=95;
X2=105;
加入反向變數法的蒙地卡羅法模擬1000次所求出的選擇權價值為4.6763,其信賴區間為
4.6588到4.6938之間。

%Bearspread_MC_AV1
function​ [P,CI]=Bear_MC_AV1(S0,r,T,sigma,NRepl,X1,X2)
nuT=(r-0.5*sigma^2)*T;
Code siT=sigma*sqrt(T);
Veps=randn(NRepl,1);

Stocks1=S0*exp(nuT+siT*Veps);
Stocks2=S0*exp(nuT+siT*(-Veps));
payoff1=zeros(NRepl,1);
payoff2=zeros(NRepl,1);

In=find((Stocks1>X1)&(Stocks1<X2));
payoff1(In)=-(Stocks1(In)-X2);
In=find(Stocks1<=X1);
payoff1(In)=(X2-X1);

In=find((Stocks2>X1)&(Stocks2<X2));
payoff2(In)=-(Stocks2(In)-X2);
In=find(Stocks2<=X1);
payoff2(In)=(X2-X1);

payoff=0.5*exp(-r*T)*(payoff1+payoff2);
[P,V,CI]=normfit(payoff);
% S0=100; r=0.1; T=5/12; sigma=0.4; NRepl=1000; X1=95;
X2=105;

Outcome

Other European options - Butterfly Spread

Veps是從亂數產生器所抽出的標準常態分配序列,然後產生完全負相關的股價:
StockPrice1和StockPrice2。
利用find分別算出不同區間股價之Payoff1以及Payoff2,將每次得到之到期報酬取平均並
折現到今日,得到以買權組成之蝶式價差之DiscPayoff。
最後利用normfit得到選擇權目前價值的期望值Price、價格的變異數VarPrice和信賴區
間CI,輸入參數值:​S0=100; X1=90; X2=100; X3=110; r=0.1; T=5/12;
sigma=0.3; NRepl=1000;
加入反向變數法的蒙地卡羅法模擬1000次所求出的選擇權價值為1.9358,其信賴區間為
1.7683到2.1033之間。

function​ [Price, CI] =


BlsMCAV_butterfly(S0,X1,X2,X3,r,T,sigma,NRepl)
% Butterfly Spread Using Call Options
nuT = (r - 0.5*sigma^2)*T;
siT = sigma * sqrt(T);
Veps = randn(NRepl,1);

StockPrice1 = S0*exp(nuT+siT*Veps);
StockPrice2 = S0*exp(nuT-siT*Veps);
Payoff1 = zeros(NRepl,1);
Payoff2 = zeros(NRepl,1);

%Payoff1
In = find((StockPrice1 > X1) & (StockPrice1 < X2));
Code Payoff1(In) = StockPrice1(In) - X1;
In = find((StockPrice1 >= X2) & (StockPrice1 < X3));
Payoff1(In) = X3 - StockPrice1(In);
%Payoff2
In = find((StockPrice2 > X1) & (StockPrice2 < X2));
Payoff2(In) = StockPrice2(In) - X1;
In = find((StockPrice2 >= X2) & (StockPrice2 < X3));
Payoff2(In) = X3 - StockPrice2(In);

DiscPayoff = exp(-r*T) * 0.5 * (Payoff1+Payoff2);


[Price, ~, CI] = normfit(DiscPayoff);
end
% S0=100; X1=90; X2=100; X3=110; r=0.1; T=5/12;
sigma=0.3; NRepl=1000;

Outcome
Other European options - Straddle

Veps是從亂數產生器所抽出的標準常態分配序列,然後產生完全負相關的股價:
StockPrice1和StockPrice2。
利用find分別算出不同區間股價之Payoff1以及Payoff2,將每次得到之到期報酬取平均並
折現到今日,得到以買權及賣權組成之Straddle的DiscPayoff。
最後利用normfit得到選擇權目前價值的期望值Price、價格的變異數VarPrice和信賴區
間CI,輸入參數值:​S0=100; X=110; r=0.1; T=5/12; sigma=0.3; NRepl=1000;
加入反向變數法的蒙地卡羅法模擬1000次所求出的選擇權價值為16.3920,其信賴區間為
15.7070到17.0770之間。

function​ [Price, CI] =


BlsMCAV_straddle(S0,X,r,T,sigma,NRepl)
% Straddle with a long call and a long put
nuT = (r - 0.5*sigma^2)*T;
siT = sigma * sqrt(T);
Veps = randn(NRepl,1);

StockPrice1 = S0*exp(nuT+siT*Veps);
StockPrice2 = S0*exp(nuT-siT*Veps);
Payoff1 = zeros(NRepl,1);
Payoff2 = zeros(NRepl,1);

%Payoff1
In = find(StockPrice1 <= X);
Code
Payoff1(In) = X - StockPrice1(In);
In = find(StockPrice1 > X);
Payoff1(In) = StockPrice1(In) - X;
%Payoff2
In = find(StockPrice2 <= X);
Payoff2(In) = X - StockPrice2(In);
In = find(StockPrice2 > X);
Payoff2(In) = StockPrice2(In) - X;

DiscPayoff = exp(-r*T) * 0.5 * (Payoff1+Payoff2);


[Price, ~, CI] = normfit(DiscPayoff);
end
% S0=100; X=110; r=0.1; T=5/12; sigma=0.3; NRepl=1000;
Outcome

Other European options - Strangle

Veps是從亂數產生器所抽出的標準常態分配序列,然後產生完全負相關的股價:
StockPrice1和StockPrice2。
利用find分別算出不同區間股價之Payoff1以及Payoff2,將每次得到之到期報酬取平均並
折現到今日,得到以買權及賣權組成之Strangle的DiscPayoff。
最後利用normfit得到選擇權目前價值的期望值Price、價格的變異數VarPrice和信賴區
間CI,輸入參數值:​S0=100; X1=90; X2=110; r=0.1; T=5/12; sigma=0.3;
NRepl=1000;
加入反向變數法的蒙地卡羅法模擬1000次所求出的選擇權價值為7.1102,其信賴區間為
6.5288到7.6917之間。

function​ [Price, CI] =


BlsMCAV_strangle(S0,X1,X2,r,T,sigma,NRepl)
% Strangle with a long call and a long put
nuT = (r - 0.5*sigma^2)*T;
siT = sigma * sqrt(T);
Veps = randn(NRepl,1);

StockPrice1 = S0*exp(nuT+siT*Veps);
StockPrice2 = S0*exp(nuT-siT*Veps);
Code Payoff1 = zeros(NRepl,1);
Payoff2 = zeros(NRepl,1);

%Payoff1
In = find(StockPrice1 <= X1);
Payoff1(In) = X1 - StockPrice1(In);
In = find(StockPrice1 >= X2);
Payoff1(In) = StockPrice1(In) - X2;
%Payoff2
In = find(StockPrice2 <= X1);
Payoff2(In) = X1 - StockPrice2(In);
In = find(StockPrice2 >= X2);
Payoff2(In) = StockPrice2(In) - X2;

DiscPayoff = exp(-r*T) * 0.5 * (Payoff1+Payoff2);


[Price, ~, CI] = normfit(DiscPayoff);
end
% Test: S0=100; X1=90; X2=110; r=0.1; T=5/12; sigma=0.3;
NRepl=1000;

Outcome

CompTrMCAV

首先先設定參數值,將sb設定為一個向量方便之後的比較。再來我們利用do loop,從sb=50模
擬至sb=70,算出模擬200000次以及模擬100000次的各自CI,裡面我們也運用了seed來使得產
生的亂數為固定值。最後我們將結果畫成圖形,而從圖形裡面可以得知,使用antihetic variate方
法的TrMCAV的CI寬度在這個價格區間內會永遠小於TrMC的CI寬度。另外,當S0和Sb越接近
的時候,CI的寬度越小;反之,當Sb和S0相差越來越遠時,CI的寬度也會越來越大。

% CompTrMCAV.m
% Compare BlsTrMc200000 and BlsTrMCAV100000
function​ CompTrMCAV()
S0=50; X=50; r=0.1; T=5/12; sigma=0.4;
Sb=50:70; ​% set Sb as a vector
NRepl1=100000; NRepl2=200000;
Code

TrMC200000 = zeros(1,length(Sb));
TrMCAV100000 = zeros(1,length(Sb));
CI1 = zeros(2,length(Sb));
CI2 = zeros(2,length(Sb));
for​ i=(1:length(Sb))
randn(​'seed'​,0);
[TrMC200000(i), temp] =
BlsTrMC(S0,X,r,T,sigma,Sb(i),NRepl2);
CI1(1,i) = temp(1); CI1(2,i)= temp(2);
randn(​'seed'​,0);
[TrMCAV100000(i), temp] =
BlsTrMCAV(S0,X,r,T,sigma,Sb(i),NRepl1);
CI2(1,i) = temp(1); CI2(2,i)= temp(2);
end

plot(Sb, CI1(2,:)-CI1(1,:));
hold ​on
plot(Sb, CI2(2,:)-CI2(1,:));
title(​'TrMC vs. TrMCAV'​);
xlabel(​'Sb'​);
ylabel(​'Width of CI'​);
legend(​'CI1: TrMC'​,​'CI2: TrMCAV'​)

end

% BlsTrMC.m
function​ [Price, CI] = BlsTrMC(S0,X,r,T,sigma,Sb,NRepl)
nuT = (r - 0.5*sigma^2)*T;
siT = sigma * sqrt(T);

StockPrice = S0*exp(nuT+siT*randn(NRepl,1));

Clip = StockPrice > Sb;


StockPrice(Clip) = 0;

DiscPayoff = exp(-r*T) * max( 0 , StockPrice - X);


[Price, ~, CI] = normfit(DiscPayoff);
end

% BlsTrMCAV.m
function​ [Price, CI] = BlsTrMCAV(S0,X,r,T,sigma,Sb,NRepl)
nuT = (r - 0.5*sigma^2)*T;
siT = sigma * sqrt(T);
Veps = randn(NRepl,1);

StockPrice1 = S0*exp(nuT+siT*Veps);
StockPrice2 = S0*exp(nuT-siT*Veps);
Clip1 = StockPrice1 > Sb;
Clip2 = StockPrice2 > Sb;
StockPrice1(Clip1) = 0;
StockPrice2(Clip2) = 0;

Payoff1 = max( 0 , StockPrice1 - X);


Payoff2 = max( 0 , StockPrice2 - X);
DiscPayoff = exp(-r*T) * 0.5 * (Payoff1+Payoff2);
[Price, ~, CI] = normfit(DiscPayoff);
end

Outcome

You might also like