0

鉴于 10 个月移动平均线规则,我正在尝试回测股票收益。规则是,如果价格高于第 10 百万个平均线 - 买入,如果低于第 10 万个平均线 - 保持价值不变。

我知道如何在 excel 中很容易地做到这一点,但我在 R 中遇到了麻烦。

以下是我在 R 中的方法:

#Downloand financial data
library(Quandl)

SPY <- Quandl("YAHOO/INDEX_GSPC", type = "xts", collapse = "monthly")
head(SPY)

#Calculate log returns
SPY$log_ret <- diff(log(SPY$Close))

#Calculate moving average for Closing price
SPY$MA.10 <- rollapply(SPY$Close, width = 10, FUN = mean)

#Create binary rule to determine when to buy and when to hold
#1 = Buy
SPY$Action <- ifelse(SPY$MA.10 < SPY$Close, 1, 0)

#Create default value in a new column to backtest returns
SPY$Hit <- 100

#Calculate cumulative returns
SPY$Hit <-ifelse(SPY$Action == 1, SPY[2:n, "Hit"] * 
                (1 + SPY$log_ret), lag.xts(SPY$Hit, k=1))

对于 1 的动作,返回确实得到正确计算,但是当动作不是 1 时,我发现 SPY$Hit 仅滞后 1 时间,然后默认为 100 值,而我希望它保留上一个动作的值== 1 次。

这个公式在 MS Excel 中效果很好并且很容易实现,但似乎 R 中的问题是我不能保持上一个 Action == 1 的值不变,我该怎么做才能看到如何那么这个简单的交易策略会奏效吗?

如果我能进一步澄清这一点,请告诉我,谢谢。

Sample of the desired output:
      Action Return    Answer
 [1,]      0   0.00 100.00000
 [2,]      1   0.09 109.00000
 [3,]      1   0.08 117.72000
 [4,]      1  -0.05 111.83400
 [5,]      1  -0.03 108.47898
 [6,]      0  -0.02 108.47898
 [7,]      0   0.01 108.47898
 [8,]      0   0.06 108.47898
 [9,]      1  -0.03 105.22461
[10,]      0   0.10 105.22461
[11,]      1  -0.05  99.96338
4

2 回答 2

0

在 Excel 中有 2 种方法来实现它,1. 转到数据命令找到数据分析,找到移动平均线,在对话框中你需要输入数据范围,间隔(在你的情况下 10),然后输出单元格地址. 找到 Result 后写下这个公式,

=if(A2 >B2, "Buy", "Hold") 其中 A2 持有价格,B2 持有 10 个月移动平均线值。

  1. 工作表编号单元格中的任何位置水平 1 到 10(月份编号)。下面的行将月份的值 1 到 10。下面的行计算 10 个月的平均值。

最后写出上面写的公式来找到买入或持有。

于 2017-04-02T07:51:57.377 回答
0

这是我的猜测,让我知道你的想法。

# Looping
Hit <- matrix(100, nrow = nrow(SPY))
for(row in 11:nrow(SPY)){ # 11 since you have NA's from your moving average
  if(SPY$Action[row] == 1){ 
    Hit[row] = Hit[row-1] * (1 + SPY$log_ret[row]) # here we needed row-1
  } else {
    Hit[row] = Hit[row-1]
  }
}
SPY$Hit <- Hit

cbind(SPY$Action, SPY$Hit)

对于您的样品:

x <- data.frame(Action = c(0,1,1,1,1,0,0,0,1,0,1))
x$Return <- c(0,0.09,0.08,-0.05,-0.03,-0.02,0.01,0.06,-0.03,0.10,-0.05)

x$Answer <- matrix(100, nrow = nrow(x))
for(row in 2:nrow(x)){ # 11 since you have NA's from your moving average
  if(x$Action[row] == 1){ 
    x$Answer[row] = x$Answer[row-1] * (1 + x$Return[row])
  } else {
    x$Answer[row] = x$Answer[row-1]
  }
}
x
       Action Return    Answer
1       0   0.00 100.00000
2       1   0.09 109.00000
3       1   0.08 117.72000
4       1  -0.05 111.83400
5       1  -0.03 108.47898
6       0  -0.02 108.47898
7       0   0.01 108.47898
8       0   0.06 108.47898
9       1  -0.03 105.22461
10      0   0.10 105.22461
11      1  -0.05  99.96338
于 2017-04-02T00:55:59.320 回答