R:回测交易策略。初学者到quantmod和R.

时间:2013-06-06 14:10:55

标签: r quantmod

我对R很新,并试图回溯我在WealthLab中编写的策略。

我不理解的几件事(显然不起作用)。

  1. 我没有很好地将关闭价格转换为矢量...或者某种矢量,但它从结构开始,我真的不明白这个功能是做什么的。这就是为什么我的系列[,1]调用可能不起作用。

  2. n< - nrow(系列)也不起作用,但我需要循环

  3. 所以我想如果我得到这两个问题的答案我的策略应该有效......我非常感谢任何帮助......即使有其他语言的编程经验,看起来也很复杂

    #rm(list = ls(all = TRUE))
    
    #import data, default is yahoo
    require(quantmod)
    series <- getSymbols('AAPL',from='2013-01-01')
    #generate HLOC series
    close <- Cl(AAPL)
    open <- Op(AAPL)
    low <-Lo(AAPL)
    high <- Hi(AAPL)
    
    #setting parameters
    lookback <- 24 #24 days ago
    startMoney <- 10000
    
    
    #Empty our time series for position and returns
    f <- function(x) 0 * x
    
    position <- apply(series[,1],FUN=f)
    colnames(position)="long_short"
    
    returns <- apply(series[,1],FUN=f)
    colnames(returns)="Returns"
    
    trades = returns
    colnames(trades)="Trades"
    
    amount = returns
    colnames(amount) = "DollarAmount"
    amt[seq(1,lookback)] = startMoney
    
    
    #Calculate all the necessary values in a loop with our trading strategy
    n <- nrow(series)
    
    for(i in seq(lookback+1,n)){
      #get the return
      if(position[i-1] == 1){
        #we were long
        returns[i] = close[i]/close[i-1] - 1
      } else if(position[i-1] == -1){
        #we were short
        returns[i] = close[i-1]/close[i] - 1
      }
    
    
      #long/short position
      if(open[i-lookback]<open[i] && low[i-1] < open[i]){
        #go long
        position[i] = 1    
      } else if(open[i-lookback]>open[i] && high[i-1] > open[i]){
        # go short
        position[i] = -1
      } else {
        position[i] = position[i-1]
      }
    
      #mark a trade if we did one
      if(position[i] != position[i-1]) trades[i] = 1
    
      #Calculate the dollar amount
      amount[i] = amount[i-1]*exp(returns[i])
      if(trades[i]) amount[i] = amount[i] - 2
    }
    

1 个答案:

答案 0 :(得分:15)

从第二个问题开始

> s <- getSymbols('SPY')
> nrow(s)
NULL
> class(s)
[1] "character"
> s.data <- get(s)
> class(s.data)
[1] "xts" "zoo"
> nrow(s.data)
[1] 1635

因此,如果您想使用实际的xts对象,则需要使用get

关于你的第一个问题 - 我认为你真的不需要将数据作为向量提取 - xts对象是一个按日期索引的数组,它很容易使用。 如果您仍想获取可以使用的数据

closing.prices <- coredata(Cl(s))

现在,为了让您开始对策略进行简单的反向测试,我建议您按照以下步骤进行操作

定义您的策略。 2.创建一个数组或向xts对象添加一列,代表您每天的位置。 1表示长,0表示无位置,-1表示空头(稍后您可以使用杠杆数字)。 3.将每天的回报乘以该位置,您将得到您的策略回报向量。 4.检查结果 - 我的建议是PerformanceAnalytics

简单策略 - 在SMA20收盘时买入,在

下卖出
library(quantmod)
library(PerformanceAnalytics)

s <- get(getSymbols('SPY'))["2012::"]
s$sma20 <- SMA(Cl(s) , 20)
s$position <- ifelse(Cl(s) > s$sma20 , 1 , -1)
myReturn <- lag(s$position) * dailyReturn(s)
charts.PerformanceSummary(cbind(dailyReturn(s),myReturn))

这就是你得到的

enter image description here