R交易策略回测循环

时间:2013-08-28 23:00:47

标签: r for-loop vectorization algorithmic-trading

伙计们,我刚刚开始学习如何正确地为R中的交易策略构建回测代码。作为我的第一个例子,我正在测试一个非常简单的策略,当第t天的收盘价更高时,一个指数变长。比50天移动平均线。当收盘价低于平均50天时,任何多头头寸都会被卖出......但是策略永远不会短暂,只有长期或持平。

所以,为了正确地测试这个,我已经使用嵌套的if / else if语句编写了一个庞大的for循环。这不会运行得非常快,我想知道是否有任何提高速度的通用方法。 R应该被矢量化......但我似乎无法运行代码。

在下面有一个名为“datasort”的数据框......并希望每天为“信号”和“位置”添加列。所以我循环使用时间索引i每天填写“信号”和“位置”列,每天都过去。位置向量只能取值0或1,并且信号只能取值-1,0,1。基本问题是,在任何一天,信号矢量值取决于前一天的位置t-1 ......这使得无法对操作进行矢量化,或者我在该思想中是否不正确?

我很感激任何建议。此外,我知道quantmod和quantstrat包包含一些回测功能......我只是想自己构建它,因为最终我的信号将变得太复杂,无法处理这些包。谢谢。

Date        CO2    MA
2006-01-03 61.70 57.88
2006-01-04 62.02 57.95
2006-01-05 61.35 57.96
2006-01-06 62.91 58.03
2006-01-09 62.32 58.09
2006-01-10 62.30 58.14


for(i in 1:length(datasort$CO2)) {
if (i==1) {
  if(datasort$CO2>=datasort$MA) {
    datasort$signal[i]<-1
    datasort$position[i]<-1}
  else if (datasort$CO2[i]<datasort$MA[i]){
    datasort$signal[i]<-0
    datasort$position[i]<-0}}
else if (i>1){
  if ((datasort$CO2[i]>=datasort$MA[i])&(datasort$position[i-1]==0))
  {datasort$signal[i]<-1
   datasort$position[i]<-1}
     else if ((datasort$CO2[i]>=datasort$MA[i])&(datasort$position[i-1]==1))
  {datasort$signal[i]<-0
   datasort$position[i]<-datasort$position[i-1]}
  else if ((datasort$CO2[i]<datasort$MA[i])&(datasort$position[i-1]==1))
  {datasort$signal[i]<- -1
   datasort$position[i]<-datasort$position[i-1]-1}
  else if ((datasort$CO2[i]<datasort$MA[i])&(datasort$position[i-1]==0))
  {datasort$signal[i]<-0
   datasort$position[i]<-datasort$position[i-1]}
}}  

1 个答案:

答案 0 :(得分:2)

似乎您的代码无法进行矢量化......但它可以简化很多,所以请仔细检查一下。正如目前所提出的,它等同于这个简单的功能:

f <- function(x, y){
  z <- x >= y
  position <- signal <- as.numeric(z[1])
  for(i in 2:length(z)){
    signal[i] <- z[i] - position[i-1]
    position[i] <- z[i] * position[i-1]
  }
  data.frame(signal=signal, position=position)
}

要测试它,请使用:

datasort <- read.table(header=TRUE,text="
Date        CO2    MA
2006-01-03 61.70 57.88
2006-01-04 62.02 57.95
2006-01-05 61.35 57.96
2006-01-06 62.91 58.03
2006-01-09 62.32 58.09
2006-01-10 62.30 58.14
")

cbind(datasort, with(datasort, f(CO2, MA)))