第29节 多因子策略并行执行配合
作者: 阿布
阿布量化版权所有 未经允许 禁止转载
阿布量化微信公众号: abu_quant
abu量化系统github地址 (欢迎+star)
上一节讲解了经典择时策略双均线的示例,本节讲解多因子策略并行执行配合。
到目前为止已经示例了很多买入因子,abupy中一个特点即是可以在交易中使用多个买入,卖出因子并行执行生效。
在回测交易中可以组织多个买入因子构建序列,如:
- 自适应动态双均线买入金叉策略
- 海龟42天周期向上突破买入策略
- 大盘拟合稳定21天突破买入策略
亦可以组织多个卖出策略构建序列,如:
- 双均线卖出死叉策略
- 海龟21天周期向下突破卖出策略
- 基本止盈止损策略:止损1.0,止盈3.0
- 风险控制止损策略:参数1.5
- 利润保护止盈策略:参数1.5
下面代码按照上述进行买入,卖出因子序列构建,如下:
buy_factors = [{'class': AbuDoubleMaBuy},
{'xd': 42, 'class': AbuFactorBuyBreak},
{'xd': 21, 'class': AbuSDBreak}]
sell_factors = [
{'class': AbuDoubleMaSell},
{'xd': 21, 'class': AbuFactorSellBreak},
{'stop_loss_n': 1.0, 'stop_win_n': 3.0, 'class': AbuFactorAtrNStop},
{'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.5},
{'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5}
]
构建完策略后,下面使用沙盒数据美股数据,示例并行执行上述策略进行回测,如下:
# 使用沙盒内的美股做为回测目标
us_choice_symbols = ['usTSLA', 'usNOAH', 'usSFUN', 'usBIDU', 'usAAPL',
'usGOOG', 'usWUBA', 'usVIPS']
# 初始资金量
cash = 3000000
abu_result_tuple, metrics = run_loo_back(us_choice_symbols)
买入后卖出的交易数量:131
买入后尚未卖出的交易数量:7
胜率:51.9084%
平均获利期望:15.9512%
平均亏损期望:-5.8270%
盈亏比:2.7959
策略收益: 45.0467%
基准收益: 15.0841%
策略年化收益: 22.5234%
基准年化收益: 7.5420%
策略买入成交比例:67.3913%
策略资金利用率比例:37.0038%
策略共执行504个交易日
下面可视化各个买入因子的生效数量以及比例,如下:
metrics.plot_buy_factors()
买入择时生效因子分布:
AbuDoubleMaBuy 33
AbuFactorBuyBreak 38
AbuSDBreak 60
dtype: int64
下面可视化各个卖出因子的生效数量比例,可以发现双均线卖出死叉策略(AbuDoubleMaSell)和海龟21天周期向下突破卖出策略(AbuFactorSellBreak)生效的比例和数量都很多:
metrics.plot_sell_factors()
卖出择时生效因子分布:
AbuDoubleMaSell:61 14
AbuFactorAtrNStop:stop_loss=1.0 6
AbuFactorAtrNStop:stop_win=3.0 18
AbuFactorCloseAtrNStop:close_atr_n=1.5 47
AbuFactorPreAtrNStop:pre_atr=1.5 14
AbuFactorSellBreak:21 32
dtype: int64
虽然上面的回测没有出错,但是本示例中多因子策略的设计组织本来是想要如下效果的:
即理想的多因子策略组织为:
- 基础卖出因子(止盈止损&风险控制&利润保护)对应所有买入因子生效
- 海龟21天周期向下卖出只对应海龟42天周期向上买入生效
- 双均线卖出死叉只对应买入动态双均线金叉生效
这个问题在有些特殊的卖出因子组合下还会导致整体策略组合配合出错,如下
- 买入因子组合中添加在‘第26节 星期几是这个股票的好日子’中示例的周期短线均值回复买入策略AbuFactorBuyWD
- 卖出因子组合中添加AbuFactorSellNDay,sell_n=1配合AbuFactorBuyWD短线买入策略持有一天就卖出股票
添加后进行回测,代码如下所示:
# 添加AbuFactorBuyWD
buy_factors = [
{'class': AbuFactorBuyWD},
{'class': AbuDoubleMaBuy},
{'xd': 42, 'class': AbuFactorBuyBreak},
{'xd': 21, 'class': AbuSDBreak}]
# 添加AbuFactorSellNDay
sell_factors = [
{'class': AbuFactorSellNDay, 'sell_n': 1, 'is_sell_today': True},
{'class': AbuDoubleMaSell},
{'xd': 21, 'class': AbuFactorSellBreak},
{'stop_loss_n': 1.0, 'stop_win_n': 3.0, 'class': AbuFactorAtrNStop},
{'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.5},
{'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5}
]
abu_result_tuple, metrics = run_loo_back(us_choice_symbols)
买入后卖出的交易数量:232
买入后尚未卖出的交易数量:2
胜率:20.6897%
平均获利期望:1.5342%
平均亏损期望:-1.8610%
盈亏比:0.8385
策略收益: -3.8801%
基准收益: 15.0841%
策略年化收益: -1.9400%
基准年化收益: 7.5420%
策略买入成交比例:100.0000%
策略资金利用率比例:2.8394%
策略共执行504个交易日
由上回测结果可以看到效果很差,统计交易单中个买入因子所对应的卖出因子,可以发现卖出因子全部都使用了AbuFactorSellNDay,即所有的交易都只持有了一天就在第二天卖出了股票,如下所示:
abu_result_tuple.orders_pd.groupby('buy_factor')['sell_type_extra'].value_counts()
buy_factor sell_type_extra
AbuDoubleMaBuy AbuFactorSellNDay:sell_n=1 38
AbuFactorBuyBreak AbuFactorSellNDay:sell_n=1 40
AbuFactorBuyWD AbuFactorSellNDay:sell_n=1 94
2
AbuSDBreak AbuFactorSellNDay:sell_n=1 60
Name: sell_type_extra, dtype: int64
这肯定不是整体策略设计的意愿,实际上只是想要短线均值回复买入策略AbuFactorBuyWD使用持有一天就卖出的策略,其它的买入策略不应该使用。
要解决上述问题,只需要在买入因子字典中单独配置卖出因子策略,在全局的卖出因子策略序列中只配置适应全局卖出的策略,如下所示:
"""
持有一天卖出策略AbuFactorSellNDay只对应AbuFactorBuyWD生效
双均线卖出死叉只对应买入动态双均线金叉生效
海龟21天周期向下卖出只对应海龟42天周期向上买入生效
"""
buy_factors = [
{'class': AbuFactorBuyWD,
'sell_factors': [{'class': AbuFactorSellNDay,
'sell_n': 1, 'is_sell_today': True}]},
{'class': AbuDoubleMaBuy,
'sell_factors': [{'fast': 5, 'slow': 60,
'class': AbuDoubleMaSell}]},
{'xd': 42, 'class': AbuFactorBuyBreak,
'sell_factors': [{'xd': 21,
'class': AbuFactorSellBreak}]},
{'xd': 21, 'class': AbuSDBreak}]
# 基础卖出因子(止盈止损&风险控制&利润保护)对应所有买入因子生效
sell_factors = [
{'stop_loss_n': 1.0, 'stop_win_n': 3.0, 'class': AbuFactorAtrNStop},
{'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.5},
{'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5}
]
abu_result_tuple, metrics = run_loo_back(us_choice_symbols)
买入后卖出的交易数量:225
买入后尚未卖出的交易数量:9
胜率:53.3333%
平均获利期望:10.1370%
平均亏损期望:-4.4064%
盈亏比:2.4213
策略收益: 46.7453%
基准收益: 15.0841%
策略年化收益: 23.3726%
基准年化收益: 7.5420%
策略买入成交比例:74.7863%
策略资金利用率比例:40.6575%
策略共执行504个交易日
上面代码的买入,卖出因子策略组织即完成了理想的因子配合方式,如下:
- 基础卖出因子(止盈止损&风险控制&利润保护)对应所有买入因子生效
- 海龟21天周期向下卖出只对应海龟42天周期向上买入生效
- 双均线卖出死叉只对应买入动态双均线金叉生效
- 持有一天就卖出策略AbuFactorSellNDay只对应短线均值回复买入策略AbuFactorBuyWD
更进一步从下面回测单子中买入因子所对应的卖出因子可看到:
- AbuDoubleMaSell只对应AbuDoubleMaBuy
- AbuFactorSellBreak只对应AbuFactorBuyBreak
- AbuFactorSellNDay只对应AbuFactorBuyWD
如下所示:
abu_result_tuple.orders_pd.groupby('buy_factor')['sell_type_extra'].value_counts()
buy_factor sell_type_extra
AbuDoubleMaBuy AbuFactorCloseAtrNStop:close_atr_n=1.5 13
AbuDoubleMaSell:61 6
AbuFactorAtrNStop:stop_win=3.0 6
5
AbuFactorAtrNStop:stop_loss=1.0 4
AbuFactorPreAtrNStop:pre_atr=1.5 4
AbuFactorBuyBreak AbuFactorCloseAtrNStop:close_atr_n=1.5 17
AbuFactorSellBreak:21 10
AbuFactorAtrNStop:stop_win=3.0 5
AbuFactorPreAtrNStop:pre_atr=1.5 4
2
AbuFactorAtrNStop:stop_loss=1.0 2
AbuFactorBuyWD AbuFactorSellNDay:sell_n=1 94
2
AbuSDBreak AbuFactorCloseAtrNStop:close_atr_n=1.5 23
AbuFactorAtrNStop:stop_loss=1.0 17
AbuFactorPreAtrNStop:pre_atr=1.5 11
AbuFactorAtrNStop:stop_win=3.0 9
Name: sell_type_extra, dtype: int64
组合不同特性的买入因子组成良好的买入策略很重要,但是要注意买入因子的组合不是组合的因子越多,优势越大,所有因子的组合、不光是优势的组合,同时也是劣势的组合,关于这方面的示例在之后的教程中会有讲解,请关注公众号中的教程更新。
abu量化文档目录章节
- 择时策略的开发
- 择时策略的优化
- 滑点策略与交易手续费
- 多支股票择时回测与仓位管理
- 选股策略的开发
- 回测结果的度量
- 寻找策略最优参数和评分
- A股市场的回测
- 港股市场的回测
- 比特币,莱特币的回测
- 期货市场的回测
- 机器学习与比特币示例
- 量化技术分析应用
- 量化相关性分析应用
- 量化交易和搜索引擎
- UMP主裁交易决策
- UMP边裁交易决策
- 自定义裁判决策交易
- 数据源
- A股全市场回测
- A股UMP决策
- 美股全市场回测
- 美股UMP决策
更多关于量化交易相关请阅读《量化交易之路》
更多关于量化交易与机器学习相关请阅读《机器学习之路》
更多关于abu量化系统请关注微信公众号: abu_quant