3

我有一个相当简单的问题,但不幸的是无法得到结果:我想将 GBSVolatility 函数应用于我的 data.frame 的每一行。

我做了以下事情:

> 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

如果数据框的一列或多列是字符,则在行上申请数据框会将数字转换为字符。如此简单的解决方法是在 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 回答