r - 如何使用 uniroot 解决数据框中的用户定义函数 (UDF)?
问题描述
我有一个数据框,想在每一行上使用 uniroot 来解决基于 Black-Scholes 公式的隐含波动率。使用 uniroot.all 解决每一行的正确方法是什么?它应该产生一个新的结果列向量。
下面的代码有这个错误
“S/K 中的错误:二元运算符的非数字参数”
. 我怀疑当 uniroot 尝试解决多行而不是逐行解决时,麻烦就来了。
我试图修改为 bscall 函数的矢量化版本,但这似乎不是最好的方法。
df <- data.frame( strike = c(80,120,100,100),
type = c("C", "C", "C","C"),
optionPrice = c(22,3,7,9),
futurePrice = c(100, 100,100,100),
time_to_expiry = c(0.1, 0.1,1,1.2))
bscall <-
function (S,K,r,T,sig) {
d1 <- (log(S/K)+(r+0.5*sig^2)*T) / (sig*sqrt(T))
d2 <- d1 - sig*sqrt(T)
price <- S*pnorm(d1) - K*exp(-r*T)*pnorm(d2)
return(price)
}
apply(df, 1,
function(z) uniroot.all( function(x) bscall(z[4],z[1],r,z[5],x) - z[3], interval = c(0,1) ))
解决方案
第一行df
是80, "C", 22, 100, 0.1
。它包含一个字符串。因此,当您这样做时apply(df, 1, ....)
,行将被强制转换为字符向量:
df <- data.frame( strike = c(80,120,100,100),
type = c("C", "C", "C","C"),
optionPrice = c(22,3,7,9),
futurePrice = c(100, 100,100,100),
time_to_expiry = c(0.1, 0.1,1,1.2))
apply(df, 1, function(z) z)
# [,1] [,2] [,3] [,4]
# strike " 80" "120" "100" "100"
# type "C" "C" "C" "C"
# optionPrice "22" " 3" " 7" " 9"
# futurePrice "100" "100" "100" "100"
# time_to_expiry "0.1" "0.1" "1.0" "1.2"