R使用apply / plyr和RQuantlib函数

时间:2012-04-09 04:14:30

标签: r plyr

我在数据框中有一个数据集,其中包含以下信息:

> head(rs1)
       dater adjStkPrice                optSym     expire strike   bid   ask unadjStkPrice daysLeft   pnl
1 2011-01-03      127.05 SPY   131221P00115000 2013-12-21    115 14.89 15.40        127.05     1083 319.5
2 2011-01-04      126.98 SPY   131221P00115000 2013-12-21    115 15.00 15.39        126.98     1082 328.4
3 2011-01-05      127.64 SPY   131221P00115000 2013-12-21    115 14.39 14.86        127.64     1081 287.2
4 2011-01-06      127.39 SPY   131221P00115000 2013-12-21    115 14.38 14.80        127.39     1080 278.7
5 2011-01-07      127.14 SPY   131221P00115000 2013-12-21    115 14.67 15.10        127.14     1079 300.2
6 2011-01-10      126.98 SPY   131221P00115000 2013-12-21    115 14.75 15.19        126.98     1076 303.4

我正在尝试使用AmericanOptionImpliedVolatility包中的RQuantLib函数获取隐含波动率。问题是它似乎只采用单组值:

> rs1$impVol <- AmericanOptionImpliedVolatility("put", rs1$ask,
+ rs1$adjStkPrice, rs1$strike, .02, .05, rs1$daysLeft/ 365, .4)$impliedVol
Error in AmericanOptionImpliedVolatility.default("put", rs1$ask, rs1$adjStkPrice,  : 
  expecting a single value

我认为这是apply函数的一个位置,但我不确定我是否正确使用它:

> rs1$impVol <- apply(rs1, 1, AmericanOptionImpliedVolatility("put", rs1$ask,
+ rs1$adjStkPrice, rs1$strike, .02, .05, rs1$daysLeft/ 365, .4)$impliedVol)
Error in AmericanOptionImpliedVolatility.default("put", rs1$ask, rs1$adjStkPrice,  : 
  expecting a single value

有什么建议吗?

1 个答案:

答案 0 :(得分:5)

您可以使用Vectorizemapply

Vectorize(AmericanOptionImpliedVolatility)(
  type="put", value=15:16, underlying=130:131, 
  strike=115, dividendYield=.02, riskFreeRate=.05, maturity=1, 
  volatility=.1
)

mapply(
  AmericanOptionImpliedVolatility,
  type="put", value=15:16, underlying=130:131, 
  strike=115, dividendYield=.02, riskFreeRate=.05, maturity=1, 
  volatility=.1
)  

如果你想使用apply,它的第三个参数应该是一个函数。 另外,它会将每一行转换为一个向量, 当某些列包含字符串时会出现问题。

你也可以在行号上使用sapply, 但它只是一个伪装的循环,不如mapply那么可读。

sapply(
  seq_len(nrows(rs1)),
  function(i) AmericanOptionImpliedVolatility( 
    type="put", 
    value=rs1$ask[i],
   ... (add the other arguments)
  )
)