解決策が見つかりました
R で "persp" を使用してボラティリティ サーフェスをプロットしようとしています。そのためには、マトリックス z にインプライド ボラティリティを入力する必要があります。
行使価格、時間、市場価格のデータ フレームがあります。データには通話オプションのみが含まれます。
AAPL <- #data
df <- data.frame(AAPL$Strike.Price,AAPL$Time.Left,AAPL$Market.Price)
私は現在、最初の列に株価、ヘッダーとしての時間、および列 2、3、4 にそれぞれの市場価格を持つ行列 zz を持っています。市場価格の一部の値が欠落していることに注意することが重要です (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を使用する代わりにインプライド ボラティリティを取得する別の方法はありますか?