找到解决方案
我正在尝试使用 R 中的“persp”绘制波动率表面。为此,我需要用隐含波动率填充矩阵 z。
我有一个执行价格、时间和市场价格的数据框。数据只包含看涨期权。
AAPL <- #data
df <- data.frame(AAPL$Strike.Price,AAPL$Time.Left,AAPL$Market.Price)
我目前有一个矩阵 zz,它在第一列中有股票价格,作为标题的时间和第 2、3 和 4 列中的相应市场价格。重要的是要注意缺少市场价格的一些值(NA )。
zz <- cast(df, df.Strike.Price ~ df.Time.Left)
对于我的 x、y 轴,我定义了向量:
x0 <- zz$df.Strike.Price #Strike prices for calculation of imp. vol.
x <- zz$df.Strike.Price / 153.06 #Axis for plotting
y <- c(time1, time2, time3)
现在是用于绘制隐含波动率的 z 矩阵。我从一个空矩阵开始
z = matrix(data=NA,nrow=length(x0),ncol=length(y))
然后我尝试填充矩阵,为无法计算的值留下 NA
for(i in 1:length(x0)){
for(j in 1:length(y)){
#Formula for Black-Scholes call option price (no dividends)
BS = function(X,T,sigma){
#Parameters
S=153.06; r=0.05 #Stock value is same for all options, r is arbitrarily selected to be some constant.
d1 = (log(S/X) + (r + sigma^2/2)*T) / (sigma*sqrt(T))
d2 = d1 - sigma*sqrt(T)
#Price for call options
price = S*pnorm(d1) - X*exp(-r*T)*pnorm(d2)
return(price)
}
#To address NA entries in zz
if(is.na(zz[i,j+1] == TRUE)){
z[i,j] = NA
}
#This is the part of the code that causes issues
else{
#Function for fsolve, the Black-Scholes price minus the market price.
A = function(sigma){
a = BS(x0[i], y[j], sigma) - zz[i,j+1]
return(a)
}
V = fsolve(A, 0.5) #Should give me the implied volatility from market data.
z[i,j] = V
}
}
}
执行这段代码后,我收到错误消息:
if (norm(s, "F") < tol || norm(as.matrix(ynew), "F") < tol) break 中的错误:需要 TRUE/FALSE 的地方缺少值
我不确定错误是什么。有没有办法克服这个问题或获得隐含波动率而不是使用fsolve的替代方法?