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
我需要 运行 并行进行冗长且计算量大的回测。 我的回测平均需要 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