【问题标题】:Avoiding for loops in Monte-Carlo simulation避免蒙特卡罗模拟中的 for 循环
【发布时间】:2018-04-23 00:01:44
【问题描述】:

我正在运行蒙特卡罗模拟来计算 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 秒。有没有办法让它更快,通过矩阵计算而不是循环?谢谢

【问题讨论】:

    标签: matlab


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-01-02
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多