簡體   English   中英

如何使用 uniroot 解決數據幀中的用戶定義函數 (UDF)?

[英]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"

首先:您應該包含用於包rootSolvelibrary語句。 變量rsig在哪里定義?

沒有必要為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)
}

rsig一個值

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM