优化移动平均线计算 - 是否可能?

时间:2011-11-10 07:55:49

标签: r finance xts quantmod

是否可以优化(使其快得多)这段代码:

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))
                        }
                    }))

下面你可以找到我原来的问题,所有代码示例都会运行,但有点慢,以满足我的需求。

原始问题:

感谢人们阅读此列表后,我能够以累积方式{x =}将xts转换为较低频率。

现在我正在尝试计算&#34; evolution&#34;移动平均线使用下面的代码。这对我来说很慢。可以代码(来自#TODO:如何计算移动平均线?,以&lt; - 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")

1 个答案:

答案 0 :(得分:0)

移动平均线不完全&#34;演变&#34;因为你可能试图确定。作为一个动量指标,它更多地关于周期而不是长期的进化&#34;。

当您看到趋势以某种方式发展时,您绝对可以跳过移动平均线。 200天趋势是在190天趋势之前,在此之前是180天趋势。这可能是一个更易于管理的概念,试图建立一个交易系统。