我可以使用什么 R 函数来累加数据帧中的月度回报?



我想将数据帧中的月回报汇总为年度回报。不幸的是,我不明白聚合函数是如何根据 R 提供的信息工作的;或者如果它甚至是正确的功能开始。代码本身基于BatchGetSymbols,因为我想对动量/逆向策略的指数(在本例中为标准普尔500指数(中的所有股票代码进行排名。

我已经尝试了聚合函数,它给了我这些错误消息:

aggregate(prelimranking, FUN = add_row(prelimranking$ret.adjusted.prices))
"Error: Can't subset with `[` using an object of class NULL.
Call `rlang::last_error()` to see a backtrace
In addition: Warning message:
`.data` must be a data frame in `add_row()` and `add_case()`."

这是相关代码:

//
library(BatchGetSymbols)
library(tidyverse)
library(plyr)
library(dplyr)
first.date <- Sys.Date() - 365
last.date <- Sys.Date()
GSPCData <- GetSP500Stocks(do.cache = TRUE, cache.folder = "BGS_Cache")
tickers <- GSPCData$Tickers

l.out <- BatchGetSymbols(tickers = tickers,first.date = first.date,last.date = last.date, do.cache=FALSE, freq.data = "monthly")

prelimranking <- na.omit(l.out$df.tickers) 
//

因此,我得到的"初步排名"基本上是一个有大约 6000 行的表格,每个股票代码都有 12 行用于每个月返回。我想要的是一个汇总了每月回报的表格,所以我得到了大约 500 行,每个股票代码一个;这样我就可以根据他们的回报对他们进行排名。 非常感谢您的时间。

library(PerformanceAnalytics)
aggmon <- function(x){
vals <- rep(NA, 11)
ann <- c(vals, Return.cumulative(x))
return(ann)
}
annual_rets <- transform(prelimranking, ret.monthly = ave(ret.adjusted.prices, ticker, FUN = aggmon))

上面的代码保留了数据的原始结构,并将年回报率放在每个股票代码的观测值的最后一行。自定义函数 aggmon 计算月回报的年回报率。它使用性能分析包中的函数来计算累积回报。该函数返回 11 个 NA 和年度回报。这是因为每个股票代码正好有 12 个观测值。

由于您使用的是 BatchGetSymbol 包,该包返回一个包含 tibble 的列表对象,因此您可能还需要加载 tidyquant。这是一个可以处理 tibble 并使用 quantmod 函数来计算周期回报的包。否则,您必须将所有数据拆分为一个巨大的列表,并使用lapply和 xts 转换。

我在下面创建了一个只有 2 个股票代码的示例,因为我不打算下载 SP500 股票的完整数据。

library(BatchGetSymbols)
library(tidyquant)
tickers <- c('FB','MMM')
first.date <- Sys.Date() - 365
last.date <- Sys.Date()
l.out <- BatchGetSymbols(tickers = tickers,
first.date = first.date,
last.date = last.date, do.cache=FALSE,
freq.data = "monthly")

l.out$df.tickers %>%
group_by(ticker) %>%
tq_transmute(select     = "price.adjusted", 
mutate_fun = periodReturn, 
period     = "yearly", 
type       = "arithmetic")
# A tibble: 4 x 3
# Groups:   ticker [2]
ticker ref.date   yearly.returns
<chr>  <date>              <dbl>
1 FB     2018-12-03       -0.121  
2 FB     2019-09-03        0.293  
3 MMM    2018-12-03        0.00313
4 MMM    2019-09-03       -0.221  

最新更新