将数据框作为参数传递,并在R

时间:2016-11-24 13:17:10

标签: r dataframe return

大家好,谢谢你的回答。我发现问题是步骤impVolCall[i] <- sig 无法工作,因为不知何故impVolCall是类整数而sig无法写入。 在函数中添加as.numeric(impVolCall)可以解决问题。

谢谢! :)

我在R中很新,所以不确定这个问题对你来说是否显得过于愚蠢..

我创建了一个使用二分法和bs76公式计算隐含波动率的函数。当函数以

的格式接受参数时,它很有趣
implied.vol <-  function(S, K, T, market, type = "call", r = 0.02)

我想使这个函数只需要一个数据帧,数据帧的每一行代表一个选项。该函数将在一个向量中返回所有隐含波动率,然后我的完整代码如下所示。

结果总是如此     > resCall    [1] 1 2 3 哪个是&#34; c&#34;

的行数

如果我传递数据帧的方式错误,可以启用任何1吗? 感谢。

myOptData <- read.csv(file="optionData.csv", header=TRUE)

 df <-
  data.frame(myOptData$strike, myOptData$type, myOptData$optionPrice, 
         myOptData$futurePrice, myOptData$time_to_maturity)




bs <- function (type = "call", spot, strike, maturity, sigma, drift = 0.02)  
{

  d1 <- 1/sigma/sqrt(maturity)*(log(spot/strike)+(sigma^2/2)*maturity)
  d2 <- d1 - sigma*sqrt(maturity)

  call <- (pnorm(d1)*spot - pnorm(d2)*strike)*exp(-drift*maturity)
  put  <- (pnorm(-d2)*strike - pnorm(-d1)*spot)*exp(-drift*maturity)


  result <- c(call, put)
  names(result) <- c("call", "put")
  result[type]
}

## Function to find BS Implied Vol using Bisection Method



implied.vol <-
  function(df) 
  {
    sig <- 0.25
    sig.up <- 1
    sig.down <- 0.001
    count <- 0`

    numOfCall <- nrow(df[df$type == "c",])
    numOfPut <- nrow(df[df$type == "p",])

    impVOlCall <- 1:numOfCall
    impVolPut <- 1:numOfPut

    dfSorted <- df[order(df$type),]

    for (i in seq(impVolCall)) 
    {

    err <- 
        bs(dfSorted[i,2], dfSorted[i,4], dfSorted[i,1], dfSorted[i,5], sig,    0.02) - dfSorted[i,3]

    ## repeat until error is sufficiently small or counter hits 1000

    while(abs(err) > 0.00001 && count<1000)
    {
      if(err < 0)
      {
        sig.down <- sig
        sig <- (sig.up + sig)/2
      }
      else
      {
        sig.up <- sig
        sig <- (sig.down + sig)/2
      }
      err <- bs(dfSorted[i,2], dfSorted[i,4], dfSorted[i,1], dfSorted[i,5], sig, 0.02 ) - dfSorted[i,3]
      count <- count + 1
    }

    ## return NA if counter hit 1000

    if(count==1000)
    {
      impVolCall[i] <- NA
    }

    else
    {
     # plot(K, sig, main = type, xlab = "Strike", ylab="Option Price")
      impVolCall[i] <- sig
    }

    }

    return (impVOlCall)
  }



resCall <- 1:nrow(myOptData[myOptData$type == "c",])

resCall <- implied.vol(myOptData)

非常感谢!

0 个答案:

没有答案