R:使用foreach与blotter,投资组合已经存在错误



我正在使用blotter软件包来运行回测,并使用foreach加快速度。我遇到了一个错误,即使格罗特在功能开始时应该删除使用相同名称的投资组合。这是重现错误

的示例代码
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环境中,但是

  1. 不会在新的r会议中产生每个工人,以免发生冲突?
  2. 为什么try(rm("account.Snazzy","portfolio.Snazzy",pos=.blotter),silent=TRUE)不起作用?
  3. 我该如何在这里与墨水一起使用?

如果重要的话,我正在使用r 3.0.2,在Windows上运行rstudio。我将Quantstrat在标签中加入,因为它们通常被一起使用,因此它可能会有经验丰富的Quantstrat用户知道该修复程序。谢谢

问题在于," .blotter"是自动导出给工人的,但要dosnow的"导出"环境,不是到全球环境。这不会混淆墨水包,但确实会阻止您的" rm"命令删除" account.snazzy"one_answers" portfolio.snazzy"。

一种解决方案是将.noexport=".blotter"添加到foreach中。另一个解决方案是执行" RM"时更明确地指定环境:

try(rm("account.Snazzy","portfolio.Snazzy",pos=.GlobalEnv$.blotter),
    silent=TRUE)

dosnow不会为每个任务产生一个工人,因为这可能很慢。即使对于本地工人,与执行任务的时间相比,启动R会话的时间可能很重要,尤其是在使用SSH的集群上。更重要的是,如果工人执行多个任务,您可以向他们发送大型数据集,并将这些数据重复使用以进行许多任务,从而摊销通信成本。

相关内容

  • 没有找到相关文章

最新更新