有人已经表示有必要在战术资产配置(Tactical Asset Allocation, 简称TAA)策略中使用共同基金而不是ETF。不是使用半月更新(每月两次),而是每季度更新,因为许多平台不允许更频繁地交易共同基金。因此,我们着手开发共同基金的TAA策略。
对于此TAA策略,我从八个不同的资产类别中选择了八个共同基金。每个共同基金的要求都包括与ETF的高度相关性,因此ETF可以根据需要替换共同基金。
我使用回测结果开发共同基金的战术策略。尽管共同基金的历史可以追溯到1996年及以后,但回测只能追溯到2003年。
#*****************************************************************
# 载入历史数据
#*****************************************************************
load.packages('quantmod')
data <- new.env()
getSymbols.extra(tickers, src = 'yahoo', from = '1970-01-01', env = data, set.symbolnames = T, auto.assign = T)
for(i in data$symbolnames) data[[i]] = adjustOHLC(data[[i]], use.Adjusted=T)
# 检查数据
plota.matplot(scale.one(data$prices)
#*****************************************************************
# 设置
#*****************************************************************
data$universe = data$prices > 0
frequency = 'quarters'
# 查找期末,可以是“周”,“月”,“季度”,“年”
commission = list(cps = 0.01, fixed = 10.0, percentage = 0.0)
#价格滞后1天
#prices = mlag(prices)
#*****************************************************************
# 每个重新平衡期间权重相等
#******************************************************************
data$weight[period.ends,] = ntop(prices[period.ends,], n)
策略:
根据每个季度选择排名最高的资产,5个月和20天的总收益率各占50%。必须通过过滤器才能选择排名第一的共同基金,在任何给定期间内。过滤器是3个月的移动平均线。
# 计算3个月移动平均值
sma = bt.apply.matrix(prices, SMA, 3*21)
# 如果价格跌破3个月移动平均线,请套现
go2cash = prices <= sma
go2cash.d = ifna(go2cash, T)
# 计算几个月的移动平均值
sma = bt.apply.matrix(prices, SMA, 3, periodicity='months')
go2cash = prices <= sma
go2cash.m = ifna(go2cash, T)
# 以下所有逻辑均在period.ends完成
#*****************************************************************
# 排名总分
#*****************************************************************
# 分配
# 如果资产高于其3个月移动平均值,则进行分配
weight = iif(go2cash.d, 0, target.allocation)
# 否则,它的权重分配给现金
data$weight[period.ends,] = weight
# 相同,但使用每月移动平均线触发
data$weight[period.ends,] = weight
#*****************************************************************
# 将总分的每个部分排在第一位
#*****************************************************************
# 目标分配
# 如果资产高于其3个月移动平均线,则进行分配
weight = iif(go2cash.d, 0, target.allocation)
#否则,它的权重分配给现金
weight$CASH = 1 - rowSums(weight)
data$weight[] = NA
data$weight[period.ends,] = weight
#相同,但使用每月移动平均线触发现金
weight = iif(go2cash.m, 0, target.allocation)
weight$CASH = 1 - rowSums(weight)
#*****************************************************************
# 报告
#*****************************************************************
plotbt(models)
print(plotstrategy(models))
ew QTS.d QTS.m QTS.RANK.d QTS.RANK.m
时期 Jun1996 - Mar2015 Jun1996 - Mar2015 Jun1996 - Mar2015 Jun1996 - Mar2015 Jun1996 - Mar2015
复合增长率 8.13 16.08 19.32 16.57 20.12
夏普比率 0.67 0.91 1.07 0.96 1.15
DVR 0.61 0.76 0.81 0.82 0.86
波动性 12.89 18.28 17.99 17.54 17.32
MaxDD -44.61 -26.78 -26.78 -25 -19.39
AvgDD -1.55 -3.09 -3.01 -2.87 -2.77
风险价值 -1.16 -1.79 -1.75 -1.71 -1.69
条件风险价值 -1.96 -2.82 -2.72 -2.71 -2.61
Exposure 99.98 99.98 99.98 99.98 99.98
假设每个季度只选择一个最优基金,那么该策略对输入参数很敏感。
最后,让我们查看各个时期:
dates.range = c('2002-12-31::2014-08-15', '::2002-12-31', '2014-08-15::')
print(plot(models1))
}
总之,本文开发的共同基金策略可能对那些必须使用共同基金且只能按季度交易的投资者有所帮助。ETF重复了这种策略,因此,希望减少交易(仅按季度)的投资者可能也会发现此策略有用。
最受欢迎的见解
1.用机器学习识别不断变化的股市状况—隐马尔科夫模型(HMM)的应用
2.R语言GARCH-DCC模型和DCC(MVT)建模估计
3.R语言实现 Copula 算法建模依赖性案例分析报告
4.R语言COPULAS和金融时间序列数据VaR分析
5.R语言多元COPULA GARCH 模型时间序列预测
6.用R语言实现神经网络预测股票实例
7.r语言预测波动率的实现:ARCH模型与HAR-RV模型
8.R语言如何做马尔科夫转换模型markov switching model
9.matlab使用Copula仿真优化市场风险