用于在Matlab中逼近增量的蒙特卡罗模拟

时间:2018-12-26 19:04:07

标签: matlab montecarlo confidence-interval

我需要对蒙特卡洛算法进行编码,以使Matlab近似于delta并计算置信区间: algorithm

但是由于某些原因我的代码无法正常工作,为什么有任何想法?

randn('state', 100)

%Problem and method parameters
S=10; E=9; sigma=0.1; r=0.06; T=1;
Dt=1e-3; N=T/Dt; M=2^17;h=10^(-4);

 delta = zeros(M,1);
  for i = 1:M
  Sfinal = S*exp((r-0.5*sigma^2)*T+sigma*sqrt(T).*randn(M,1));
  S_h = (S+h)*exp((r-0.5*sigma^2)*T+sigma*sqrt(T).*randn(M,1));
  delta(i) = exp(-r*T).*(max(Sfinal-E,0)-max(S_h-E,0))/h;
end
aM=mean(delta); 
bM=std(delta);
conf=[aM-1.96*bM/sqrt(M),aM+1.96*bM/sqrt(M)]

错误消息是

“由于左侧和右侧的元素数量不同,因此无法执行分配。”

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

由于已将其向量化,因此无需显式编写for循环。换句话说,SfinalS_h是长度为M的向量,并且它们的第i项对应于S_iS^h_i图片。由于delta表达式的右侧求值为长度为M的向量,其中包含所有delta值,因此您应将该向量直接分配给delta,而不是{{1 }}。

还有一件事情:图像中的伪代码似乎表明应该使用相同的随机数来计算delta(i)S_i。在您的代码中情况并非如此,因为您分别调用S^h_i来计算randnSfinal。我认为您应该一次生成随机样本,保存它们,然后将其用于两次计算。

代码如下:

S_h