3

かなり単純な質問がありますが、残念ながら結果を得ることができません: data.frame の各行に GBSVolatility 関数を適用したいと思います。

私は次のことをしました:

> vol <- function(x) GBSVolatility(x$Price, "c", S = 1000, x$Strike, Time = 1/4, 
r = 0.01, b = 0.02, maxiter = 500)
> foo$iv <- apply(foo, 1, vol)

しかし、これはうまくいきません。誰かが理由を教えてもらえますか?

どうもありがとう

ダニ

更新: ご提案ありがとうございます。私のデータフレームはfooと呼ばれ、次のようになります

Date Price Strike Name
1.1  100   1200    X
1.1  120   1500    P
etc.

インプライド ボラティリティを含む新しい列を作成したいと思います。申し込んでみましたが、

vol <- function(x) GBSVolatility(x["Price"], "c", S = 1000, x["Strike"], 
     Time = 1/4,  r = 0.01, b = 0.02, maxiter = 500)
foo$iv <- apply(foo, 1, vol)

しかし、うまくいきませんでした。

他に提案はありますか?ありがとう

4

3 に答える 3

3

行のデータ フレームに適用すると、データ フレームの 1 つ以上の列が文字の場合、数値が文字に変換されます。簡単な回避策は、vol で再度変換することです。

vol <- function(x) GBSVolatility(as.numeric(x["Price"]), "c", S = 1000,    
  as.numeric(x["Strike"]), Time = 1/4, r = 0.01, b = 0.02, maxiter = 500)
apply(foo, 1, vol)

これはエレガントではありません。おそらくd * plyなどを使用して、よりエレガントな方法を今思い出せません...

おそらくこれはよりエレガントです:

library(plyr)
vol <- function(x) GBSVolatility(x$Price, "c", S = 1000, x$Strike, 
  Time = 1/4, r = 0.01, b = 0.02, maxiter = 500)
foo$iv <- adply(foo, 1, vol)$V1
于 2010-12-10T14:11:23.593 に答える
2

$apply によって指定された入力は、data.frames ではなくベクトルという名前であるため、使用しないでください。したがって、これは機能するはずです:

vol <- function(x) GBSVolatility(x["Price"], "c", S = 1000, x["Strike"], 
         Time = 1/4,  r = 0.01, b = 0.02, maxiter = 500)
foo$iv <- apply(foo, 1, vol)
于 2010-12-10T11:38:17.777 に答える
1

これが私にできる最善のことです。これはもう少し「魔法」ですが、これまでで最も読みやすいオプションだと思いますか?

foo <- read.table(textConnection("Date Price Strike Name
1.1  100   1200    X
1.1  120   1500    P"),header=TRUE)

foo$iv <- with(d,mapply(GBSVolatility,
              Price,Strike,
              MoreArgs=list(TypeFlag="c",S=1000,
                Time=1/4,r=0.01,b=0.02,maxiter=500)))
于 2010-12-10T23:21:42.173 に答える