You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:54:57