我正在使用吸墨纸包来运行回测,并使用 foreach 来加快速度。我遇到了一个错误,即即使它们应该在函数开始时被删除,blotter 也会找到具有相同名称的投资组合。这是重现错误的示例代码
require('foreach')
require('doSNOW')
require('xts')
require('blotter')
backtestFunction <- function() {
currency("USD")
stock("AAPL", currency="USD", multiplier=1)
Sys.setenv(TZ="US/Eastern")
verbose = FALSE
try(rm("account.Snazzy","portfolio.Snazzy",pos=.blotter),silent=TRUE)
initPortf("Snazzy", "AAPL", initDate="2014-01-01", currency="USD")
initAcct("Snazzy", portfolios="Snazzy", initDate="2014-01-01", initEq=1000, currency="USD")
return (TRUE)
}
cl <- snow::makeCluster(8, type = "SOCK")
registerDoSNOW(cl)
results <- foreach(i=1:100, .combine=rbind, .packages=c('xts','blotter')) %dopar% {
return (backtestFunction())
}
snow::stopCluster(cl)
这是错误
Error in { :
task 9 failed - "Portfolio Snazzy already exists, use updatePortf() or addPortfInstr() to update it."
我了解投资组合和帐户对象存储在 .blotter 环境中,但是
- foreach 不会在新的 R 会话中生成每个工人,这样就不会有冲突吗?
- 为什么没有
try(rm("account.Snazzy","portfolio.Snazzy",pos=.blotter),silent=TRUE)
工作? - 我怎样才能让 foreach 在这里使用吸墨纸?
如果重要的话,我使用的是 R 3.0.2,在 Windows 上运行 RStudio。我在标签中包含了 quantstrat,因为它们通常一起使用,因此有经验的 quantstrat 用户可能会知道修复方法。谢谢