【问题标题】:R: Using foreach with blotter, portfolio already exists errorR:使用带有吸墨纸的foreach,投资组合已经存在错误
【发布时间】: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 环境中,但是

  1. foreach 不会在某种新的 R 会话中生成每个工作人员,这样就不会发生冲突吗?
  2. 为什么try(rm("account.Snazzy","portfolio.Snazzy",pos=.blotter),silent=TRUE) 不起作用?
  3. 如何让 foreach 在此处使用吸墨纸?

如果重要的话,我使用的是 R 3.0.2,在 Windows 上运行 RStudio。我在标签中包含了 quantstrat,因为它们通常一起使用,因此有经验的 quantstrat 用户可能会知道修复方法。谢谢

【问题讨论】:

    标签: r foreach parallel-processing quantstrat blotter


    【解决方案1】:

    问题是“.blotter”被自动导出到工作人员,但是到 doSNOW 的“导出”环境,不是到全局环境。这不会混淆吸墨纸包,但它确实会阻止您的“rm”命令从真实的“.blotter”环境中删除“account.Snazzy”和“portfolio.Snazzy”。

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

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

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

    【讨论】:

    • 感谢史蒂夫的澄清!我进一步挖掘,只是为了向其他人提供更多细节,函数的评估环境被 foreach/doSNOW 创建的临时环境包围,而临时环境又被全局环境包围。所以当“.blotter”导出到临时环境时,临时环境和全局环境中都有一个“.blotter”。 “rm”命令锁定在临时环境中的那个,而blotter包使用全局环境中的那个。
    • 说的很对。 doMPI、doRedis 以及使用 doParallel 注册集群对象时使用了相同的技术。这个临时环境就是我所说的“出口”环境。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2018-04-09
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多