Professional Documents
Culture Documents
第六組
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);
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);
Outcome
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
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
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之間。
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);
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之間。
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;
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之間。
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;
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));
% 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;
Outcome