定量战术资产配置策略(QATAA)模型是使用10个月的移动平均线作为过滤器。
如果在月末,资产的价格高于移动平均线,就留在市场中;否则就会离开市场。
10个月有什么特别之处;为什么10个月对所有资产和区制都是不变的。我提出了根据历史波动率来调整移动平均线回溯的想法。
移动平均线交叉外汇交易策略 — 是一种简单的交易系统,基于两个标准指标的交叉 —一条快的EMA(指数移动平均线)和一条慢的EMA。
特点
-
非常简单的跟随策略。
-
使用简单的指标。
-
设置止损容易。
-
移动平均线具有延迟性 —延迟可能达到10天。
-
市场清淡时无效。
策略设置
-
可用于任何货币对和时间框架。
-
往图表上添加一条指数移动平均线,时段设置为9,适用收盘价,设置为红色(可选) — 这是一条快的移动平均线(FMA)。
-
往图表上再添加一条指数移动平均线,时段设置为14,适用收盘价,设置为蓝色(可选) — 这是一条慢的移动平均线(SMA)。
进场条件
当FMA自下方与SMAj交叉时,进场做多。
当FMA自上方与SMA交叉时,进场做空。
离场条件
多头止损应设置在发生交叉前上一个蜡烛台的低位处。空头止损设置在交叉前上一个蜡烛台的高位处。
止盈应根据止损进行设置,不应低于止损。建议设置为止损的1.5倍或2倍。
如果在触及止损或止盈之前,发生再次交叉,关闭当前头寸。
也就是说,在高波动时期,较短的移动平均线会让我们更快地离开市场,而在低波动时期,较长的移动平均线会让我们留在市场中。但是,这导致了更差的结果。
我花了一些时间分析基础的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)
可下载资源
关于作者
Kaizong Ye是拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。
本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。
非常感谢您阅读本文,如需帮助请联系我们!