![](/img/trans.png)
[英]How to use a matrix as an input in a User-Defined Function and Loop it in R?
[英]How to use uniroot to solve a user-defined function (UDF) in a dataframe?
我有一個數據框,想在每一行上使用 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"
首先:您應該包含用於包rootSolve
的library
語句。 變量r
和sig
在哪里定義?
沒有必要為uniroot.all
,你可以通過檢查功能看bscall
。 不需要迭代; price
是直接從輸入中計算出來的。
考慮到第一個答案,定義 df 如下。
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))
列type
已被注釋掉。
將您的函數bscall
定義為
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)
}
給r
並sig
一個值
r <- .05
sig <- 1
將您的函數應用於df
行(由於更改為df
z
索引已更改)
apply(df, 1,
function(z) bscall(z[3],z[1],r,z[4],sig) - z[2])
給予
[1] 2.258107 3.168623 32.840162 34.366636
作為答案。
剩下的就看你了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.