0

我试图执行此功能,但我的 if 语句不断出现错误: if (value[1][i] < 0) { 中的错误:需要 TRUE/FALSE 的缺失值:

Monte_Carlo <- function(trial)
{
    S_T <- S_o*exp((r - q - (1/2)*sigma^2)*period + sigma*rnorm(trial, mean = 0, sd = 1))
    K <- matrix(100, nrow = 1, ncol = 20)   
    value <- K - S_T

    for(i in 1:trial)
    {
        if(value[1][i] < 0)
        {
            value[1][i] = 0;
        }
    }
    return (mean(value)*exp(-r))
}
4

1 回答 1

1

您对矩阵的索引不正确。value[1]将返回一个值,然后您尝试为其分配ith元素,i最多trial

如果您分配给i第一行中的第 th 个元素(看起来好像您正在尝试这样做),那么它将起作用

Monte_Carlo <- function(trial)
{
  S_T <- S_o*exp((r - q - (1/2)*sigma^2)*period + sigma*rnorm(trial, mean = 0, sd = 1))
  K <- matrix(100, nrow = 1, ncol = 20)   
  value <- K - S_T

  for(i in 1:trial)
  {
    if(value[1, i] < 0)
    {
      value[1,i] = 0;
    }
  }
  return (mean(value)*exp(-r))
}

您可以删除向量化的for循环和if语句,pmax并将按元素返回 value 和 0 的最大值。

Monte_Carlo <- function(trial)
{
  S_T <- S_o*exp((r - q - (1/2)*sigma^2)*period + sigma*rnorm(trial, mean = 0, sd = 1))
  K <- matrix(100, nrow = 1, ncol = trial)   
  value <- K - S_T

  .value <- pmax(value,0)
  return (mean(.value)*exp(-r)
}

作为一个好的编程问题,我会将r, S_o, q,sigmaperiod作为参数添加到您的函数中,这样它就不会依赖于全局变量

于 2012-10-09T02:50:45.450 回答