期權定價
使用蒙地卡羅的歐式看漲期權的 Black Scholes 模型
我嘗試使用 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