r 中的移动平均规则回测股票 returns
Backtesting stock returns for Moving Average rule in r
我正在尝试根据 10 个月移动平均线法则回测股票 returns。规则是,如果价格高于第 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))
Returns 对于 1 的动作确实得到了正确的计算,但是当动作不是 1 时,我发现 SPY$Hit 只滞后 1 次,然后默认为 100 值,而我想它保存最后一次 Action == 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
这是我的猜测,让我知道你的想法。
# 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
在Excel中有两种方法可以达到,
1.转到Data命令找到Data Analysis,找到Moving Average,
在对话框中,您需要输入输入数据范围、间隔(在您的情况下为 10),然后输出单元格地址。
找到结果后写下这个公式,
=if(A2 >B2, "Buy", "Hold")
其中 A2 持有价格,B2 持有 10 个月的移动平均价值。
- sheet 中任意位置的单元格水平编号 1 到 10(月份编号)。
在行下方放置月份值 1 到 10。
下面一行计算 10 个月的平均值。
最后写出上面的公式来找到买入或持有。
我正在尝试根据 10 个月移动平均线法则回测股票 returns。规则是,如果价格高于第 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))
Returns 对于 1 的动作确实得到了正确的计算,但是当动作不是 1 时,我发现 SPY$Hit 只滞后 1 次,然后默认为 100 值,而我想它保存最后一次 Action == 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
这是我的猜测,让我知道你的想法。
# 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
在Excel中有两种方法可以达到, 1.转到Data命令找到Data Analysis,找到Moving Average, 在对话框中,您需要输入输入数据范围、间隔(在您的情况下为 10),然后输出单元格地址。 找到结果后写下这个公式,
=if(A2 >B2, "Buy", "Hold") 其中 A2 持有价格,B2 持有 10 个月的移动平均价值。
- sheet 中任意位置的单元格水平编号 1 到 10(月份编号)。 在行下方放置月份值 1 到 10。 下面一行计算 10 个月的平均值。
最后写出上面的公式来找到买入或持有。