期權定價

使用蒙地卡羅的歐式看漲期權的 Black Scholes 模型

  • January 7, 2022

我嘗試使用 Monte Carlo 和 Euler 離散化方案來實現計算歐式看漲期權價格的 Matlab 程序。我的初始價格 S0=50,行使價 K=50,障礙水平 B=45,到期時間為 6 個月。我得到的最終價格非常小(0.005)。即使我將 T 增加到 1 或當我減少障礙時,價格也不會增加。我不知道是什麼問題。我還有一個額外的問題——如何在這個模型上通過蒙特卡羅模擬找到希臘人(Delta、Vega、Gamma、Theta、Rho)?這是我的程式碼:

function [Price]= BlackScholes (n,m,r,T,Var,S0,K,B)
Price=1:50;

for i=1:n
I=1;
for j = 0:(m-1);
Z(j+1)= randn (1 ,1); 
dW=sqrt (T/m)*Z(j+1);
if j==0 
S(j+1) = S0*exp((r-Var/2)*(T/m)+sqrt(Var)*dW);
if (I==1) & (S(j+1) <= B)
I = 0;
end
else 
S(j +1) = S(j)* exp ((r - Var /2) *(T/m) + sqrt ( Var )* dW); 
if all([ I==1 , S(j+1) <=B])
I = 0;
end
end
end 
C=zeros(n,1);
C(i)= exp(-r*T)* max ((S(m-1)-K), 0)*I;
Price = sum (C (1:n))/n; 
end

非常感謝!

您的程式碼有很多問題。我將撇開它的實現方式,但請注意它是:(1)Matlab 對所有 for 循環都不友好(你應該矢量化),(2)你已經拆分案例 j== 的事實主循環中的 0 是一種糟糕的編碼習慣。

for i=1:n

I=1;
for j = 0:(m-1);
   Z(j+1)= randn (1 ,1);
   dW=sqrt (T/m)*Z(j+1);
   if j==0
       S(j+1) = S0*exp((r-Var/2)*(T/m)+sqrt(Var)*dW);
       if (I==1) & (S(j+1) <= B)
           I = 0;
       end
   else
       S(j +1) = S(j)* exp ((r - Var /2) *(T/m) + sqrt ( Var )* dW);
       if all([ I==1 , S(j+1) <=B])
           I = 0;
       end
   end
end
C=zeros(n,1);                                           %%% [1] THIS IS WRONG
C(i)= exp(-r*T)* max ((S(m-1)-K), 0)*I;                 
Price = sum (C (1:n))/n;                                %%% [2] THIS IS USELESS

end

您觀察到非常小的價格的原因是,只有 MC 模擬的最後一條路徑對期權價格有貢獻。這是因為在標有

$$ 1 $$上面,您總是將價格向量**重新初始化為一個充滿零的向量。**另請注意,該行$$ 2 $$非常沒用,應該位於 for 循環之外。 我建議按照以下方式實施:

function price = mc_pricer(n,m,r,T,var,S0,K,B)

rng(0);            
S = zeros(n,m);
S(:,1)=S0;
Z = randn(n,m-1);
t = linspace(0,T,m);
dt = diff(t);
for i=2:m
   S(:,i)=S(:,i-1).*exp( (r-var/2)*dt(i-1) + sqrt(var*dt(i-1))*Z(:,i-1) );
end
S_T = S(:,end);
payoff = max(S_T-K, 0).*(1-any(S<=B,2));
price = exp(-r*T)*mean(payoff);

end

引用自:https://quant.stackexchange.com/questions/28036