【发布时间】:2014-03-12 01:57:35
【问题描述】:
我正在使用吸墨纸包运行回测,并使用 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 用户可能会知道修复方法。谢谢
【问题讨论】:
标签: r foreach parallel-processing quantstrat blotter