目的
目标是通过Monte-Carlo模拟计算Merton跳跃扩散模型下的外来期权的价格。现在,在我这样做之前,我想通过模拟具有警示K
和成熟度T
的欧洲看涨期权的价格来测试蒙特卡洛技术的准确性。
方法和问题
我必须模拟可能的情况,即Merton模型下可能的股票价格路径。因此,我构建了一个长度为N
的时间网格,其步长为ht
。然后,目标是计算S(1),...,S(N)
,即时间网格上的股票价格。这就是内循环中发生的事情。现在这个内部循环仅用于一个路径。我必须为P = 10^5
路径(外部循环)执行此操作。
问题
使用循环,这非常耗时且不实用。因此,我想用最少的循环来重写代码。但是,我不知道怎么样?基本上因为我不知道如何在没有循环的情况下生成复合泊松随机变量。
function [Call] = ExoticPricingMerton(S0,K,mu,delta,lambda,sigma,r,q,Maturity)
% This script computes the price of a European option through Monte-Carlo simulation
% mu = -0.12, r = 0.033, q = 0.0022, delta = 0.14, sigma = 0.34,
% Maturity = 1.12, S_0 = 100, K = 95.
% r is the risk free rate
% T is the maturity of the option
% {mu,delta,lambda,sigma} are the Merton model parameters
% S_0 is the spot price
% K is the strike of the option
ht = 1/252; %trading days
P = 10^5; %Number of simulations
Tgrid = (0:ht:Maturity);
N = length(Tgrid);
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(Tgrid)
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);
输出
具有警示K
和成熟度T
的欧洲看涨期权的价格。 S
是一个矩阵,其中每一行都是一个样本路径,列数是模拟量(P
)。