概要
有人已经表示有必要在战术资产配置(Tactical Asset Allocation, 简称TAA)策略中使用共同基金而不是ETF。不是使用半月更新(每月两次),而是每季度更新,因为许多平台不允许更频繁地交易共同基金。因此,我们着手开发共同基金的TAA策略。
对于此TAA策略,我从八个不同的资产类别中选择了八个共同基金。每个共同基金的要求都包括与ETF的高度相关性,因此ETF可以根据需要替换共同基金。
我使用回测结果开发共同基金的战术策略。尽管共同基金的历史可以追溯到1996年及以后,但回测只能追溯到2003年。
每个季度选择排名最高的共同基金的指标分别为5个月和20天的收益率,每个加权50%。必须通过3个月的移动平均线才能在任何给定时期内选择排名最高的共同基金。
#***************************************************************** # 载入历史数据 #***************************************************************** 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重复了这种策略,因此,希望减少交易(仅按季度)的投资者可能也会发现此策略有用。