R中最有效的嵌套循环组合

时间:2015-04-21 20:39:53

标签: r loops

我正在尝试运行四个嵌套循环,如下所示。我试图找到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 我的目标是使这个数字尽可能小。

1 个答案:

答案 0 :(得分:1)

略微更像R的做事方式是设置输入矩阵然后重复它们。我已经为你做了这件事。我将LSSL的粒度减半,以使结束大小更合理,但生成的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行上的单个循环,或者您可以使用applymapply重写它。为结果预先分配矢量或列表,如果使用for循环则填写它。

此方法的另一个优点是您使用的变量范围非常清晰。这有助于减少错误。例如,在您的代码中,您的描述与代码之间存在不匹配:您说MA1从1到364,但在您的代码中将其初始化为1,然后立即添加1以便从2开始当你进入第一个n <- n + 1步骤时。

它可能不会比你上面的更快或更快,你以一种真正的R式方式使用R的机会是矢量化你的函数,无论你在{{{ 1}} ---但你似乎不愿意提供甚至模糊的细节。

如果您正在优化某些内容,寻找最小值或最大值,那么您最好使用优化函数,例如,请参阅n <- n + 1optim包。 / p>