【问题标题】:Applying technical trading rule to all combination of inputs将技术交易规则应用于所有输入组合
【发布时间】:2017-05-29 13:16:30
【问题描述】:

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

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 数据帧的其他向量组合。但我需要该功能首先工作。

【问题讨论】:

  • 请提供一个可重现的例子。现在你不说错误是什么,你能扩展一下吗?
  • 两个示例代码不是等效的操作,因为底部在if 子句中有除数。

标签: r function apply rule trading


【解决方案1】:

因为您使用没有return() 的函数尝试修改其范围之外的对象,所以不会更改任何外部对象。但是,您可以使用&lt;&lt;- 运算符将外部对象修改为函数,即returns 中的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多