2017-05-29 135 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