2

ブロッター パッケージを使用してバックテストを実行し、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. foreach は、競合がないように、ある種の新しい R セッションで各ワーカーを生成しませんか?
  2. なぜうまくいかなかったのtry(rm("account.Snazzy","portfolio.Snazzy",pos=.blotter),silent=TRUE)ですか?
  3. ここで foreach をブロッターで動作させるにはどうすればよいですか?

問題があれば、私は R 3.0.2 を使用しており、Windows で RStudio を実行しています。タグに quantstrat を含めています。これらは通常一緒に使用されるため、経験豊富な quantstrat ユーザーは修正を知っている可能性があります。ありがとう

4

1 に答える 1

2

問題は、「.blotter」が自動的にワーカーにエクスポートされていることですが、グローバル環境ではなく、doSNOW の「エクスポート」環境にエクスポートされます。これによりブロッター パッケージが混乱することはありませんが、実際の「.blotter」環境から「account.Snazzy」と「portfolio.Snazzy」を「rm」コマンドで削除できなくなります。

.noexport=".blotter"1 つの解決策は、foreachに追加することです。別の解決策は、「rm」を実行するときに環境をより明示的に指定することです。

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

doSNOW は、タスクごとにワーカーを生成しません。これは、非常に遅くなる可能性があるためです。ローカル ワーカーの場合でも、R セッションを起動する時間は、特に ssh を使用するクラスターでは、タスクを実行する時間と比較してかなり長くなる可能性があります。さらに重要なことは、ワーカーが複数のタスクを実行する場合、大量のデータ セットをワーカーに一度送信すれば、そのデータを多くのタスクで再利用できるため、通信コストを償却できます。

于 2014-03-12T19:25:54.437 に答える