使用 dplyr 添加带有 stock returns 的新列的函数

Function that adds new column with stock returns using dplyr

我只是想创建一个简单的函数,将每日 returns 列添加到股票价格数据框中。

作为手动脱衣舞,它看起来像这样:

AAL <- mutate(AAL, logreturn = Delt(AAL$Price, type = "log"))
rownames(AAL) <- AAL[, 1]
AAL <- AAL[, 2:4]
AAL[1, 3] <- 0

它是这样工作的。但是,我想通过简单地输入

来创建一个执行上述操作的函数
head(AAL)
        Date  Price Volume
1 2013-06-28 7.5839  31308
2 2013-07-01 7.2093   1054
3 2013-07-02 7.3098    109
4 2013-07-03 7.0539   1275
5 2013-07-04 7.0448     22
6 2013-07-05 7.0357    110

add_returns(AAL)


head(AAL)
            Price Volume   Delt.1.log
2013-06-28 7.5839  31308  0.000000000
2013-07-01 7.2093   1054 -0.050655720
2013-07-02 7.3098    109  0.013844054
2013-07-03 7.0539   1275 -0.035635258
2013-07-04 7.0448     22 -0.001290899
2013-07-05 7.0357    110 -0.001292568

我试过这样做但是没有用:

add_return <- function(symbol){

  symbol <- mutate(eval(parse(text = paste0(symbol, collapse = "")), 
                   logreturn =
 Delt(eval(parse(text = paste0(symbol, "$Price", collapse = ""))), 
                                        type = "log"))

rownames(symbol) <- eval(parse(text = paste0(symbol, "$Date", collapse = "")))

symbol <- eval(parse(text = paste0(symbol, "[2:4]", collapse = "")))

eval(parse(text = paste0(symbol, "[1, 3]", collapse = ""))) <- 0

}

如果您只想以编程方式传递数据集的名称,您可以很容易地做到这一点,例如像这样(几乎与您的 "manual" 脚本中的完全相同):

add_return <- function(data) {
  data <- transform(data, logreturn = Delt(Price, type = "log"))
  rownames(data) <- data[, 1]
  data <- data[, 2:4]
  data[1, 3] <- 0
  return(data)
}

然后,您可以使用以下方式调用您的函数:

add_return(AAL)
#            Price Volume   Delt.1.log
#2013-06-28 7.5839  31308  0.000000000
#2013-07-01 7.2093   1054 -0.050655720
#2013-07-02 7.3098    109  0.013844054
#2013-07-03 7.0539   1275 -0.035635258
#2013-07-04 7.0448     22 -0.001290899
#2013-07-05 7.0357    110 -0.001292568

话虽如此,如果您希望您的函数以编程方式允许其他输入,例如要处理的列名或新列的名称等,那将是另一回事。(在这种情况下,您会可能想看看 dplyr 的 non-standard evaluation vignette。)但是根据你的问题判断并尝试制定函数,这不是你打算做的。


如果您想永久更改全局环境中的数据,标准的 R 方法是:

AAL <- add_return(AAL)

通常不推荐从函数内部对全局环境进行赋值,所以我会坚持使用这种在这种情况下看起来很简单的标准方法。