【发布时间】:2015-03-02 04:22:43
【问题描述】:
我正在编写一个 Octave 脚本来计算欧式期权的价格。
第一部分使用蒙特卡罗模拟 n 个时间段内的标的资产价格。这会重复 nIter 次。
Octave 使设置初始矩阵变得非常容易。但是我还没有找到以向量化的方式完成任务,避免FOR循环的方法:
%% Octave simplifies creation of 'e', 'dlns', and 'Prices'
e = norminv(rand(nIter,n));
dlns = cat(2, ones(nIter,1), exp((adj_r+0.5*sigma^2)*dt+sigma*e.*sqrt(dt)));
Prices = zeros(nIter, n+1);
for i = 1:nIter % IS THERE A WAY TO VECTORIZE THESE FOR LOOPS?
for j = 1:n+1
if j == 1
Prices(i,j)=S0;
else
Prices(i,j)=Prices(i,j-1)*dlns(i,j);
end
endfor
endfor
请注意,n 中的价格等于 n-1 中的价格乘以一个因子,因此以下方法不起作用...
Prices(i,:) = S0 * dlns(i,:)
...因为它需要 S0 并将其乘以所有因子,产生与预期随机游走不同的结果。
【问题讨论】:
-
nIter,n,adj_r,sigma,dt,S0的典型值? -
nIter: 100,000; n: 100; adj_r = 0.03 ;西格玛 = 0.2; dt = 1/n; S0 = 60
-
尽管就我所读到的而言,矩阵的大小会影响解决方案。阅读一篇精彩的文章,为您参与的不同解决方案计时! nIter = 100,000 和 n = 100 通常用于最终解决方案,而 nIter = 1,000 和 n = 25 用于中间测试...我提到这一点以防不同的矩阵尺度有不同的解决方案...
标签: matlab recursion octave vectorization