我正在尝试运行四个嵌套循环,如下所示。我试图找到MA1,MA2,SL和LS的最佳组合。为了保持简洁,我向您展示了我在中间运行评论的示例。如下所示,MA1为1-364,MA2为2-365,SL和LS为.001 - .05。我进行了设置,因此MA2总是比MA1多一个,因为检查1和2与检查2和1相同(在这种情况下)。
main <- function(...) {
MA1 <- 1
repeat{
MA1 <- MA1 + 1
if(MA1>364){
break
}
MA2 <- MA1
repeat{
MA2 <- MA2 + 1
SL <- 0
if(MA2>365){
break
}
repeat{
SL <- SL + .001
if(SL>.05){
break
}
LS <- 0
repeat{
LS <- LS + .001
Day <- MA2 + 1
if(LS>.05){
break
}
n <- n + 1
#Finding the Profit/Loss of the combination
#PnL <- FindPnL(MA1, MA2, SL, LS)
}
}
}
}
return(n)
}
n&lt; - N + 1仅用于运行
我可以通过不同的方式创建此循环序列吗?现在,使用system.time() 用户系统已过 156.972 0.693 158.555 我的目标是使这个数字尽可能小。
答案 0 :(得分:1)
略微更像R的做事方式是设置输入矩阵然后重复它们。我已经为你做了这件事。我将LS
和SL
的粒度减半,以使结束大小更合理,但生成的grid2
对象仍然有41,518,750个参数组合......你真的需要吗?所有这些??
MA1 = 1:364
MA2 = 2:365
SL = seq(0, 0.05, by = 0.002)[-1]
LS = seq(0, 0.05, by = 0.002)[-1]
grid1 = expand.grid(MA1, MA2)
names(grid1) = c("MA1", "MA2")
grid1 = grid1[grid1$MA1 < grid1$MA2, ]
grid2 = expand.grid(1:nrow(grid1), SL, LS)
names(grid2) = c("g1row", "SL", "LS")
grid2 = cbind(grid2, grid1$MA1[grid2$g1row], grid1$MA2[grid2$g1row])
names(grid2)[4:5] = c("MA1", "MA2")
grid2$g1row = NULL
使用此设置,您的嵌套循环可以替换为grid2
行上的单个循环,或者您可以使用apply
或mapply
重写它。为结果预先分配矢量或列表,如果使用for循环则填写它。
此方法的另一个优点是您使用的变量范围非常清晰。这有助于减少错误。例如,在您的代码中,您的描述与代码之间存在不匹配:您说MA1
从1到364,但在您的代码中将其初始化为1,然后立即添加1以便从2开始当你进入第一个n <- n + 1
步骤时。
它可能不会比你上面的更快或更快,你以一种真正的R式方式使用R的机会是矢量化你的函数,无论你在{{{ 1}} ---但你似乎不愿意提供甚至模糊的细节。
如果您正在优化某些内容,寻找最小值或最大值,那么您最好使用优化函数,例如,请参阅n <- n + 1
或optim
包。 / p>