In [1]:
# 基础库导入
from __future__ import print_function
from __future__ import division
import warnings
warnings.filterwarnings('ignore')
warnings.simplefilter('ignore')
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import os
import sys
# 使用insert 0即只使用github,避免交叉使用了pip安装的abupy,导致的版本不一致问题
sys.path.insert(0, os.path.abspath('../'))
import abupy
# 使用沙盒数据,目的是和书中一样的数据环境
abupy.env.enable_example_env_ipython()
前面小节中都使用分解流程方式一步一步实现回测,目的是为了更清晰的说明内部操作流程, 编码过程会显的有些复杂臃肿,但实际上在编写完成一个策略后只需要使用一行代码即abu.run_loop_back可以完成回测。
详细代码实现请阅读abu.run_loop_back()函数,下面使用run_loop_back()进行策略示例:
In [2]:
from abupy import AbuFactorBuyBreak
from abupy import AbuFactorAtrNStop
from abupy import AbuFactorPreAtrNStop
from abupy import AbuFactorCloseAtrNStop
# run_loop_back等一些常用且最外层的方法定义在abu中
from abupy import abu, ABuProgress
# 设置初始资金数
read_cash = 1000000
# 设置选股因子,None为不使用选股因子
stock_pickers = None
# 买入因子依然延用向上突破因子
buy_factors = [{'xd': 60, 'class': AbuFactorBuyBreak},
{'xd': 42, 'class': AbuFactorBuyBreak}]
# 卖出因子继续使用上一节使用的因子
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}
]
# 择时股票池
choice_symbols = ['usNOAH', 'usSFUN', 'usBIDU', 'usAAPL', 'usGOOG',
'usTSLA', 'usWUBA', 'usVIPS']
# 使用run_loop_back运行策略
abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash,
buy_factors,
sell_factors,
stock_pickers,
choice_symbols=choice_symbols,
n_folds=2)
ABuProgress.clear_output()
如上代码abu.run_loop_back接口只需要买入策略序列,卖出策略序列等必要的用户参数,不再涉及AbuBenchmark,AbuCapital等对象的构建操作行为。
可通过help查看abu.run_loop_back使用帮助, 更多详情请阅读源代码。
In [3]:
help(abu.run_loop_back)
如上help信息所示,abu_result_tuple类型为AbuResultTuple对象,AbuMetricsBase类为abupy对回测结果进行度量的基础类,对于基于股票类型的 市场进行的回测可以直接使用,对于其它市场度量类有自己的专属类,如AbuMetricsFutures为对期货进行度量时使用,后面的章节示例期货回测时会示例使用。
首先通过AbuMetricsBase的参数进行结果度量,如下所示:
In [4]:
from abupy import AbuMetricsBase
metrics = AbuMetricsBase(*abu_result_tuple)
metrics.fit_metrics()
metrics.plot_returns_cmp()
如下代码通过plot_sharp_volatility_cmp()函数可视化策略与基准之间波动率和夏普比率关系:
In [5]:
metrics.plot_sharp_volatility_cmp()
如下代码通过plot_effect_mean_day()函数可视化策略买入因子生效间隔天数, 统计买入因子的生效间隔,如图9-3所示。不同的类型的买入因子策略在生效周期上差别很大,组合不同特性的买入因子组成良好的买入策略很重要,但是要注意买入因子的组合不是组合的因子越多,优势越大,所有因子的组合、不光是优势的组合,同时也是劣势的组合。
In [6]:
metrics.plot_effect_mean_day()
如下代码通过plot_keep_days()函数可视化策略持股天数:
In [7]:
metrics.plot_keep_days()
如下代码通过plot_sell_factors()函数可视化策略卖出因子生效分布情况:
In [8]:
metrics.plot_sell_factors()
plot_max_draw_down()函数中实现了计算最大回撤并可视化:
In [9]:
metrics.plot_max_draw_down()
用户可以通过继承AbuMetricsBase,扩展度量值,以及添加其它的度量可视化方法。
如下代码示例子类通过实现:
In [10]:
from abupy import ABuScalerUtil
class MetricsDemo(AbuMetricsBase):
"""扩展自定义度量类示例"""
def _metrics_extend_stats(self):
"""
子类可扩展的metrics方法,子类在此方法中可定义自己需要度量的值:
本demo示例交易手续费和策略收益之间的度量对比
"""
commission_df = self.capital.commission.commission_df
commission_df['commission'] = commission_df.commission.astype(float)
commission_df['cumsum'] = commission_df.commission.cumsum()
"""
eg:
type date symbol commission cumsum
0 buy 20141024 usAAPL 19.04 19.04
0 buy 20141024 usAAPL 19.04 38.08
0 buy 20141029 usNOAH 92.17 130.25
0 buy 20141029 usBIDU 7.81 138.06
0 buy 20141029 usBIDU 7.81 145.87
0 buy 20141029 usVIPS 60.95 206.82
"""
# 讲date转换为index
dates_pd = pd.to_datetime(commission_df.date)
commission = pd.DataFrame(index=dates_pd)
"""
eg: commission
2014-10-24 19.04
2014-10-24 38.08
2014-10-29 130.25
2014-10-29 138.06
2014-10-29 145.87
2014-10-29 206.82
2014-11-03 265.82
2014-11-11 360.73
"""
commission['cum'] = commission_df['cumsum'].values
self.commission_cum = commission['cum']
self.commission_sum = self.commission_cum[-1]
def plot_commission(self):
"""
使用计算好的首先费cumsum序列和策略收益cumsum序列进行可视化对比
可视化收益曲线和手续费曲线之前的关系
"""
print('回测周期内手续费共: {:.2f}'.format(self.commission_sum))
# 使用缩放scaler_xy将两条曲线缩放到同一个级别
x, y = ABuScalerUtil.scaler_xy(self.commission_cum, self.algorithm_cum_returns, type_look='look_max',
mean_how=True)
x.plot(label='commission')
y.plot(label='algorithm returns')
plt.legend(loc=2)
plt.show()
上面代码的MetricsDemo类即完成了扩展自定义度量类的实现,它可以使用本前面使用的AbuMetricsBase中任何方法, 如metrics.plot_returns_cmp(),metrics.plot_max_draw_down()等等,它独有度量可视化方法plot_commission():
In [11]:
metrics = MetricsDemo(*abu_result_tuple)
metrics.fit_metrics()
metrics.plot_commission()
上面通过plot_commission方法中通过ABuScalerUtil.scaler_xy将两条曲线缩放到一个可视化级别上,可视化的目的是更直观的发现策略中的问题,度量值的意义即是提供发现问题的线索值,如上面两条曲线的走势,当策略收益曲线变缓的时候,手续费曲线应该也要随着变缓慢,如果出现两条曲线背离或者完全不跟随的情况,都代表交易策略有问题。
自定义度量类时也一定要以发现问题为目的,提供线索为手段进行度量类的个性化定制。
备注:关于ABuScalerUtil.scaler_xy等工具的使用在后面的章节会有示例讲解演示
abu量化系统文档教程持续更新中,请关注公众号中的更新提醒。
更多关于量化交易相关请阅读《量化交易之路》
更多关于量化交易与机器学习相关请阅读《机器学习之路》
更多关于abu量化系统请关注微信公众号: abu_quant
如有任何问题也可在公众号中联系我的个人微信号。