将技术交易规则应用于所有投入组合

时间:2017-05-29 13:16:30

标签: r function apply rule trading

我有一个包含不同时间序列数据的列的Dataframe。我需要自动将这些列插入到下面的函数中以找到最佳组合(最高回报):

returns <- as.data.frame(rep(0, 4261)) #4261 because that's the length of n1.lc
returns$n2_5_10 <- rep(0, nrow(returns))
MSVrule <- function(n1, n2, hold){
  for(i in 13:nrow(n1.lc)){
    if (n1[i] > n2[i] & n1[i-1] < n2[i-1]) {
      returns$n2_5_10[i] <- dt.lc$Settle[i - hold] - dt.lc$Settle[i]
    } else {
      if (n1[i] < n2[i] & n1[i-1] > n2[i-1])
      {returns$n2_5_10[i] <- dt.lc$Settle[i] - dt.lc$Settle[i - hold]
      }
      else{
        NULL
      }
    }
  }
}

MSVrule(n1.lc$N1_2_5, n2.lc$n2_2_10, 5) 

此函数不起作用,离开returns$n2_5_10[i] 0但是,当我在函数中指定向量时,它可以工作:

hold <- 5
for(i in 13:nrow(n1.lc)){
    if (n1.lc$N1_2_5[i] > n2.lc$n2_2_10[i] & n1.lc$N1_2_5[i-1] < n2.lc$n2_2_10[i-1]) {
      returns$n2_5_10[i] <- (dt.lc$Settle[i - hold] - dt.lc$Settle[i]) / dt.lc$Settle[i]
    } else {
      if (n1.lc$N1_2_5[i] < n2.lc$n2_2_10[i] & n1.lc$N1_2_5[i-1] > n2.lc$n2_2_10[i-1])
      {returns$n2_5_10[i] <- (dt.lc$Settle[i] - dt.lc$Settle[i - hold]) / dt.lc$Settle[i - hold]
      }
      else{
        NULL
      }
    }
  }

下一步是自动将函数应用于n1.lc数据帧的其他向量组合。但我需要首先使用该功能。

1 个答案:

答案 0 :(得分:0)

因为您使用没有return()的函数尝试修改其范围之外的对象,所以不会更改任何外部对象。但是,您可以使用<<-运算符修改函数的外部对象,即中的 n2_5_10 列返回

下面演示了随机生成的数据,并将返回的列分配为500或5,因为您没有发布其他所需的已使用对象(即 dt.lc )。调整到实际数据对象:

n1.lc <- data.frame(
             N1_2_5 = runif(50),
             n2_2_10 = runif(50)
         )

returns <- data.frame(n2_5_10 = rep(0, nrow(n1.lc)))

MSVrule <- function(n1, n2, hold){
  for(i in 13:nrow(n1.lc)){
    if (n1[i] > n2[i] & n1[i-1] < n2[i-1]) {
      returns$n2_5_10[i] <<- 500
    } else {
      if (n1[i] < n2[i] & n1[i-1] > n2[i-1])
      {returns$n2_5_10[i] <<- 5
      }
      else{
        NULL
      }
    }
  }
}

MSVrule(n1.lc$N1_2_5, n1.lc$n2_2_10, 5) 

但是,请考虑使用return在函数内创建/更新/输出返回。然后在外面,分配一个新的数据帧作为函数的输出(不需要else { NULL }子句):

MSVrule <- function(n1, n2, hold){
  returns <- data.frame(n2_5_10 = rep(0, nrow(n1.lc)))

  for(i in 13:nrow(n1.lc)){
    if (n1[i] > n2[i] & n1[i-1] < n2[i-1]) {
      returns$n2_5_10[i] <- 500
    } else {
      if (n1[i] < n2[i] & n1[i-1] > n2[i-1])
        returns$n2_5_10[i] <- 5          
    }
  }

  return(returns)
}    

newdf <- MSVrule(n1.lc$N1_2_5, n1.lc$n2_2_10, 5) 


# BOTH ABOVE RESULT IN EQUIVALENT OUTCOMES
all.equal(returns, newdf)
# TRUE

identical(returns, newdf)
# TRUE