避免蒙特卡罗模拟中的循环

时间:2018-04-23 00:01:44

标签: matlab

我正在运行蒙特卡罗模拟来计算Y,例如: Y(i,j + 1)= Y(i,j)* a(i,j)+ b

我想尽可能避免使用for循环,而是使用矩阵计算,因为它是Matlab的优势。

这是我的代码:

kappa = 6.21;
theta = 0.019;
sigma = 0.61;
rho = -0.7;
r = 0.0319;
V0 = 0.010201;
T = 1;
N = 300; % Time steps
M = 1e6; % Number of simulations

dt = T/N;
Z = randn(M,N);
a = kappa*dt+sigma*sqrt(dt);
b = kappa*theta*dt;

% With loop
tic
y = zeros(M,N); % preallocate
y(:,1) = V0; % initial value
for i=1:M
    for j = 1:N
        y(i,j+1) = y(i,j)*(1-a*Z(i,j))+b;
    end
end
toc

这是我整个代码的一小部分,单独运行给定参数需要65秒。有没有办法让它更快,通过矩阵计算而不是循环?谢谢

1 个答案:

答案 0 :(得分:2)

似乎,每列都依赖于除第1列之外的先前列值。因此,您可以通过执行类似以下操作来摆脱第一个for循环:

for j=2:N
    y(:,j) = y(:,j-1).*(1-a*Z(:,j-1)) + b;
end

这个减少了近一半的时间。