R:运行并行化的回测

时间:2016-08-26 15:56:47

标签: r parallel-processing finance quantitative-finance back-testing

我需要并行运行冗长且计算密集的后端测试。 我的回测平均需要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方式的建议。< / p>

感谢您的帮助和时间,

1 个答案:

答案 0 :(得分:1)

此链接非常清楚地回答了我的问题:

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

重要部分:

foreach包背后的想法是创建'循环和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