使用行值作为 R 函数中的变量在数据框中创建新列

Creating a new column in dataframe using row values as variables in a function in R

我有一个数据框:

df <- structure(list(LAST = c(3.4, 2.52, 1.82, 1.16, 0.69, 0.36, 4, 
3.21, 2.54, 1.93), CURRENTPRICE = c(464.16, 464.16, 464.16, 464.16, 
464.16, 464.16, 464.16, 464.16, 464.16, 464.16), STRIKEPRICE = c(461, 
462, 463, 464, 465, 466, 461, 462, 463, 464), YEARSTOEXPIRATION = c(0.00273972602739726, 
0.00273972602739726, 0.00273972602739726, 0.00273972602739726, 
0.00273972602739726, 0.00273972602739726, 0.010958904109589, 
0.010958904109589, 0.010958904109589, 0.010958904109589)), row.names = c(NA, 
-10L), class = c("data.table", "data.frame"))

我正在尝试创建一个新列,使用来自每一行的数据并使用 RQuantLib 包中的 AmericanOptionImpliedVolatility 函数来计算每一行的隐含波动率:

df$IMPLIEDVOLATILITY <- AmericanOptionImpliedVolatility(type="call", value=df$LAST, underlying=df$CURRENTPRICE, strike=df$STRIKEPRICE, dividendYield=0.00, riskFreeRate=.03, maturity=df$YEARSTOEXPIRATION, volatility=0.2)

我知道代码有误,因此收到错误消息:

“americanOptionImpliedVolatilityEngine 中的错误(类型、值、基础、:期望单个值:[extent=10]”。

如何正确使用“AmericanOptionImpliedVolatility”函数并将行值作为变量来创建具有该结果值的新列?

您可以使用以下解决方案。您必须在按行操作中应用 AmericanOptionImpliedVolatility 函数,因为该函数不是矢量化函数。 pmap_dbl 函数将一个函数并行应用于各种参数,如果您注意到我使用了 ..1..2 和 ... 来引用一行中每个变量的相应值,其中包含您的数据集中有 4 个变量:

library(RQuantLib)
library(purrr)
library(dplyr)

df %>%
  mutate(IMPLIEDVOLATILITY = pmap_dbl(cur_data(), 
                                  ~ AmericanOptionImpliedVolatility(type = "call", 
                                                                    value = ..1, 
                                                                    underlying = ..2,
                                                                    strike = ..3,
                                                                    dividendYield = 0.00,
                                                                    riskFreeRate = 0.03,
                                                                    maturity = ..4, 
                                                                    volatility = 0.2)))

    LAST CURRENTPRICE STRIKEPRICE YEARSTOEXPIRATION IMPLIEDVOLATILITY
 1: 3.40       464.16         461       0.002739726         0.1205832
 2: 2.52       464.16         462       0.002739726         0.1121899
 3: 1.82       464.16         463       0.002739726         0.1157733
 4: 1.16       464.16         464       0.002739726         0.1091899
 5: 0.69       464.16         465       0.002739726         0.1074442
 6: 0.36       464.16         466       0.002739726          0.104724
 7: 4.00       464.16         461       0.010958904        0.09853768
 8: 3.21       464.16         462       0.010958904        0.09443249
 9: 2.54       464.16         463       0.010958904        0.09343687
10: 1.93       464.16         464       0.010958904        0.09130677

您可以简单地使用 apply 并使用列名按行分配值。

请记住,我编写了一个虚拟函数,因此在我的示例中结果值显然是错误的。

df$IMPLIEDVOLATILITY <- apply( df, 1, function(x) 
  AmericanOptionImpliedVolatility(
    type="call", value=x["LAST"], underlying=x["CURRENTPRICE"], 
    strike=x["STRIKEPRICE"], dividendYield=0.00, riskFreeRate=.03, 
    maturity=x["YEARSTOEXPIRATION"], volatility=0.2 ) )

df
   LAST CURRENTPRICE STRIKEPRICE YEARSTOEXPIRATION IMPLIEDVOLATILITY
1  3.40       464.16         461       0.002739726            467.56
2  2.52       464.16         462       0.002739726            466.68
3  1.82       464.16         463       0.002739726            465.98
4  1.16       464.16         464       0.002739726            465.32
5  0.69       464.16         465       0.002739726            464.85
6  0.36       464.16         466       0.002739726            464.52
7  4.00       464.16         461       0.010958904            468.16
8  3.21       464.16         462       0.010958904            467.37
9  2.54       464.16         463       0.010958904            466.70
10 1.93       464.16         464       0.010958904            466.09
df %>%
  rowwise() %>%
  mutate(IMPLIEDVOLATILITY = 
           RQuantLib::AmericanOptionImpliedVolatility(type="call", 
                  value = LAST, 
                  underlying = CURRENTPRICE, 
                  strike = STRIKEPRICE, 
                  dividendYield = 0.00, 
                  riskFreeRate =.03,
                  maturity = YEARSTOEXPIRATION,
                  volatility=0.2))



LAST CURRENTPRICE STRIKEPRICE YEARSTOEXPIRATI~ IMPLIEDVOLATILI~
   <dbl>        <dbl>       <dbl>            <dbl> <AmrcnOIV>      
 1  3.4          464.         461          0.00274 0.12058321      
 2  2.52         464.         462          0.00274 0.11218994      
 3  1.82         464.         463          0.00274 0.11577334      
 4  1.16         464.         464          0.00274 0.10918985      
 5  0.69         464.         465          0.00274 0.10744424      
 6  0.36         464.         466          0.00274 0.10472401      
 7  4            464.         461          0.0110  0.09853768      
 8  3.21         464.         462          0.0110  0.09443249      
 9  2.54         464.         463          0.0110  0.09343687      
10  1.93         464.         464          0.0110  0.09130677  

使用基础 R,你可以这样做:

transform(df, IMPLIEDVOLATILITY = 
           Vectorize(RQuantLib::AmericanOptionImpliedVolatility)(type="call", 
                  value = LAST, 
                  underlying = CURRENTPRICE, 
                  strike = STRIKEPRICE, 
                  dividendYield = 0.00, 
                  riskFreeRate =.03,
                  maturity = YEARSTOEXPIRATION,
                  volatility=0.2))