我需要对蒙特卡洛算法进行编码,以使Matlab近似于delta并计算置信区间:
但是由于某些原因我的代码无法正常工作,为什么有任何想法?
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)]
错误消息是
“由于左侧和右侧的元素数量不同,因此无法执行分配。”
感谢您的帮助!
答案 0 :(得分:0)
由于已将其向量化,因此无需显式编写for
循环。换句话说,Sfinal
和S_h
是长度为M
的向量,并且它们的第i
项对应于S_i
和S^h_i
图片。由于delta
表达式的右侧求值为长度为M
的向量,其中包含所有delta值,因此您应将该向量直接分配给delta
,而不是{{1 }}。
还有一件事情:图像中的伪代码似乎表明应该使用相同的随机数来计算delta(i)
和S_i
。在您的代码中情况并非如此,因为您分别调用S^h_i
来计算randn
和Sfinal
。我认为您应该一次生成随机样本,保存它们,然后将其用于两次计算。
代码如下:
S_h