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

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

定量战术资产配置策略(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)

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



相关文章
|
7月前
【R语言实战】——带有高斯新息的金融时序的GARCH模型拟合预测及VAR/ES风险度量
【R语言实战】——带有高斯新息的金融时序的GARCH模型拟合预测及VAR/ES风险度量
|
7月前
【R语言实战】——带有新息为标准学生t分布的金融时序的GARCH模型拟合预测
【R语言实战】——带有新息为标准学生t分布的金融时序的GARCH模型拟合预测
|
3月前
|
机器学习/深度学习 算法 前端开发
R语言基础机器学习模型:深入探索决策树与随机森林
【9月更文挑战第2天】决策树和随机森林作为R语言中基础且强大的机器学习模型,各有其独特的优势和适用范围。了解并熟练掌握这两种模型,对于数据科学家和机器学习爱好者来说,无疑是一个重要的里程碑。希望本文能够帮助您更好地理解这两种模型,并在实际项目中灵活应用。
|
4月前
|
数据采集 机器学习/深度学习 数据挖掘
R语言数据清洗:高效处理缺失值与重复数据的策略
【8月更文挑战第29天】处理缺失值和重复数据是数据清洗中的基础而重要的步骤。在R语言中,我们拥有多种工具和方法来有效地应对这些问题。通过识别、删除或插补缺失值,以及删除重复数据,我们可以提高数据集的质量和可靠性,为后续的数据分析和建模工作打下坚实的基础。 需要注意的是,处理缺失值和重复数据时,我们应根据实际情况和数据特性选择合适的方法,并在处理过程中保持谨慎,以避免引入新的偏差或错误。
|
4月前
|
资源调度 数据挖掘
R语言回归分析:线性回归模型的构建与评估
【8月更文挑战第31天】线性回归模型是统计分析中一种重要且实用的工具,能够帮助我们理解和预测自变量与因变量之间的线性关系。在R语言中,我们可以轻松地构建和评估线性回归模型,从而对数据背后的关系进行深入的探索和分析。
|
5月前
|
机器学习/深度学习 算法 数据挖掘
R语言在金融分析中扮演重要角色,用于风险管理、资产定价、量化交易、市场预测和投资组合优化。
【7月更文挑战第2天】R语言在金融分析中扮演重要角色,用于风险管理、资产定价、量化交易、市场预测和投资组合优化。其开源、强大的统计功能和丰富的包(如`PerformanceAnalytics`、`quantstrat`、`forecast`)支持从风险评估到策略回测的各种任务。R的灵活性和社区支持使其成为金融专业人士应对复杂问题的首选工具。
254 1
|
7月前
【R语言实战】——Logistic回归模型
【R语言实战】——Logistic回归模型
|
7月前
|
机器学习/深度学习 数据可视化
R语言Stan贝叶斯回归置信区间后验分布可视化模型检验|附数据代码
R语言Stan贝叶斯回归置信区间后验分布可视化模型检验|附数据代码
|
3月前
|
数据采集 机器学习/深度学习 数据可视化
R语言从数据到决策:R语言在商业分析中的实践
【9月更文挑战第1天】R语言在商业分析中的应用广泛而深入,从数据收集、预处理、分析到预测模型构建和决策支持,R语言都提供了强大的工具和功能。通过学习和掌握R语言在商业分析中的实践应用,我们可以更好地利用数据驱动企业决策,提升企业的竞争力和盈利能力。未来,随着大数据和人工智能技术的不断发展,R语言在商业分析领域的应用将更加广泛和深入,为企业带来更多的机遇和挑战。
|
2月前
|
数据挖掘 C语言 C++
R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。
【10月更文挑战第21天】时间序列分析是一种重要的数据分析方法,广泛应用于经济学、金融学、气象学、生态学等领域。R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。本文将介绍使用R语言进行时间序列分析的基本概念、方法和实例,帮助读者掌握R语言在时间序列分析中的应用。
46 3