R: 运行 并行回测

R: run parallelized backtest

我需要 运行 并行进行冗长且计算量大的回测。 我的回测平均需要 8 个小时才能完成 运行,而我需要 运行 30 个小时。它们都使用不同的输入调用相同的函数。到目前为止我能找到的是下面使用 foreach 包的代码。

require(foreach)
require(parallel)
require(doParallel)

cores = detectCores() #32
cl<-makeCluster(cores) #register cores
registerDoParallel(cl, cores = cores)

foreach (j=1:2) %dopar% {

     if(j == 1)
     {
      get_backtestRUN(inputA)
     }

     if(j == 2)
     {
      get_backtestRUN(inputB)
     }   
}

我的第一个问题比较笼统,我想知道上面的包是否是解决我问题的最佳方法。

我的第二个问题与额外计算能力的使用有关,因为我只能在我的本地机器上并行进行 运行 8 次回测,网上有很多选择,希望获得有关大多数 R 的建议友好的方式进行。

感谢您的帮助和时间,

这个 link 非常清楚地回答了我的问题:

https://www.r-bloggers.com/how-to-go-parallel-in-r-basics-tips/

下面是重要部分:

foreach 包背后的想法是创建“标准 for 循环和 lapply 函数的混合体”,它的易用性使其相当受欢迎。设置略有不同,您需要按如下方式“注册”集群:

library(foreach)
library(doParallel)

cl<-makeCluster(no_cores)
registerDoParallel(cl)

请注意,您可以将最后两行更改为:

registerDoParallel(no_cores)

但是你需要记住在最后做而不是 stopCluster() 做:

stopImplicitCluster()

foreach 函数可以被视为 parSapply 的一个更受控制的版本,它允许将结果组合成合适的格式。通过指定 .combine 参数,我们可以选择如何组合我们的结果,下面是一个向量、矩阵和一个列表示例:

foreach(exponent = 2:4, 
        .combine = c)  %dopar%  
  base^exponent

foreach(exponent = 2:4, 
        .combine = rbind)  %dopar%  
  base^exponent

         [,1]
result.1    4
result.2    8
result.3   16

foreach(exponent = 2:4, 
        .combine = list,
        .multicombine = TRUE)  %dopar%  
  base^exponent

[[1]]
[1] 4

[[2]]
[1] 8

[[3]]
[1] 16

请注意,最后一个是默认值,无需任何调整即可实现,只需 foreach(exponent = 2:4) %dopar%。在示例中,值得注意的是避免嵌套列表所需的 .multicombine 参数。嵌套是由于连续的 .combine 函数调用而发生的,即 list(list(result.1, result.2), result.3):

foreach(exponent = 2:4, 
        .combine = list)  %dopar%  
  base^exponent
[[1]]
[[1]][[1]]
[1] 4

[[1]][[2]]
[1] 8


[[2]]
[1] 16