大家好,谢谢你的回答。我发现问题是步骤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)
非常感谢!