2017-10-28 6 views
2

ソリューション私はので、私はインプライド・ボラティリティと、行列、Zを入力する必要が行うにはR.で「パースビュー」を使用してボラティリティ表面をプロットしようとしています行列に値を代入しようとすると、エラーがfsolveになります。説明および/または解決策を探して

が見つかりました。

私は、ストライク価格、時間および市場価格のデータフレームを持っています。データにはコールオプションのみが含まれています。

AAPL <- #data 
    df <- data.frame(AAPL$Strike.Price,AAPL$Time.Left,AAPL$Market.Price) 

私は現在、それはいくつかのことに注意することが重要である株式の最初の列での価格、列2でのヘッダと、それぞれの市場価格倍、3と4を持つ行列、ZZを、持っています市場価格の価値が失われている(NA)。私のX、Y軸の

zz <- cast(df, df.Strike.Price ~ df.Time.Left) 

、Iはベクトルを定義し:今

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)) 

空行列で始まりそして、私は、エラーメッセージを取得するコードのこの部分を実行する際に

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 
      } 
     } 
    } 

を算出することができない値のNAを残して、マトリックスを充填しようとします

エラーであれば(規範(S、 "F")< TOL ||規範(ynew as.matrix()、 "F")< TOL)休憩:FALSE/TRUEが必要 欠損値

私はこのエラーについて何か分かりません。この問題や、代わりに暗黙のボラティリティを得る代わりの方法を克服する方法はありますかfsolve

+0

ソリューションを回答として投稿し、それを受け入れることができますか(質問に編集するのではなく)?これはStack OverflowのQ&Aフォーマットに沿ったものです。 – EJoshuaS

+0

@EJoshuaS Will。私はここに投稿するのが初めてだ、私の間違い。 –

答えて

1

エラーは、関数fsolveのシグマの変更が小さすぎることと関係しています。私は、非線形方程式を解くことができる別の関数を見つけ出し、その代わりに使用することができました。

この関数は、同じ名前のnleqslvパッケージからのnleqslvでした。

関連する問題