【问题标题】:Creating a new column in dataframe using row values as variables in a function in R使用行值作为R中函数中的变量在数据框中创建新列
【发布时间】:2021-12-24 08:34:52
【问题描述】:

我有一个数据框:

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”函数并将行值作为变量来创建具有该结果值的新列?

【问题讨论】:

    标签: r dataframe dplyr apply purrr


    【解决方案1】:
    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))
    

    【讨论】:

    • 总是很高兴 :) 永远不要忘记我从你那里直接或间接学到的所有东西,所以我永远感激你。
    【解决方案2】:

    您可以使用以下解决方案。您必须在逐行操作中应用 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
    

    【讨论】:

    • 这太棒了。
    • 你太棒了!我为此下载了一个包,我不知道为什么大声笑。
    • 有时您不必知道它的用途。你只要回答问题哈哈
    • 是的,它正好适合pmap,我是为了过去而去的。
    【解决方案3】:

    您可以简单地使用 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
    

    【讨论】:

    • 您的代码有问题。请注意,您的答案完全不同
    • 值错误,如最后一行所述。如果你运行它,结果应该没问题。
    • @Onyambu 认为它也可能会混淆其他人。但是让我们看看,也许没问题... :)
    • 在 SO 上连接有点困难。这就是为什么我寻找你的答案之一并发表评论。为了让你打开这个解决方案
    • @Onyambu 这就是我的假设,只是想为另一个似乎有点困惑的帖子的 OP 提供摩擦最小的解释:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多