【问题标题】:R trading strategy backtesting for loopR交易策略回测循环
【发布时间】:2013-08-28 23:00:46
【问题描述】:

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

因此,为了正确测试这一点,我使用下面的嵌套 if/else if 语句编写了一个庞大的 for 循环。这运行速度不是很快,我想知道是否有任何提高速度的通用方法。 R 应该是矢量化的......但我似乎无法这样运行代码。

有一个名为“datasort”的数据框,如下所示......并且希望每天为“信号”和“位置”添加列。所以我 for 循环使用时间索引 i 来填充每一天的“信号”和“位置”列。位置向量只能取 0 或 1 的值,an​​d 信号只能取 -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]}
}}  

【问题讨论】:

    标签: r for-loop vectorization algorithmic-trading


    【解决方案1】:

    您的代码似乎无法向量化...但是可以简化很多,所以请仔细检查。正如目前所提出的,它相当于这个简单的功能:

    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)))
    

    【讨论】:

    • 我在一张表中尝试了该函数,其中 CO2 低于然后回到 MA 之上(在表的末尾添加了一些条目),但没有得到与原始 for 循环相同的结果。
    猜你喜欢
    • 1970-01-01
    • 2020-08-18
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多