量化投资:第6节 回测结果的度量

0
回复
7996
查看
[复制链接]

24

主题

15

回帖

227

积分

中级会员

积分
227
来源: 2019-11-2 23:01:22 显示全部楼层 |阅读模式
前面小节中都使用分解流程方式一步一步实现回测,目的是为了更清晰的说明内部操作流程, 编码过程会显的有些复杂臃肿,但实际上在编写完成一个策略后只需要使用一行代码即abu.run_loop_back可以完成回测。
详细代码实现请阅读abu.run_loop_back()函数,下面使用run_loop_back()进行策略示例
  1. <font color="black" style="background-color: white;"># 设置初始资金数
  2. read_cash = 1000000
  3. # 设置选股因子,None为不使用选股因子
  4. stock_pickers = None
  5. # 买入因子依然延用向上突破因子
  6. buy_factors = [{'xd': 60, 'class': AbuFactorBuyBreak},
  7.                {'xd': 42, 'class': AbuFactorBuyBreak}]

  8. # 卖出因子继续使用上一节使用的因子
  9. sell_factors = [
  10.     {'stop_loss_n': 1.0, 'stop_win_n': 3.0,
  11.      'class': AbuFactorAtrNStop},
  12.     {'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.5},
  13.     {'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5}
  14. ]
  15. # 择时股票池
  16. choice_symbols = ['usNOAH', 'usSFUN', 'usBIDU', 'usAAPL', 'usGOOG',
  17.                   'usTSLA', 'usWUBA', 'usVIPS']
  18. # 使用run_loop_back运行策略
  19. abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash,
  20.                                                                                                                                   buy_factors,
  21.                                                                                                                                   sell_factors,
  22.                                                                                                                                   stock_pickers,
  23.                                                                                                                                   choice_symbols=choice_symbols,
  24.                                                                                                                                    n_folds=2)</font>
复制代码
如上代码abu.run_loop_back接口只需要买入策略序列,卖出策略序列等必要的用户参数,不再涉及AbuBenchmark,AbuCapital等对象的构建操作行为。
1. 度量的基本使用方法
abu_result_tuple类型为AbuResultTuple对象,AbuMetricsBase类为abupy对回测结果进行度量的基础类,对于基于股票类型的
市场进行的回测可以直接使用,对于其它市场度量类有自己的专属类,如AbuMetricsFutures为对期货进行度量时使用,后面的章节示例期货回测时会示例使用。
首先通过AbuMetricsBase的参数进行结果度量,如下所示:
  • 输出的文字信息打印了胜率、获利期望、亏损期望、策略收益、买入成交比例等信息
  • 第一图为策略收益与基准收益对照
  • 第二图为策略收益线性拟合曲线
  • 第三图为策略收益资金概率密度图‘



  1. <font style="background-color: white;"><font style="background-color: white;">metrics = AbuMetricsBase(*abu_result_tuple)
  2. metrics.fit_metrics()
  3. metrics.plot_returns_cmp()</font></font>
复制代码

买入后卖出的交易数量:67
买入后尚未卖出的交易数量:3
胜率:55.2239%
平均获利期望:14.1076%
平均亏损期望:-7.8008%
盈亏比:2.2102
策略收益: 48.3078%
基准收益: 15.0841%
策略年化收益: 24.1539%
基准年化收益: 7.5420%
策略买入成交比例:80.0000%
策略资金利用率比例:28.0706%
策略共执行504个交易日

110202.png
110203.png
2. 度量的可视化
在AbuMetricsBase执行过程中对回测策略的
  • 收益, 年化收益
  • 胜率, 盈亏比
  • 平均获利期望, 平均亏损期望
  • 夏普比率, 信息比率
  • 策略波动率, 阿尔法, 贝塔

....................
等度量值进行了计算,详情请阅读AbuMetricsBase源代码,关于这些度量值的基础知识请阅读《量化交易之路》中相关章节。
下面示例一些度量值的可视化:
如下代码通过plot_sharp_volatility_cmp()函数可视化策略与基准之间波动率和夏普比率关系:


  1. <font style="background-color: white;"><font style="background-color: white;">metrics.plot_sharp_volatility_cmp()</font></font>
复制代码

  1. <font style="background-color: white;"><font style="background-color: white;">alpha阿尔法:0.1899
  2. beta贝塔:0.1594
  3. Information信息比率:0.0423
  4. 策略Sharpe夏普比率: 1.8654
  5. 基准Sharpe夏普比率: 0.5012
  6. 策略波动率Volatility: 0.1090
  7. 基准波动率Volatility: 0.1689</font></font>
复制代码

  1. <font style="background-color: white;"><span style="color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; font-family:;" 0px;"="" normal;="" 245);="" 245,="" rgb(245,="" 2;="" pre-wrap;="" !important;="" inline="" none;="" 0px;="" 12px;="" sans-serif;="" new",="" courier=""><font style="background-color: white;">metrics.plot_effect_mean_day()</font></span></font>
复制代码
110204.png
如下代码通过plot_effect_mean_day()函数可视化策略买入因子生效间隔天数, 统计买入因子的生效间隔,如图9-3所示。不同的类型的买入因子策略在生效周期上差别很大,组合不同特性的买入因子组成良好的买入策略很重要,但是要注意买入因子的组合不是组合的因子越多,优势越大,所有因子的组合、不光是优势的组合,同时也是劣势的组合。

  1. <font style="background-color: white;">metrics.plot_effect_mean_day()</font>
复制代码

  1. <font style="background-color: white;">因子平均生效间隔:16.7105263158</font>
复制代码
110205.png
如下代码通过plot_keep_days()函数可视化策略持股天数:
  1. [backcolor=white]metrics.plot_keep_days()[/backcolor]
复制代码
  1. [backcolor=white]策略持股天数平均数: 45.429
  2. 策略持股天数中位数: 29.000[/backcolor]
复制代码


110206.png 如下代码通过plot_sell_factors()函数可视化策略卖出因子生效分布情况:


  1. <font style="background-color: white;">metrics.plot_sell_factors()</font>
复制代码
  1. <font style="background-color: white;">卖出生效因子分布:
  2. AbuFactorAtrNStop:stop_loss=1.0           18
  3. AbuFactorAtrNStop:stop_win=3.0             9
  4. AbuFactorCloseAtrNStop:close_atr_n=1.5    31
  5. AbuFactorPreAtrNStop:pre_atr=1.5           9
  6. dtype: int64</font>
复制代码
110207.png
plot_max_draw_down()函数中实现了计算最大回撤并可视化:

  1. <font style="background-color: white;">metrics.plot_max_draw_down()</font>
复制代码
110208.png

  1. <font style="background-color: white;">最大回撤: 0.065704
  2. 最大回测启始时间:2016-04-14, 结束时间2016-07-13, 共回测103775.665000</font>
复制代码

3. 扩展自定义度量类
用户可以通过继承AbuMetricsBase,扩展度量值,以及添加其它的度量可视化方法。
如下代码示例子类通过实现:
  • 扩展_metrics_extend_stats方法,添加交易手续费变化曲线做为度量值
  • 添加plot_commission度量可视化方法,可视化收益曲线和手续费曲线之前的关系

  1. <font style="background-color: white;">from abupy import ABuScalerUtil

  2. class MetricsDemo(AbuMetricsBase):
  3.     """扩展自定义度量类示例"""

  4.     def _metrics_extend_stats(self):
  5.         """
  6.             子类可扩展的metrics方法,子类在此方法中可定义自己需要度量的值:
  7.             本demo示例交易手续费和策略收益之间的度量对比
  8.         """
  9.         commission_df = self.capital.commission.commission_df
  10.         commission_df['commission'] = commission_df.commission.astype(float)
  11.         commission_df['cumsum'] = commission_df.commission.cumsum()
  12.         """
  13.             eg:
  14.                 type    date    symbol  commission  cumsum
  15.             0   buy 20141024    usAAPL  19.04   19.04
  16.             0   buy 20141024    usAAPL  19.04   38.08
  17.             0   buy 20141029    usNOAH  92.17   130.25
  18.             0   buy 20141029    usBIDU  7.81    138.06
  19.             0   buy 20141029    usBIDU  7.81    145.87
  20.             0   buy 20141029    usVIPS  60.95   206.82
  21.         """
  22.         # 讲date转换为index
  23.         dates_pd = pd.to_datetime(commission_df.date)
  24.         commission = pd.DataFrame(index=dates_pd)
  25.         """
  26.             eg: commission
  27.             2014-10-24  19.04
  28.             2014-10-24  38.08
  29.             2014-10-29  130.25
  30.             2014-10-29  138.06
  31.             2014-10-29  145.87
  32.             2014-10-29  206.82
  33.             2014-11-03  265.82
  34.             2014-11-11  360.73
  35.         """
  36.         commission['cum'] = commission_df['cumsum'].values
  37.         self.commission_cum = commission['cum']
  38.         self.commission_sum = self.commission_cum[-1]

  39.     def plot_commission(self):
  40.         """
  41.             使用计算好的首先费cumsum序列和策略收益cumsum序列进行可视化对比
  42.             可视化收益曲线和手续费曲线之前的关系
  43.         """
  44.         print('回测周期内手续费共: {:.2f}'.format(self.commission_sum))
  45.         # 使用缩放scaler_xy将两条曲线缩放到同一个级别
  46.         x, y = ABuScalerUtil.scaler_xy(self.commission_cum, self.algorithm_cum_returns, type_look='look_max',
  47.                                        mean_how=True)
  48.         x.plot(label='commission')
  49.         y.plot(label='algorithm returns')
  50.         plt.legend(loc=2)
  51.         plt.show()</font>
复制代码

上面代码的MetricsDemo类即完成了扩展自定义度量类的实现,它可以使用本前面使用的AbuMetricsBase中任何方法,
如metrics.plot_returns_cmp(),metrics.plot_max_draw_down()等等,它独有度量可视化方法plot_commission():

  1. <font style="background-color: white;">metrics = MetricsDemo(*abu_result_tuple)
  2. metrics.fit_metrics()
  3. metrics.plot_commission()</font>
复制代码

  1. <font style="background-color: white;">回测周期内手续费共: 4680.93</font>
复制代码
110209.png
上面通过plot_commission方法中通过ABuScalerUtil.scaler_xy将两条曲线缩放到一个可视化级别上,可视化的目的是更直观的发现策略中的问题,度量值的意义即是提供发现问题的线索值,如上面两条曲线的走势,当策略收益曲线变缓的时候,手续费曲线应该也要随着变缓慢,如果出现两条曲线背离或者完全不跟随的情况,都代表交易策略有问题。
自定义度量类时也一定要以发现问题为目的,提供线索为手段进行度量类的个性化定制。
备注:关于ABuScalerUtil.scaler_xy等工具的使用在后面的章节会有示例讲解演示






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 免费注册
关注微信