拓端tecdat|拓端tecdat|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 = 5sma.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 = 'https://www.it610.com/article/yahoo')#*****************************************************************
#设置
#*****************************************************************
universe = prices > 0models = 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)
文章图片
带状逻辑很容易实现,增加了收益。
文章图片
最受欢迎的见解
1.在python中使用lstm和pytorch进行时间序列预测
2.python中利用长短期记忆模型lstm进行时间序列预测分析
3.使用r语言进行时间序列(arima,指数平滑)分析
4.r语言多元copula-garch-模型时间序列预测
5.r语言copulas和金融时间序列案例
6.使用r语言随机波动模型sv处理时间序列中的随机波动
7.r语言时间序列tar阈值自回归模型
8.r语言k-shape时间序列聚类方法对股票价格时间序列聚类
【拓端tecdat|拓端tecdat|R语言资产配置策略量化模型(改进的移动平均线策略动态回测)】9.python3用arima模型进行时间序列预测
推荐阅读
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- C语言解方程的根和判断是否是闰年
- C语言的版本比较
- 【C】题目|【C语言】题集 of ⑥
- echart|echart 双轴图开发