2017-05-29 157 views
-1

我有一个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然而,当我specifiy载体在它的工作原理的功能:

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

这两个示例代码都不是等价的操作,因为底部在'if'子句中有除数。 – Parfait

回答

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