Monte-Carlo

定價 Exotics:蒙地卡羅太慢了?

  • December 30, 2016

我想在指數 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 億不到一秒)。

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