与问题有些相关 Calculate the average based on other columns和R xts and data.table
从data.table的当前版本开始,有as.data.table.xts的函数。我想知道是否会有一个改进的解决方案,利用data.table。
感谢Vincent的功能。
可重复数据:
library(data.table)
library(quantmod)
getSymbols("SPY")
getSymbols("AAPL")
as.data.table.xts <- function(x, ...) {
cn <- colnames(x)
sscn <- strsplit(cn, "\\.")
indexClass(x) <- c('POSIXct', 'POSIXt') #coerce index to POSIXct
DT <- data.table(time=index(x), coredata(x))
#DT <- data.table(IDateTime(index(x)), coredata(x))
## If there is a Symbol embedded in the colnames, strip it out and make it a
## column
if (all(sapply(sscn, "[", 1) == sscn[[1]][1])) {
Symbol <- sscn[[1]][1]
setnames(DT, names(DT)[-1], sub(paste0(Symbol, "."), "", cn))
DT <- DT[, Symbol:=Symbol]
setkey(DT, Symbol, time)[]
} else {
setkey(DT, time)[]
}
}
spy.data <- as.data.table(SPY)
SPY_Day <- as.Date("2015-11-06")
AAPL_Day <- as.Date("2015-11-03")
spy.data[, time := as.Date(time)] # Not sure whether it is necessary, but it does not work with this conversion.
我想要实现的目标:
“紧接公告日前5/10/30连续交易日的平均收盘价/开盘价/高价/低价,但不包括交易暂停日(交易量为0天或NA)
问题1
查找紧接在公告日之前的连续5个交易日,但不包括交易停止日(交易量为0或NA的日期)
我想到tail
可能有用。
spy_5 <- tail(spy.data[Volume!=0 & time < Day], 5)
当我尝试平均部分的计算时
spy <- spy_5[ , lapply(.SD, function(x) mean(x, na.rm=TRUE)), by =.(Symbol), .SDcols = c(2:5)][, Lookback:=5L]
目前阶段
有没有办法摆脱data.table spy_5的中间产品?
有关更简洁代码的任何建议吗?
问题2
由于同一计算还有其他符号。
如果有任何方法可以使用rbindlist
和getSymbols
以data.table格式获取原始数据,然后继续。
**所需的输出**
Symbol Open High Low Close Lookback 1: SPY 209.826 210.84 208.884 209.93 5 2: SPY ** ** ** ** 10 3: AAPL ** ** ** ** 5 4: AAPL ** ** ** ** 10
欢迎任何建议。