En el paquete quantstrat he localizado a uno de los principales culpables de la lentitud de la función applyRule y me pregunto si es más eficiente escribir el ciclo while. Cualquier comentario sería útil. Para cualquier persona que experimente envolviendo esta parte en el Paralelo R.Mientras se repite el código de R quantstrat, ¿cómo hacerlo más rápido?
Como opción, ¿se aplicaría? ¿O debería volver a escribir esta parte en una nueva función como ruleProc y nextIndex? También estoy deleitándome con Rcpp, pero eso puede ser un streach. ¿Alguna ayuda y consejo constructivo es muy apreciado?
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
}
me gustaría duda el problema es inherente a la 'while', pero lo que sucede en el interior del' while'. Su código no parece hacer nada: no hay asignación de valores o un valor de retorno. Por lo tanto, debe ejecutar esto debido a los efectos secundarios de 'ruleProc'. Si uno de los efectos colaterales es que estás asignando valores en otro lugar, empezaría refaccionando eso. En general, es más rápido usar 'lapply' y' do.call' en la lista resultante que la asignación selectiva usando '[<-', en mi experiencia. – Andrie
Si publicó ejemplos de juguetes de cada una de las estructuras de datos subyacentes presentadas, entonces creo que 'for' podría ser vectorizado. Además, las funciones como 'nextIndex' y' ruleProc' necesitan ser reveladas también. Solo después de eso alguien podría hacer una buena evaluación del ciclo 'while'. – John
OK, acabo de buscar este código ... intente primero vectorizar ruleProc. De hecho, si 'ruleProc' es un ejemplo de cuán terriblemente lento es este código, puede tener aceleraciones grandes y fáciles para casi no pensar. Ir a través de 'ruleProc' y simplemente mover todo fuera del bucle gigante' for' que envuelve toda la función. Es mucho. Luego publícalo para vectorización si no puedes hacer esa parte tú mismo. Pero haz el movimiento primero. – John