R语言资产配置策略量化模型:改进的移动平均线策略动态回测

原文链接:http://tecdat.cn/?p=23141

定量战术资产配置策略(QATAA)模型是使用10个月的移动平均线作为过滤器。如果在月末,资产的价格高于移动平均线,就留在市场中;否则就会离开市场。

10个月有什么特别之处;为什么10个月对所有资产和区制都是不变的。我提出了根据历史波动率来调整移动平均线回溯的想法。也就是说,在高波动时期,较短的移动平均线会让我们更快地离开市场,而在低波动时期,较长的移动平均线会让我们留在市场中。但是,这导致了更差的结果。

我花了一些时间分析基础的10个月移动平均线策略,看到了相当大的损失,简单的解决方法是在10个月移动平均线周围使用+/-5%的区间,以减少损失,增加收益。

下面我将展示这个概念是如何运作的。

#*****************************************************************
# 加载历史数据
#*****************************************************************

# 加载保存的代理原始数据

tickers = '
SPY
CASH = SHY + TB3Y
'

#*****************************************************************
# 用来显示信号的辅助函数
#*****************************************************************

signal = iif(model == 'base', prices > sma,

#基于信号创建一个模型
 
share(data, clean.signal=T, silent=T)

# 创建一个图来显示信号

plot(p\[dates\] ,type='l', plotX=F, x.highlight = highlight)

visuali('2000::2001')

延迟进场/退场的好处是交易量少,成交量小。

#*****************************************************************
# 设置
#*****************************************************************

models = list()

#*****************************************************************
# SPY
#******************************************************************

run(data)

#*****************************************************************
#  SPY + 10个月过滤器
#******************************************************************
apply(prices, SMA, 10*22)
 
iif(prices > sma, 1, 0)
CASH = 1 - ifna( ifna(SPY), 0)

#*****************************************************************
# SPY+10个月+5/-5%过滤器
#******************************************************************
(cross(prices, sma * 1.05), (prices, sma * 0.95), 0, NA)

我还包括了我对动态回测移动平均线的尝试,但在这种形式下,并不实用。

#*****************************************************************
#  SPY + 基于波动率的动态过滤器
#******************************************************************
vol = matrix(ret, SD, n = 21)
if(vol.rank < 0.5, bt(prices, SMA, 10\*22),matrix(prices, SMA, 1\*22))

data$w

#*****************************************************************
# SPY+基于波动率的动态过滤器;多个级别
#******************************************************************
nbreaks = 5

sma.cash = sma * NA
for(i in 1:nbreaks) {
temp = data(matrix(prices, SMA, (nbreaks - i + 1)* 2 *22)

}

#*****************************************************************
# 报告
#*****************************************************************
plot(models)

SPY SPY.CASH SPY.CASH.BAND SPY.CASH.VOL.SIMPLE SPY.CASH.VOL
Period Jan1993 - Feb2015 Jan1993 - Feb2015 Jan1993 - Feb2015 Jan1993 - Feb2015 Jan1993 - Feb2015
Cagr 9.4 9.9 12.1 9.2 8
DVR 41.9 78.3 91.4 83.8 74
Sharpe 56.7 83.6 97.1 90.8 77.1
R2 73.9 93.7 94.1 92.3 96
Win.Percent 100 41.1 100 45.7 43.3
Avg.Trade 623.7 1.9 27.6 0.7 0.7
MaxDD -55.2 -20.1 -19.1 -15.9 -22.3
Num.Trades 1 146 12 302 254

barplot(turnover, data)

接下来,让我们把相同的带状策略应用于TAA模型。

#加载保存的代理原始数据

data <- new.env()

getSymbols(tickers, src = 'yahoo')

#*****************************************************************
#  设置
#*****************************************************************
universe = prices > 0

models = list()

#*****************************************************************
# 基准
#*****************************************************************
weight\[\] = NA

#*****************************************************************
#The \[战术性资产配置策略的量化方法(QATAA) Mebane T. Faber\](http://mebfaber.com/timing-model/)
#\[SSRN \](http://papers.ssrn.com/sol3/papers.cfm?abstract_id=962461)
#*****************************************************************

weight = iif(prices > sma, 20/100, 0)
run(data)

#*****************************************************************
#  bands替代方案 移动平均
#*****************************************************************
signal = if(cross(prices, sma * 1.05), 1, iif(cross.dn(prices, sma * 0.95), 0, NA))

#*****************************************************************
# 报告
#*****************************************************************
#performance(models, T)

SP500 EW Model Model.B
Period Jun1996 - Feb2015 Jun1996 - Feb2015 Jun1996 - Feb2015 Jun1996 - Feb2015
Cagr 8.2 8.6 9.8 10.6
DVR 28.7 64 117.4 127.9
Sharpe 49.2 69.3 120.4 132.7
R2 58.4 92.4 97.5 96.5
Win.Percent 100 59.9 64.4 64.6
Avg.Trade 335.7 0.1 0.2 0.2
MaxDD -55.2 -47.5 -17.1 -13.1
Num.Trades 1 1113 930 887

layout(1)
barplot(sapply(models,turnover)

带状逻辑很容易实现,增加了收益。


(0)

相关推荐