下面的函数获取一个包含 CSV 文件的文件夹(每个文件都是具有日期时间、开盘价、最高价、最低价、收盘价列的金融时间序列)并为每个开盘价、最高价、最低价、收盘价创建一个 XTS 对象,其中每个XTS 列是个人证券。对于我的用例,这种表示允许更方便和更快的处理(与每个文件的单个 XTS 相比)。
require(quantmod)
LoadUniverseToEnv <- function(srcDir, env) {
fileList <- list.files(srcDir)
if (length(fileList) == 0)
stop("No files found!")
env$op <- NULL
env$hi <- NULL
env$lo <- NULL
env$cl <- NULL
cols <- NULL
for (file in fileList) {
filePath <- sprintf("%s/%s", srcDir, file)
if (file.info(filePath)$isdir == FALSE) {
x <- as.xts(read.zoo(filePath, header=TRUE, sep=",", tz=""))
cols <- c(sub("_.*", "", file), cols)
# do outer join
env$op <- merge(Op(x), env$op)
env$hi <- merge(Hi(x), env$hi)
env$lo <- merge(Lo(x), env$lo)
env$cl <- merge(Cl(x), env$cl)
cat(sprintf("%s : added: %s from: %s to: %s\n", as.character(Sys.time()), file, start(x), end(x)))
}
}
colnames(env$op) <- cols
colnames(env$hi) <- cols
colnames(env$lo) <- cols
colnames(env$cl) <- cols
}
对于有限数量的文件,性能很好,但随着 XTS 对象的宽度线性变慢,因此成为大型数据集的问题。合并期间的瓶颈是 CPU,当一个新列被附加到四个对象中的每一个时(例如,100 毫秒最初减慢 1 毫秒/列)
由于它受 CPU 限制,我的第一个想法是通过合并 n 批文件然后合并结果来并行化,但我想知道是否有更好的方法。