我在数据框中有一个数据集,其中包含以下信息:
> 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
有什么建议吗?
答案 0 :(得分:5)
您可以使用Vectorize
或mapply
。
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)
)
)