7

我对 R 非常陌生,并试图回测我已经在 WealthLab 中编程的策略。

一些我不明白的东西(而且它显然不起作用:)

  1. 我没有将收盘价很好地放入向量......或某种向量,但它从结构开始,我真的不明白这个函数的作用。这就是为什么我的 series[,1] 调用可能不起作用的原因。

  2. n <- nrow(series) 也不起作用,但循环需要它

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

#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
}
4

1 回答 1

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 时买入,低于 SMA 时卖出

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

这就是你会得到的

在此处输入图像描述

于 2013-07-02T20:08:23.857 回答