我试图计算15天线条上的指数移动平均线,但希望看到15日线条EMA在每个(尾)日/线条上的“演变”。所以,这意味着我有15天的酒吧。当每天都有新的数据出现时,我想使用新的信息重新计算EMA。其实我有15天的酒吧,然后,每天过后,我新的15天酒吧开始增长,每个新酒吧应该用于EMA计算以及以前的整整15天的酒吧。加速WMA(加权移动平均线)的计算
假设我们从2012-01-01开始(本例中为每个日历日的数据),在2012-01-15年底,我们有第一个完整的15天吧。我们可以在2012-03-01完成4个完整的15天的条形图后,开始计算4 bar EMA(EMA(x,n = 4))。在2012年3月2日结束时,我们将使用我们目前为止的信息,并在2012-03-02计算EMA,假设2012-03-02的OHLC是15天的酒吧进行中。所以我们在2012-03-02拿4个完整的酒吧和酒吧并且计算EMA(x,n = 4)。然后,我们再等一天,看看正在进行的新的15天工作条发生了什么(有关详细信息,请参阅下面的函数to.period.cumulative),并计算EMA的新值......并且在接下来的15天之后... ...请参阅功能EMA.cumulative以下详细...
下面请找到我能够想出到现在。这种表现对我来说是不可接受的,而且我对有限的R知识无法做得更快。
library(quantmod)
do.call.rbind <- function(lst) {
while(length(lst) > 1) {
idxlst <- seq(from=1, to=length(lst), by=2)
lst <- lapply(idxlst, function(i) {
if(i==length(lst)) { return(lst[[i]]) }
return(rbind(lst[[i]], lst[[i+1]]))
})
}
lst[[1]]
}
to.period.cumulative <- function(x, name=NULL, period="days", numPeriods=15) {
if(is.null(name))
name <- deparse(substitute(x))
cnames <- c("Open", "High", "Low", "Close")
if (has.Vo(x))
cnames <- c(cnames, "Volume")
cnames <- paste(name, cnames, sep=".")
if (quantmod:::is.OHLCV(x)) {
x <- OHLCV(x)
out <- do.call.rbind(
lapply(split(x, f=period, k=numPeriods),
function(x) cbind(rep(first(x[,1]), NROW(x[,1])),
cummax(x[,2]), cummin(x[,3]), x[,4], cumsum(x[,5]))))
} else if (quantmod:::is.OHLC(x)) {
x <- OHLC(x)
out <- do.call.rbind(
lapply(split(x, f=period, k=numPeriods),
function(x) cbind(rep(first(x[,1]), NROW(x[,1])),
cummax(x[,2]), cummin(x[,3]), x[,4])))
} else {
stop("Object does not have OHLC(V).")
}
colnames(out) <- cnames
return(out)
}
EMA.cumulative<-function(cumulativeBars, nEMA = 4, period="days", numPeriods=15) {
barsEndptCl <- Cl(cumulativeBars[endpoints(cumulativeBars, on=period, k=numPeriods)])
# TODO: This is sloooooooooooooooooow...
outEMA <- do.call.rbind(
lapply(split(Cl(cumulativeBars), period),
function(x) {
previousFullBars <- barsEndptCl[index(barsEndptCl) < last(index(x)), ]
if (NROW(previousFullBars) >= (nEMA - 1)) {
last(EMA(last(rbind(previousFullBars, x), n=(nEMA + 1)), n=nEMA))
} else {
xts(NA, order.by=index(x))
}
}))
colnames(outEMA) <- paste("EMA", nEMA, sep="")
return(outEMA)
}
getSymbols("SPY", from="2010-01-01")
SPY.cumulative <- to.period.cumulative(SPY, , name="SPY")
system.time(
SPY.EMA <- EMA.cumulative(SPY.cumulative)
)
在我的系统需要
user system elapsed
4.708 0.000 4.410
可接受的执行时间将超过1秒,少...是否有可能实现这一目标使用纯的R?
这篇文章链接到Optimize moving averages calculation - is it possible?我没有收到答案。我现在能够创建一个可重现的例子,并更详细地解释我想加速的内容。我希望这个问题现在更有意义。
任何想法如何加快这一点高度赞赏。
嗯,那么我有一个问题。可以说我们每天都有数据。我想以15天为单位/小节计算4小时EMA(EMA(x,n = 4))。因此,使用to.period将日常数据转换为15天的酒吧。那很简单。我想得到的是我想每天在15天酒吧看到4天EMA的发展。就像您希望随着新数据持续进入EMA的实时图形(附近)一样。您将最后一次已知数据视为完整的15天条(即使它仅仅是3天“旧”)。然后你把你现在知道的和以前所有完整的15天酒吧和EMA计算出来。好点? – Samo 2012-01-03 23:51:29
约书亚,谢谢你的好意。只是为了让你意识到边界和开始条件:我是一个兼职的无利可图的零售交易者/程序员与一个小交易账户,使之成为一个业余爱好(或编程练习)谁选择R作为支持我的交易平台(好吧,只有backtesting实际上)活动。我没有为任何法律实体的商业目的而开发此项服务。我非常感谢您在空闲时间提供的所有支持和所有支持。如果我没有“免费”的其他想法,那么我肯定会接受你的好意。 – Samo 2012-01-04 00:10:35
约书亚,这个没有收入,对不起。感谢您推动我学习如何在R中使用C.感谢TTR中的C和Fortran代码。 – Samo 2012-01-15 21:37:53