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

时间:2024-01-30 22:48:35

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

原文出处:拓端数据部落公众号

定量战术资产配置策略(QATAA)模型是使用10个月的移动平均线作为过滤器。如果在月末,资产的价格高于移动平均线,就留在市场中;否则就会离开市场。

10个月有什么特别之处;为什么10个月对所有资产和区制都是不变的。我提出了根据历史波动率来调整移动平均线回溯的想法。也就是说,在高波动时期,较短的移动平均线会让我们更快地离开市场,而在低波动时期,较长的移动平均线会让我们留在市场中。但是,这导致了更差的结果。

我花了一些时间分析基础的10个月移动平均线策略,看到了相当大的损失,简单的解决方法是在10个月移动平均线周围使用+/-5%的区间,以减少损失,增加收益。

下面我将展示这个概念是如何运作的。

  1.  
    #*****************************************************************
  2.  
    # 加载历史数据
  3.  
    #*****************************************************************
  4.  
     
  5.  
     
  6.  
    # 加载保存的代理原始数据
  7.  
     
  8.  
     
  9.  
    tickers = \'
  10.  
    SPY
  11.  
    CASH = SHY + TB3Y
  12.  
    \'
  13.  
     
  14.  
    #*****************************************************************
  15.  
    # 用来显示信号的辅助函数
  16.  
    #*****************************************************************
  17.  
     
  18.  
     
  19.  
    signal = iif(model == \'base\', prices > sma,
  20.  
     
  21.  
     
  22.  
     
  23.  
    #基于信号创建一个模型
  24.  
     
  25.  
    share(data, clean.signal=T, silent=T)
  26.  
     
  27.  
    # 创建一个图来显示信号
  28.  
     
  29.  
    plot(p[dates] ,type=\'l\', plotX=F, x.highlight = highlight)

visuali(\'2000::2001\')

延迟进场/退场的好处是交易量少,成交量小。 

  1.  
    #*****************************************************************
  2.  
    # 设置
  3.  
    #*****************************************************************
  4.  
     
  5.  
    models = list()
  6.  
     
  7.  
    #*****************************************************************
  8.  
    # SPY
  9.  
    #******************************************************************
  10.  
     
  11.  
    run(data)
  12.  
     
  13.  
    #*****************************************************************
  14.  
    # SPY + 10个月过滤器
  15.  
    #******************************************************************
  16.  
    apply(prices, SMA, 10*22)
  17.  
     
  18.  
    iif(prices > sma, 1, 0)
  19.  
    CASH = 1 - ifna( ifna(SPY), 0)
  20.  
     
  21.  
    #*****************************************************************
  22.  
    # SPY+10个月+5/-5%过滤器
  23.  
    #******************************************************************
  24.  
    (cross(prices, sma * 1.05), (prices, sma * 0.95), 0, NA)
  25.  
     

我还包括了我对动态回测移动平均线的尝试,但在这种形式下,并不实用。

  1.  
    #*****************************************************************
  2.  
    # SPY + 基于波动率的动态过滤器
  3.  
    #******************************************************************
  4.  
    vol = matrix(ret, SD, n = 21)
  5.  
    if(vol.rank < 0.5, bt(prices, SMA, 10*22),matrix(prices, SMA, 1*22))
  6.  
     
  7.  
    data$w
  8.  
     
  9.  
    #*****************************************************************
  10.  
    # SPY+基于波动率的动态过滤器;多个级别
  11.  
    #******************************************************************
  12.  
    nbreaks = 5
  13.  
     
  14.  
    sma.cash = sma * NA
  15.  
    for(i in 1:nbreaks) {
  16.  
    temp = data(matrix(prices, SMA, (nbreaks - i + 1)* 2 *22)
  17.  
     
  18.  
    }
  19.  
     
  20.  
     
  21.  
    #*****************************************************************
  22.  
    # 报告
  23.  
    #*****************************************************************
  24.  
    plot(models)

 SPYSPY.CASHSPY.CASH.BANDSPY.CASH.VOL.SIMPLESPY.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
  1.  
     
  2.  
    barplot(turnover, data)

接下来,让我们把相同的带状策略应用于TAA模型。 

  1.  
    #加载保存的代理原始数据
  2.  
     
  3.  
    data <- new.env()
  4.  
     
  5.  
    getSymbols(tickers, src = \'yahoo\')
  6.  
     
  7.  
    #*****************************************************************
  8.  
    # 设置
  9.  
    #*****************************************************************
  10.  
    universe = prices > 0
  11.  
     
  12.  
    models = list()
  13.  
     
  14.  
    #*****************************************************************
  15.  
    # 基准
  16.  
    #*****************************************************************
  17.  
    weight[] = NA
  18.  
     
  19.  
    #*****************************************************************
  20.  
    #The [战术性资产配置策略的量化方法(QATAA) Mebane T. Faber](http://mebfaber.com/timing-model/)
  21.  
    #[SSRN ](http://papers.ssrn.com/sol3/papers.cfm?abstract_id=962461)
  22.  
    #*****************************************************************
  23.  
     
  24.  
    weight = iif(prices > sma, 20/100, 0)
  25.  
    run(data)
  26.  
     
  27.  
    #*****************************************************************
  28.  
    # bands替代方案 移动平均
  29.  
    #*****************************************************************
  30.  
    signal = if(cross(prices, sma * 1.05), 1, iif(cross.dn(prices, sma * 0.95), 0, NA))
  31.  
     
  32.  
    #*****************************************************************
  33.  
    # 报告
  34.  
    #*****************************************************************
  35.  
    #performance(models, T)

 SP500EWModelModel.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
  1.  
    layout(1)
  2.  
    barplot(sapply(models,turnover)

plot of chunk plot-5

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


最受欢迎的见解

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时间序列聚类方法对股票价格时间序列聚类

9.python3用arima模型进行时间序列预测