我想将数据帧中的月回报汇总为年度回报。不幸的是,我不明白聚合函数是如何根据 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