Monte-Carlo
定價 Exotics:蒙地卡羅太慢了?
我想在指數 VG 模型和 Merton 模型下對奇異期權進行定價,以比較這兩種模型。
為了在默頓模型下為外來物定價,我編寫了下面的程式碼。輸出是看漲期權、亞洲、數字和向上以及障礙看漲期權的價格。但是,使用循環會導致計算速度非常慢。有沒有一種聰明的方法可以在這裡不使用循環?在 VG 模型的情況下,我可以做到,但在這種情況下,我看不到它。
function [Call,Asian,Digital,UIBP] = ExoticPricingMerton(S0,K,mu,delta,lambda,sigma,r,q,Maturity,H) ht = 1/252; %trading days P = 10^3; %Number of simulations grid = (0:ht:Maturity); N = length(grid); omega = r-q-((1/2)*sigma^2+lambda*(exp(mu+(1/2)*delta^2)-1)); S = zeros(P,N); S(:,1) = S0; for i=1:P for j=2:length(grid) N = poissrnd(lambda*ht); J = cumsum([0, normrnd(mu,delta,1,N)]); Z = normrnd(0,1); S(i,j) = S(i,j-1)*exp(omega*ht + sigma*sqrt(ht)*Z + J(end)); end end %European Call option A = max(S(:,end)-K,0); Call = exp(-r*Maturity)*(1/P)*sum(A); %Asian option A = max(mean(S,2) - K,0); Asian = exp(-r*Maturity)*(1/P)*sum(A); %Digital price A = max(S(:,end) - K, 0)./(S(:,end)-K); Digital = exp(-r*Maturity)*(1/P)*sum(A); %Up-and-in out Barrier A1 = (max(S,[],2)-H)./abs(max(S,[],2)-H); A2 = max(A1,0); A = (max(S(:,end)-K,0)).*A2; UIBP = exp(-r*Maturity)*(1/P)*sum(A); end
謝謝!
你使用了錯誤的工具來完成這項工作。用更快的語言編寫你的蒙地卡羅(Java 可能就足夠了,如果不是這樣的標準 C++)。然後您將能夠有效地生成 1000 多個路徑。事實上,用 1000 條路徑進行蒙地卡羅衍生品定價是毫無價值的。您的結果很可能非常不准確。在進一步冒險和浪費時間之前,請閱讀一本關於蒙地卡羅定價的好書。
我假設您正在使用 MatLab。
您可以考慮通過利用數組編碼在 for 循環之前預先生成所有 1,000 個隨機數。
另一種方法,你有沒有嘗試過使用準蒙地卡羅?
QMC 確保更快的收斂速度,MatLab 具有可以非常快地生成準隨機序列的功能(10 億不到一秒)。