Matlab蒙特卡洛模拟代码转R遇temp值错误,请求技术支持
蒙特卡洛期权定价:Matlab转R代码错误排查
问题描述
尝试将Matlab蒙特卡洛期权定价代码转换为R代码时,遇到temp值相关错误,以下是原Matlab代码及自行编写的R代码,请求协助排查问题。
原Matlab代码
S =100;K = 110; r = 0.05; sigma = 0.142470; dt = 1/365; etime = 365; T = dt*etime; mean=0;var=1; a=dt*(r-(.5*(sigma^2)));b=sqrt(dt)*sigma; lmax=1000; temp=0; for m=1:lmax x(1)=log(S); for n=1:etime x(n+1)=x(n)+a+b*normrnd(mean,var); end temp=temp+max(exp(x(etime+1))-K,0); end BS=(temp/lmax)*exp(-r*T)
待排查的R代码
S <- 100 K <- 110 r <- 0.05 sigma <- 0.142470 dt <- 1/365 etime <- 365 T <- dt*etime mean <- 0 var <- 1 a <- dt*(r - (.5*(sigma^2))) b <- sqrt(dt)*sigma lmax <- 1000 temp <- 0 x <- 0 for (count in 1:lmax) { x[1] <- log(S) for (n in 1:etime) { x[n + 1] <- x[n] + a + b*rnorm(1, mean, var) temp <- temp + max(exp(x[etime + 1]) - K, 0) } } BS <- (temp/lmax)*exp(-r*T)
错误原因分析
核心错误在于**temp的累加位置错误**:
- Matlab代码中,内层循环会先跑完所有
etime步,得到期权到期时的股价x(etime+1),之后才将该次模拟的期权价值(max(exp(x(etime+1))-K,0))加到temp中,每个外层循环只累加1次。 - 你写的R代码中,把
temp的累加语句放在了内层循环里,导致每走1个时间步就累加1次,每个外层循环会重复累加etime次,最终temp的值被放大了365倍,完全偏离预期。
另外,提前初始化x <- 0没必要,且可能导致向量索引混乱,建议每次外层循环重新初始化x。
修正后的R代码
S <- 100 K <- 110 r <- 0.05 sigma <- 0.142470 dt <- 1/365 etime <- 365 T <- dt*etime mean_val <- 0 # 避免和R内置函数mean重名 var_val <- 1 # 避免和R内置函数var重名 a <- dt*(r - 0.5*(sigma^2)) b <- sqrt(dt)*sigma lmax <- 1000 temp <- 0 for (count in 1:lmax) { x <- numeric(etime + 1) # 每次循环重新初始化x向量 x[1] <- log(S) for (n in 1:etime) { x[n + 1] <- x[n] + a + b*rnorm(1, mean_val, var_val) } # 内层循环结束后,再累加该次模拟的期权价值 temp <- temp + max(exp(x[etime + 1]) - K, 0) } BS <- (temp/lmax)*exp(-r*T) print(BS)
额外优化说明
- 将
mean和var重命名为mean_val和var_val,避免覆盖R的内置函数mean()和var(),减少潜在冲突。 - 每次外层循环用
numeric(etime + 1)初始化x,明确向量长度,避免动态扩容的性能损耗,同时逻辑更清晰。
内容的提问来源于stack exchange,提问作者MMKshawn
相关产品推荐
相关产品推荐

