是否可以优化(使其更快)这段代码:
out <- do.call(rbind,
lapply(split(Cl(cumulativeBars), "days"),
function(x) {
previousFullBars <- barsEndptCl[as.Date(index(barsEndptCl), tz=indexTZ(barsEndptCl)) < as.Date(last(index(x)), tz=indexTZ(x)), ]
if (NROW(previousFullBars) >= 4) {
last(SMA(last(rbind(previousFullBars, x), n=6), n=5))
} else {
xts(NA, order.by=index(x))
}
}))
您可以在下面找到我的原始问题,其中包含所有运行的代码示例,但对我的需要有点慢。
原始问题:
在我能够以累积方式将 xts 转换为较低频率之后如何以累积方式将 xts 转换为较低频率感谢阅读此列表的人。
现在我正在尝试使用下面的代码计算移动平均线的“演变”。这对我来说是缓慢的。可以以任何方式优化 tis 代码(来自 # TODO:如何计算移动平均线?,以 out <- do.call(rbind,lapply(split(Cl(cumulativeBars)...) 开头的部分)吗?
to.weekly.cumulative <- function(xts.obj, name="") {
out <- do.call(rbind,
lapply(split(xts.obj, 'weeks'),
function(x) cbind(rep(first(x[,1]), NROW(x[,1])),
cummax(x[,2]), cummin(x[,3]), x[,4])))
colnames(out) <- paste(name, c("Open", "High", "Low", "Close"), sep=".")
out
}
library(quantmod)
data(sample_matrix)
myxts <- as.xts(sample_matrix)
head(to.weekly.cumulative(myxts), 15)
# TODO: How to compute moving average?
# This SMA(Cl(to.weekly.cumulative(myxts)), n=5) would obviously be wrong
cumulativeBars <- to.weekly.cumulative(myxts)
barsEndptCl <- Cl(cumulativeBars[endpoints(cumulativeBars, 'weeks')])
barsEndptCl <- Cl(to.weekly(myxts))
#all.equal(cumulativeBars[endpoints(cumulativeBars, 'weeks')], to.weekly(myxts))
out <- do.call(rbind,
lapply(split(Cl(cumulativeBars), "days"),
function(x) {
previousFullBars <- barsEndptCl[as.Date(index(barsEndptCl), tz=indexTZ(barsEndptCl)) < as.Date(last(index(x)), tz=indexTZ(x)), ]
if (NROW(previousFullBars) >= 4) {
last(SMA(last(rbind(previousFullBars, x), n=6), n=5))
} else {
xts(NA, order.by=index(x))
}
}))
colnames(out) <- "SMA5"
out <- lag.xts(out, k=7)
chart_Series(to.weekly(myxts))
add_TA(SMA(to.weekly(myxts), 5), on=1, col="red")
add_TA(out, on=1, col="green")