在quantstrat包中,我找到了applyRule函数缓慢的主要元凶之一,并想知道是否有更高效的编写while循环。任何反馈都会有帮助。对于任何经验包装这部分并行R.虽然循环R量子代码 - 如何使其更快?
作为一个选项申请将工作,而不是?还是应该将这部分重新写入新的函数,如ruleProc和nextIndex?我也在研究Rcpp,但这可能是一个streach。任何帮助和建设性的意见非常感谢?
while (curIndex) {
timestamp = Dates[curIndex]
if (isTRUE(hold) & holdtill < timestamp) {
hold = FALSE
holdtill = NULL
}
types <- sort(factor(names(strategy$rules), levels = c("pre",
"risk", "order", "rebalance", "exit", "enter", "entry",
"post")))
for (type in types) {
switch(type, pre = {
if (length(strategy$rules[[type]]) >= 1) {
ruleProc(strategy$rules$pre, timestamp = timestamp,
path.dep = path.dep, mktdata = mktdata, portfolio = portfolio,
symbol = symbol, ruletype = type, mktinstr = mktinstr)
}
}, risk = {
if (length(strategy$rules$risk) >= 1) {
ruleProc(strategy$rules$risk, timestamp = timestamp,
path.dep = path.dep, mktdata = mktdata, portfolio = portfolio,
symbol = symbol, ruletype = type, mktinstr = mktinstr)
}
}, order = {
if (length(strategy$rules[[type]]) >= 1) {
ruleProc(strategy$rules[[type]], timestamp = timestamp,
path.dep = path.dep, mktdata = mktdata, portfolio = portfolio,
symbol = symbol, ruletype = type, mktinstr = mktinstr,)
} else {
if (isTRUE(path.dep)) {
timespan <- paste("::", timestamp, sep = "")
} else timespan = NULL
ruleOrderProc(portfolio = portfolio, symbol = symbol,
mktdata = mktdata, timespan = timespan)
}
}, rebalance = , exit = , enter = , entry = {
if (isTRUE(hold)) next()
if (type == "exit") {
if (getPosQty(Portfolio = portfolio, Symbol = symbol,
Date = timestamp) == 0) next()
}
if (length(strategy$rules[[type]]) >= 1) {
ruleProc(strategy$rules[[type]], timestamp = timestamp,
path.dep = path.dep, mktdata = mktdata, portfolio = portfolio,
symbol = symbol, ruletype = type, mktinstr = mktinstr)
}
if (isTRUE(path.dep) && length(getOrders(portfolio = portfolio,
symbol = symbol, status = "open", timespan = timestamp,
which.i = TRUE))) {
}
}, post = {
if (length(strategy$rules$post) >= 1) {
ruleProc(strategy$rules$post, timestamp = timestamp,
path.dep = path.dep, mktdata = mktdata, portfolio = portfolio,
symbol = symbol, ruletype = type, mktinstr = mktinstr)
}
})
}
if (isTRUE(path.dep))
curIndex <- nextIndex(curIndex)
else curIndex = FALSE
}
我怀疑问题是固有的'while',但'while'内无论发生什么情况。你的代码似乎没有做任何事情 - 没有赋值或返回值。所以你必须运行这个,因为'ruleProc'的副作用。如果其中一个副作用是你在其他地方赋值,我会从重构开始。根据我的经验,在结果列表中使用'lapply'和'do.call'通常比使用'[<-''选择性分配更快。 – Andrie
如果您发布了每个提供的每个基础数据结构的玩具示例,那么我认为'for'可以是矢量化的。而且,像nextIndex和ruleProc这样的函数也需要被显示。只有在这之后,有人才能对“while”循环做出很好的评估。 – John
好的,只是查找了这个代码...尝试先获得ruleProc矢量化。事实上,如果'ruleProc'是这个代码非常慢的例子,那么你可以轻松地进行大幅加速,几乎没有任何想法。通过'ruleProc'并把所有的东西都从包含整个函数的巨大'for'循环中移出。很多。如果你不能自己做那部分,然后张贴它进行矢量化。但先行动吧。 – John