Я использую пакет blotter для запуска backtest и используя foreach для ускорения работы. Я сталкиваюсь с ошибкой, когда пятновыделение находит портфолио с тем же именем, хотя предполагается, что оно должно быть удалено в начале функции. Вот пример кода для воспроизведения ошибкиR: Использование 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, однако
- Wouldn» t foreach порождает каждого работника в новой R-сессии, чтобы не возникало конфликтов?
- Почему не работали
try(rm("account.Snazzy","portfolio.Snazzy",pos=.blotter),silent=TRUE)
? - Как я могу получить foreach для работы с blotter здесь?
Если это имеет значение, я использую R 3.0.2, запустив RStudio в Windows. Я включаю квант в тег, потому что они обычно используются вместе, поэтому, вероятно, опытный пользователь квантры будет знать исправление. Спасибо
Спасибо Стив за разъяснения! Я вырыл дальше и просто для того, чтобы предоставить более подробную информацию для других, среда оценки функции была окружена временной средой, созданной foreach/doSNOW, которая, в свою очередь, была окружена глобальной средой. Поэтому, когда «.blotter» был экспортирован во временную среду, был «.blotter» как во временной среде, так и в глобальной среде. Команда «rm» заперта на той, что была во временной среде, в то время как пакет blotter использовал его в глобальной среде. – wintermelon
Это совершенно верно. Тот же метод используется doMPI, doRedis, и когда объект кластера зарегистрирован в doParallel. Эта временная среда - это то, что я называю «экспортной» средой. –