拓端tecdat|R语言资产配置: 季度战术资产配置策略研究

原文链接:http://tecdat.cn/?p=19252

 

概要

有人已经表示有必要在战术资产配置(Tactical Asset Allocation, 简称TAA)策略中使用共同基金而不是ETF。不是使用半月更新(每月两次),而是每季度更新,因为许多平台不允许更频繁地交易共同基金。因此,我们着手开发共同基金的TAA策略。

对于此TAA策略,我从八个不同的资产类别中选择了八个共同基金。每个共同基金的要求都包括与ETF的高度相关性,因此ETF可以根据需要替换共同基金。

我使用回测结果开发共同基金的战术策略。尽管共同基金的历史可以追溯到1996年及以后,但回测只能追溯到2003年。

每个季度选择排名最高的共同基金的指标分别为5个月和20天的收益率,每个加权50%。必须通过3个月的移动平均线才能在任何给定时期内选择排名最高的共同基金。

 

  1.  
    #*****************************************************************
  2.  
    # 载入历史数据
  3.  
    #*****************************************************************
  4.  
     
  5.  
    load.packages('quantmod')
  6.  
     
  7.  
     
  8.  
     
  9.  
    data <- new.env()
  10.  
    getSymbols.extra(tickers, src = 'yahoo', from = '1970-01-01', env = data, set.symbolnames = T, auto.assign = T)
  11.  
    for(i in data$symbolnames) data[[i]] = adjustOHLC(data[[i]], use.Adjusted=T)
  12.  
     
  13.  
     
  14.  
    # 检查数据
  15.  
     
  16.  
     
  17.  
    plota.matplot(scale.one(data$prices)

 

  1.  
    #*****************************************************************
  2.  
    # 设置
  3.  
    #*****************************************************************
  4.  
    data$universe = data$prices > 0
  5.  
     
  6.  
    frequency = 'quarters'
  7.  
    # 查找期末,可以是“周”,“月”,“季度”,“年”
  8.  
     
  9.  
     
  10.  
    commission = list(cps = 0.01, fixed = 10.0, percentage = 0.0)
  11.  
     
  12.  
    #价格滞后1天
  13.  
     
  14.  
     
  15.  
    #prices = mlag(prices)
  16.  
    #*****************************************************************
  17.  
    # 每个重新平衡期间权重相等
  18.  
     
  19.  
    #******************************************************************
  20.  
     
  21.  
    data$weight[period.ends,] = ntop(prices[period.ends,], n)
  22.  
     
  23.  
     
  24.  
     

策略:

根据每个季度选择排名最高的资产,5个月和20天的总收益率各占50%。必须通过过滤器才能选择排名第一的共同基金,在任何给定期间内。过滤器是3个月的移动平均线。

 

  1.  
    # 计算3个月移动平均值
  2.  
     
  3.  
     
  4.  
    sma = bt.apply.matrix(prices, SMA, 3*21)
  5.  
     
  6.  
    # 如果价格跌破3个月移动平均线,请套现
  7.  
     
  8.  
     
  9.  
    go2cash = prices <= sma
  10.  
    go2cash.d = ifna(go2cash, T)
  11.  
     
  12.  
     
  13.  
    # 计算几个月的移动平均值
  14.  
     
  15.  
     
  16.  
    sma = bt.apply.matrix(prices, SMA, 3, periodicity='months')
  17.  
     
  18.  
    go2cash = prices <= sma
  19.  
    go2cash.m = ifna(go2cash, T)
  20.  
     
  21.  
     
  22.  
    # 以下所有逻辑均在period.ends完成
  23.  
     
  24.  
     
  25.  
     
  26.  
    #*****************************************************************
  27.  
    # 排名总分
  28.  
     
  29.  
     
  30.  
    #*****************************************************************
  31.  
    # 分配
  32.  
     
  33.  
     
  34.  
     
  35.  
    # 如果资产高于其3个月移动平均值,则进行分配
  36.  
     
  37.  
     
  38.  
    weight = iif(go2cash.d, 0, target.allocation)
  39.  
     
  40.  
    # 否则,它的权重分配给现金
  41.  
     
  42.  
     
  43.  
    data$weight[period.ends,] = weight
  44.  
     
  45.  
     
  46.  
     
  47.  
    # 相同,但使用每月移动平均线触发
  48.  
     
  49.  
     
  50.  
    data$weight[period.ends,] = weight
  51.  
     
  52.  
     
  53.  
    #*****************************************************************
  54.  
    # 将总分的每个部分排在第一位
  55.  
     
  56.  
    #*****************************************************************
  57.  
    # 目标分配
  58.  
     
  59.  
     
  60.  
     
  61.  
    # 如果资产高于其3个月移动平均线,则进行分配
  62.  
     
  63.  
     
  64.  
    weight = iif(go2cash.d, 0, target.allocation)
  65.  
     
  66.  
    #否则,它的权重分配给现金
  67.  
     
  68.  
     
  69.  
    weight$CASH = 1 - rowSums(weight)
  70.  
     
  71.  
    data$weight[] = NA
  72.  
    data$weight[period.ends,] = weight
  73.  
     
  74.  
     
  75.  
     
  76.  
    #相同,但使用每月移动平均线触发现金
  77.  
     
  78.  
     
  79.  
    weight = iif(go2cash.m, 0, target.allocation)
  80.  
    weight$CASH = 1 - rowSums(weight)
  81.  
     
  82.  
     
  83.  
    #*****************************************************************
  84.  
    # 报告
  85.  
    #*****************************************************************
  86.  
     
  87.  
    plotbt(models)

 

print(plotstrategy(models))
  1.  
     
  2.  
    ew QTS.d QTS.m QTS.RANK.d QTS.RANK.m
  3.  
    时期 Jun1996 - Mar2015 Jun1996 - Mar2015 Jun1996 - Mar2015 Jun1996 - Mar2015 Jun1996 - Mar2015
  4.  
    复合增长率 8.13 16.08 19.32 16.57 20.12
  5.  
    夏普比率 0.67 0.91 1.07 0.96 1.15
  6.  
    DVR 0.61 0.76 0.81 0.82 0.86
  7.  
    波动性 12.89 18.28 17.99 17.54 17.32
  8.  
    MaxDD -44.61 -26.78 -26.78 -25 -19.39
  9.  
    AvgDD -1.55 -3.09 -3.01 -2.87 -2.77
  10.  
    风险价值 -1.16 -1.79 -1.75 -1.71 -1.69
  11.  
    条件风险价值 -1.96 -2.82 -2.72 -2.71 -2.61
  12.  
    Exposure 99.98 99.98 99.98 99.98 99.98

假设每个季度只选择一个最优基金,那么该策略对输入参数很敏感。

最后,让我们查看各个时期:

  1.  
    dates.range = c('2002-12-31::2014-08-15', '::2002-12-31', '2014-08-15::')
  2.  
     
  3.  
    print(plot(models1))
  4.  
    }

 

 

 

 

 

 

总之,本文开发的共同基金策略可能对那些必须使用共同基金且只能按季度交易的投资者有所帮助。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仿真优化市场风险

 
 

 

 
posted @ 2021-01-22 19:02  拓端tecdat  阅读(154)  评论(0编辑  收藏  举报