前面小节中都使用表明流程格局一步一步达成回测

上一节关键教授了何等选择abupy低度量模块对回测的结果开始展览度量,本节将重点疏解使用grid
search模块对战术参数寻找最优。

如上代码abu.run_loop_back接口只须要购买战术类别,卖出政策类别等必备的用户参数,不再涉及AbuBenchmark,AbuCapital等目的的创设操作行为。

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}
]

三. 增添自定义衡量类

用户可以透过三番五次AbuMetricsBase,扩大衡量值,以及丰裕任何的心路可视化方法。

一般来讲代码示例子类通过兑现:

  1. 扩展_metrics_extend_stats方法,增多交易手续费变化曲线做为衡量值
  2. 添加plot_commission度量可视化方法,可视化收益曲线和手续费曲线后面包车型地铁关联

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()

上面代码的Metrics德姆o类即落成了扩展自定义衡量类的兑现,它能够应用本后边使用的AbuMetricsBase中此外措施,
如metrics.plot_returns_cmp(),metrics.plot_max_draw_down()等等,它独有衡量可视化方法plot_commission():

metrics = MetricsDemo(*abu_result_tuple)
metrics.fit_metrics()
metrics.plot_commission()

回测周期内手续费共: 4680.93

图片 1

地点通过plot_commission方法中经过ABuScalerUtil.scaler_xy将两条曲线缩放到三个可视化等第上,可视化的目标是更加直观的发现战略中的难点,衡量值的含义就是提供开采难题的头脑值,如下边两条曲线的增势,当计谋受益曲线变缓的时候,手续费曲线应该也要随着变缓慢,借使出现两条曲线背离或然完全不跟随的情事,都意味着交易计策有标题。

自定义度量类时也确定要以发现难题为目的,提供线索为花招实行度量类的特性化定制。

备注:关于ABuScalerUtil.scaler_xy等工具的应用在后面包车型地铁章节会有示范疏解演示

最优参数的意趣是举例说上壹节使用的卖出因子组合使用:

详细代码完结请阅读abu.run_loop_back()函数,下边选择run_loop_back()进行政策示例:

阿布量化版权全体 未经允许 禁止转发

# 设置初始资金数
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)

4. 两样权重的评分

读者也许会有的难点二:为啥从衡量可视化看到的这一个最优的投资回报还尚无上一节的充裕回测高?

因为出于默许的WrsmScorer使用:胜率、sharpe、投资回报、最大回撤那多个要素,综合评比攻略的分数,并且类GridSearch默感觉4项等权重评分,我们上面可以壹如既往使用WrsmScorer然则通过调治权重来达到各个评比效果。

# 实例化WrsmScorer,参数weights,只有第二项为1,其他都是0,
# 代表只考虑投资回报来评分
scorer = WrsmScorer(score_tuple_array, weights=[0, 1, 0, 0])
# 返回排序后的队列
scorer_returns_max = scorer.fit_score()
# 因为是倒序排序,所以index最后一个为最优参数
best_score_tuple_grid = score_tuple_array[scorer_returns_max.index[-1]]
# 由于篇幅,最优结果只打印文字信息
AbuMetricsBase.show_general(best_score_tuple_grid.orders_pd,
                            best_score_tuple_grid.action_pd,
                            best_score_tuple_grid.capital,
                            best_score_tuple_grid.benchmark,
                            only_info=True)

买入后卖出的交易数量:51
买入后尚未卖出的交易数量:19
胜率:82.3529%
平均获利期望:16.2075%
平均亏损期望:-7.6414%
盈亏比:8.8162
策略收益: 49.7671%
基准收益: 15.0841%
策略年化收益: 24.8835%
基准年化收益: 7.5420%
策略买入成交比例:62.8571%
策略资金利用率比例:41.3748%
策略共执行504个交易日
alpha阿尔法:0.1810
beta贝塔:0.3710
Information信息比率:0.0485
策略Sharpe夏普比率: 1.4955
基准Sharpe夏普比率: 0.5012
策略波动率Volatility: 0.1420
基准波动率Volatility: 0.1689

可以观察只思索投资回报来评分的话,下边战术收益: 50.4九%为最高。

上边通过best_score_tuple_grid.buy_factors,best_score_tuple_grid.sell_factors看一下这些收入的买入因子参数、卖出因子参数,如下所示,能够发掘它的因数参数组合与自身在上1节起头选拔的参数是一摸一样的。

best_score_tuple_grid.buy_factors, best_score_tuple_grid.sell_factors

([{'class': abupy.FactorBuyBu.ABuFactorBuyBreak.AbuFactorBuyBreak, 'xd': 42},
  {'class': abupy.FactorBuyBu.ABuFactorBuyBreak.AbuFactorBuyBreak, 'xd': 60}],
 [{'class': abupy.FactorSellBu.ABuFactorCloseAtrNStop.AbuFactorCloseAtrNStop,
   'close_atr_n': 1.5}])

下边看一下只思索胜率来评分的结果,从结果能够看看即便胜率达到了八五%以上,可是收益并不高:

# 只有第一项为1,其他都是0代表只考虑胜率来评分
scorer = WrsmScorer(score_tuple_array, weights=[1, 0, 0, 0])
# 返回按照评分排序后的队列
scorer_returns_max = scorer.fit_score()
# index[-1]为最优参数序号
best_score_tuple_grid = score_tuple_array[scorer_returns_max.index[-1]]
AbuMetricsBase.show_general(best_score_tuple_grid.orders_pd,
                            best_score_tuple_grid.action_pd,
                            best_score_tuple_grid.capital,
                            best_score_tuple_grid.benchmark,
                            only_info=False)

# 最后打印出只考虑胜率下最优结果使用的买入策略和卖出策略
best_score_tuple_grid.buy_factors, best_score_tuple_grid.sell_factors

买入后卖出的交易数量:21
买入后尚未卖出的交易数量:9
胜率:85.7143%
平均获利期望:19.0903%
平均亏损期望:-9.2893%
盈亏比:9.4105
策略收益: 21.5035%
基准收益: 15.0841%
策略年化收益: 10.7518%
基准年化收益: 7.5420%
策略买入成交比例:86.6667%
策略资金利用率比例:44.3042%
策略共执行504个交易日

图片 2

图片 3

图片 4

alpha阿尔法:0.0724
beta贝塔:0.4226
Information信息比率:0.0092
策略Sharpe夏普比率: 0.7392
基准Sharpe夏普比率: 0.5012
策略波动率Volatility: 0.1464
基准波动率Volatility: 0.1689

图片 5

([{'class': abupy.FactorBuyBu.ABuFactorBuyBreak.AbuFactorBuyBreak, 'xd': 60}],
 [{'class': abupy.FactorSellBu.ABuFactorCloseAtrNStop.AbuFactorCloseAtrNStop,
   'close_atr_n': 1.5}])

从出口能够看到买入攻略只使用60天突破买入作为购买确定性信号,卖出只以有限支撑收益的止盈ABuFactorCloseAtrNStop发发售出非信号,其实那种宗旨正是从未止损的布署。很像大繁多一般性交易者的贸易方式,亏本了的贸易不卖出,持有直到能够重新毛利为。那样的措施投资者的胜率相当高,笔者前边看过多少个朋友的交易账户,开掘他们交易的胜率相当高,但她们的账户最终都以亏空的,我以为交易中最抽象的就是胜率,可是多数人追求的相反是胜率。假若说股市最后的投资结果十分九的人将亏空收场话,那小编深信那9/10的人胜率大大多都为赶过八分之四竟是越来越高,那么1旦我们想最后制伏市集以来,大家的有效投资政策是或不是相应是胜率低于二分之一的啊?

abu量化文档目录章节

  1. 择时政策的开辟
  2. 择时宗旨的优化
  3. 滑点计策与交易手续费
  4. 多支股票(stock)择时回测与仓位管理
  5. 选股战术的开支
  6. 回测结果的气量
  7. 查找政策最优参数和评分
  8. A股票市镇场的回测
  9. 香港股市票市镇场的回测
  10. 比特币,赖特币的回测
  11. 股票市集的回测
  12. 机器学习与比特币示例
  13. 量化技能分析利用
  14. 量化相关性分析应用
  15. 量化交易和寻觅引擎
  16. UMP主评判交易决策
  17. UMP边裁交易决策
  18. 自定义评判决策交易
  19. 数据源
  20. A股全商店回测
  21. A股UMP决策
  22. 美国期货全市集回测
  23. 美股UMP决策

abu量化系统文书档案教程持续革新中,请关心群众号中的更新提醒。

更加多阿布量化量化才具文章

越多关于量化交易有关请阅读《量化交易之路》

更加多关于量化交易与机械和工具学习相关请阅读《机器学习之路》

更加多关于abu量化系统请关切微信公众号: abu_quant

图片 6

本节ipython
notebook

abu量化系统github地址(应接+star,你的扶助是自己更新的引力!)

abu量化系统github地址(接待+star,你的支撑是作者更新的重力!)

作者: 阿布

贰. Grid Search搜索最优参数

上边代码应用abupy中的GridSearch类举行最优参数寻觅,从GridSearch类参数能够看到除了buy_factors_product、sell_factors_product外,还有stock_pickers_product(选股因子排列组合)本例未有利用,读者可活动尝试。

read_cash = 1000000
choice_symbols = ['usNOAH', 'usSFUN', 'usBIDU', 'usAAPL', 'usGOOG',
                  'usTSLA', 'usWUBA', 'usVIPS']
grid_search = GridSearch(read_cash, choice_symbols,
                         buy_factors_product=buy_factors_product,
                         sell_factors_product=sell_factors_product)

下边开首通过fit函数初阶查找最优,第3次运转select:run gird
search,然后点击run select,若是已经运转过可select:load score
cache直接从缓存数据读取

备考:要是第三次运转选拔run gird
search上边的运转耗时差不离壹钟头多,建议计算机空闲时运转

scores = None
score_tuple_array = None

def run_grid_search():
    global scores, score_tuple_array
    # 运行GridSearch n_jobs=-1启动cpu个数的进程数
    scores, score_tuple_array = grid_search.fit(n_jobs=-1)
    # 运行完成输出的score_tuple_array可以使用dump_pickle保存在本地,以方便之后使用
    ABuFileUtil.dump_pickle(score_tuple_array, '../gen/score_tuple_array')

def load_score_cache():
    """有本地数据score_tuple_array后,即可以从本地缓存读取score_tuple_array"""
    global scores, score_tuple_array

    with AbuBlockProgress('load score cache'):
        score_tuple_array = ABuFileUtil.load_pickle('../gen/score_tuple_array')
        if not hasattr(grid_search, 'best_score_tuple_grid'):
            # load_pickle的grid_search没有赋予best_score_tuple_grid,这里补上
            from abupy import make_scorer, WrsmScorer
            scores = make_scorer(score_tuple_array, WrsmScorer)
            grid_search.best_score_tuple_grid = score_tuple_array[scores.index[-1]]
        print('load complete!')

def select(select):
    if select == 'run gird search':
        run_grid_search()
    else: # load score cache
        load_score_cache()

_ = ipywidgets.interact_manual(select, select=['run gird search', 'load score cache'])

上边选拔type查看重返的score_tuple_array类型为list,score_tuple_array中的成分类型为AbuScoreTuple:

type(score_tuple_array), type(score_tuple_array[0])

(list, abupy.MetricsBu.ABuMetricsScore.AbuScoreTuple)

上面说过组合数量477 x 三 = 143第11中学因子组合:

最终的评分结果也应有scores是有1431种,上边初叶验证:

print('最终评分结果数量{}'.format(len(scores)))

最终评分结果数量1431

grid_search中保留了得到分数最高的目的best_score_tuple_grid,能够使用它直接用AbuMetricsBase可视化最优参数结果,如图:

from abupy import AbuMetricsBase
best_score_tuple_grid = grid_search.best_score_tuple_grid
AbuMetricsBase.show_general(best_score_tuple_grid.orders_pd, best_score_tuple_grid.action_pd,
                                        best_score_tuple_grid.capital, best_score_tuple_grid.benchmark)

买入后卖出的交易数量:38
买入后尚未卖出的交易数量:2
胜率:60.5263%
平均获利期望:13.4462%
平均亏损期望:-6.0647%
盈亏比:3.2382
策略收益: 31.5812%
基准收益: 15.0841%
策略年化收益: 15.7906%
基准年化收益: 7.5420%
策略买入成交比例:100.0000%
策略资金利用率比例:18.0478%
策略共执行504个交易日

图片 7

图片 8

图片 9

alpha阿尔法:0.1310
beta贝塔:0.1100
Information信息比率:0.0210
策略Sharpe夏普比率: 1.8907
基准Sharpe夏普比率: 0.5012
策略波动率Volatility: 0.0742
基准波动率Volatility: 0.1689

图片 10

1. 心地的中央采纳办法

abu_result_tuple类型为AbuResultTuple对象,AbuMetricsBase类为abupy对回测结果进行衡量的底子类,对于基于股票(stock)类型的
商场张开的回测能够间接行使,对于别的商场度量类有谈得来的专属类,如AbuMetricsFutures为对股票(stock)举办度量时选用,后边的章节示例股票回测时会示例使用。

率先通过AbuMetricsBase的参数进行结果衡量,如下所示:

  • 出口的文字音信打印了胜率、牟利期望、耗损期望、攻略获益、买入成交比例等音讯
  • 率先图为政策受益与规范受益对照
  • 第三图为政策收益线性拟合曲线
  • 其三图为政策收益资金财产可能率密度图

metrics = AbuMetricsBase(*abu_result_tuple)
metrics.fit_metrics()
metrics.plot_returns_cmp()

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

图片 11

图片 12

图片 13

叁. 心胸结果的评分

读者大概会有的难题一:何地来的分数,怎么判断的分数。

在GridSearch类
fit()函数中得以见见第贰个参数score_class须求三个判分类,在fit()中最终几行使用ABuMetricsScore.make_scorer()函数将享有再次来到的结果score_tuple_array使用判分类WrsmScorer对结果打分数。

打分数完成的基本思路为:若是想依照sharpe值的结果来对最优参数下判定,然而sharpe值多大能够肯定为915分?多大能够判别为四十7分吧?大家不能够分明,所以将富有sharpe结果排序,由于sharpe值越大越好,所以排序结果对应分数由0至壹,那样就可以赢得某八个实际参数组合的sharpe值的分数。那样的话使用多少个评分标准,
举个例子那里运用’win_rate’、 ‘returns’、
‘sharpe’、’max_drawdown’两种,就可以分级总括出有个别参数组合对应的心胸目的评分,再乘以分配给它们的权重就能够收获最后结出分数。

切切实实请阅读GridSearch.fit,AbuBaseScorer,WrsmScorer源代码完成

正如代码大家实例化多少个评分类WrsmScorer,它的参数为事先GridSearch重临的score_tuple_array对象:

scorer = WrsmScorer(score_tuple_array)

如下可以见见scorer中的score_pd是由评分的气量目标数值,以及那么些现实数量对应项所得的分数组成:

scorer.score_pd.tail()

图片 14

由于AbuBaseScorer
中fit_score()函数的兑现只是对score_pd的’score’项实行排序后回来score,那样结尾的结果为分数及对应score_tuple_array的行列号,从下边输出能够见到658为最优参数序号,所以score_tuple_array[658]与grid_search.best_score_tuple_grid是一律的。

sfs = scorer.fit_score()
sfs[::-1][:15]

658    0.9740
664    0.9696
808    0.9678
688    0.9664
670    0.9608
838    0.9593
682    0.9577
676    0.9577
694    0.9549
657    0.9505
807    0.9460
754    0.9458
687    0.9455
724    0.9430
814    0.9404
Name: score, dtype: float64

前面小节中都使用说明流程格局一步一步达成回测,目的是为了更清楚的验证内部操作流程,
编码进度会显的多少复杂臃肿,但实际在编辑成功三个政策后只须求利用1行代码即abu.run_loop_back能够成功回测。

1. 参数取值范围

Grid
Search实际上是蒙特Carlo艺术的1种落成子集,它首先固定了几组参数取值范围,把最佳个解难题先收缩到零星个解的标题,然后对排列组合的顺序参数组合迭代实行演算,获得最优结果。

既是是在给定参数范围内搜索最优,所以首先要给定多个创制的参数范围,上面首先寻觅AbuFactorAtrNStop的参数组合如下所示:

stop_win_range = np.arange(2.0, 4.5, 0.5)
stop_loss_range = np.arange(0.5, 2, 0.5)

sell_atr_nstop_factor_grid = {
              'class': [AbuFactorAtrNStop],
              'stop_loss_n'   : stop_loss_range,
              'stop_win_n'   : stop_win_range
         }

print('AbuFactorAtrNStop止盈参数stop_win_n设置范围:{}'.format(stop_win_range))
print('AbuFactorAtrNStop止损参数stop_loss_n设置范围:{}'.format(stop_loss_range))

AbuFactorAtrNStop止盈参数stop_win_n设置范围:[ 2.   2.5  3.   3.5  4. ]
AbuFactorAtrNStop止损参数stop_loss_n设置范围:[ 0.5  1.   1.5]

以前小节构造因子对象的队列使用字典情势装载参数和class,如下所示

{'stop_loss_n': 1.0, 'stop_win_n': 3.0,
 'class': AbuFactorAtrNStop},

上面sell_atr_nstop_factor_grid使用类似的章程组织字典对象,分裂就是具备字典中的成分都改为可迭代的队列了。

动用类似的方法设置AbuFactorPreAtrNStop与AbuFactorCloseAtrNStop参数设置范围,如下所示:

close_atr_range = np.arange(1.0, 4.0, 0.5)
pre_atr_range = np.arange(1.0, 3.5, 0.5)

sell_atr_pre_factor_grid = {
              'class': [AbuFactorPreAtrNStop],
              'pre_atr_n' : pre_atr_range
         }

sell_atr_close_factor_grid = {
              'class': [AbuFactorCloseAtrNStop],
              'close_atr_n' : close_atr_range
         }

print('暴跌保护止损参数pre_atr_n设置范围:{}'.format(pre_atr_range))
print('盈利保护止盈参数close_atr_n设置范围:{}'.format(close_atr_range))

暴跌保护止损参数pre_atr_n设置范围:[ 1.   1.5  2.   2.5  3. ]
盈利保护止盈参数close_atr_n设置范围:[ 1.   1.5  2.   2.5  3.   3.5]

在参数参数设置范围规定了的前提下就能够以初叶对参数进行重组,代码如下所示:

sell_factors_product = ABuGridHelper.gen_factor_grid(
    ABuGridHelper.K_GEN_FACTOR_PARAMS_SELL,
    [sell_atr_nstop_factor_grid, sell_atr_pre_factor_grid, sell_atr_close_factor_grid])

print('卖出因子参数共有{}种组合方式'.format(len(sell_factors_product)))
print('卖出因子组合0: 形式为{}'.format(sell_factors_product[0]))

卖出因子参数共有477种组合方式
卖出因子组合0: 形式为[{'class': <class 'abupy.FactorSellBu.ABuFactorAtrNStop.AbuFactorAtrNStop'>, 'stop_loss_n': 0.5, 'stop_win_n': 2.0}, {'class': <class 'abupy.FactorSellBu.ABuFactorPreAtrNStop.AbuFactorPreAtrNStop'>, 'pre_atr_n': 1.0}, {'class': <class 'abupy.FactorSellBu.ABuFactorCloseAtrNStop.AbuFactorCloseAtrNStop'>, 'close_atr_n': 1.0}]

上述代码应用ABuGridHelper.gen_factor_grid对参数举办组合,结果共组合出477种包括不相同参数的重组,分歧因子的3结合,也有一同不选拔别的因子的结合。

相似方法使用ABuGridHelper生成不一致买入参数的因数排列组合,
那里只行使416日、60日看成预备参数。读者可利用类似bk_days = np.arange(20,
130,
10)格局生成越来越多的采办参数,更能够协和完结任何的购入攻略与AbuFactorBuyBreak一齐做grid,但是在后来品级运维Grid
Search速度就会越慢。

buy_bk_factor_grid1 = {
    'class': [AbuFactorBuyBreak],
    'xd': [42]
}

buy_bk_factor_grid2 = {
    'class': [AbuFactorBuyBreak],
    'xd': [60]
}

buy_factors_product = ABuGridHelper.gen_factor_grid(
    ABuGridHelper.K_GEN_FACTOR_PARAMS_BUY, [buy_bk_factor_grid1, buy_bk_factor_grid2])

print('买入因子参数共有{}种组合方式'.format(len(buy_factors_product)))
print('买入因子组合形式为{}'.format(buy_factors_product))

买入因子参数共有3种组合方式
买入因子组合形式为[[{'class': <class 'abupy.FactorBuyBu.ABuFactorBuyBreak.AbuFactorBuyBreak'>, 'xd': 42}, {'class': <class 'abupy.FactorBuyBu.ABuFactorBuyBreak.AbuFactorBuyBreak'>, 'xd': 60}], [{'class': <class 'abupy.FactorBuyBu.ABuFactorBuyBreak.AbuFactorBuyBreak'>, 'xd': 42}], [{'class': <class 'abupy.FactorBuyBu.ABuFactorBuyBreak.AbuFactorBuyBreak'>, 'xd': 60}]]

是因为只采纳4二d、60d为参数,所以唯有二种排列组合,相当于分别为:

  • 只行使4贰d突破因子
  • 只利用60d突破因子
  • 还要选取42d、60d突破因子

购置因子有47七种组成,卖出因子有叁种组成,两者再结合将有47七 x 三 =
1四第3第11中学学因子组合

print('组合因子参数数量{}'.format(len(buy_factors_product) * len(sell_factors_product) ))

组合因子参数数量1431

阿布量化版权全体 未经允许 禁止转发

AbuFactorAtrNStop止盈止损攻略的止盈阀值是三.0,止损阀值是壹.0,那么止盈参数设置成贰.0依然止损阀值设置为0.5是否回测交易效能越来越好呢,
AbuFactorPreAtrNStop风险控幸免损pre_atr_n参数设置的是一.5,假若设置为一.0回测结果将什么,grid
search模块对战略寻觅最优参数正是要在加以的参数组合范畴内,找寻到政策参数最好的安装。

二. 心胸的可视化

在AbuMetricsBase试行进程中对回测计谋的

  • 低收入, 年化收益
  • 胜率, 盈亏比
  • 平均获取利益期望, 平均亏折期望
  • Sharp比率, 音信比率
  • 政策波动率, 阿尔法, 贝塔

………………..
等度量值进行了计算,详细情况请阅读AbuMetricsBase源代码,关于那个衡量值的基础知识请阅读《量化交易之路》中相关章节。

上边示例一些衡量值的可视化:

正如代码通过plot_sharp_volatility_cmp()函数可视化攻略与规范之间波动率和夏普比率关系:

metrics.plot_sharp_volatility_cmp()

alpha阿尔法:0.1899
beta贝塔:0.1594
Information信息比率:0.0423
策略Sharpe夏普比率: 1.8654
基准Sharpe夏普比率: 0.5012
策略波动率Volatility: 0.1090
基准波动率Volatility: 0.1689

图片 15

正如代码通过plot_effect_mean_day()函数可视化计策买入因子生效间隔天数,
计算买入因子的见效间隔,如图九-三所示。分裂的种类的购置因子攻略在奏效周期上距离不小,组合分裂风味的买卖因子组成卓绝的采办计谋很关键,可是要专注买入因子的结缘不是组成的因数更加多,优势越大,全数因子的咬合、不光是优势的整合,同时也是逆风局的整合。

metrics.plot_effect_mean_day()

因子平均生效间隔:16.7105263158

图片 16

一般来讲代码通过plot_keep_days()函数可视化攻略持有期货天数:

metrics.plot_keep_days()

策略持股天数平均数: 45.429
策略持股天数中位数: 29.000

图片 17

如下代码通过plot_sell_factors()函数可视化计策卖出因子生效布满情形:

metrics.plot_sell_factors()

卖出生效因子分布:
AbuFactorAtrNStop:stop_loss=1.0           18
AbuFactorAtrNStop:stop_win=3.0             9
AbuFactorCloseAtrNStop:close_atr_n=1.5    31
AbuFactorPreAtrNStop:pre_atr=1.5           9
dtype: int64

图片 18

plot_max_draw_down()函数中实现了总计最大回撤销合并可视化:

metrics.plot_max_draw_down()

图片 19

最大回撤: 0.065704
最大回测启始时间:2016-04-14, 结束时间2016-07-13, 共回测103775.665000

五. 自定义评分类的得以落成

地点的评分全体都以使用abupy中置放的WrsmScorer做为评分类,其从三个维度:胜率、sharpe、投资回报、最大回撤综合考核评议战略的分数,通过调解权重来达到各种评比效果,不过只要用户想要从任何的维度来归纳评分的话就供给自定义评分类。

上一节中最终示例扩展自定义衡量类中编辑了Metrics德姆o衡量类,它扩展了AbuMetricsBase度量类,增添了贸易手续费相关衡量值,以及可视化方法
,上边包车型客车以身作则编写评分类将应用手续费做为3个心胸维度对grid结果实行评分,代码如下所示:

from abupy import AbuBaseScorer

class DemoScorer(AbuBaseScorer):
    def _init_self_begin(self, *arg, **kwargs):
        """胜率,策略收益,手续费组成select_score_func"""

        self.select_score_func = lambda metrics: [metrics.win_rate, metrics.algorithm_period_returns,
                                                  metrics.commission_sum]
        self.columns_name = ['win_rate', 'returns', 'commission']
        self.weights_cnt = len(self.columns_name)

    def _init_self_end(self, *arg, **kwargs):
        """
        _init_self_end这里一般的任务是将score_pd中需要反转的反转,默认是数据越大越好,有些是越小越好,
        类似make_scorer(xxx, greater_is_better=True)中的参数greater_is_better的作用:

                            sign = 1 if greater_is_better else -1
        """
        self.score_pd['commission'] = -self.score_pd['commission']

地点的代码德姆oScorer即落成了自定义评分类:

  1. 自定义评分类须要持续AbuBaseScorer
  2. 自定义评分类供给贯彻_init_self_begin,申明本人要胸怀metrics中的这么些衡量值
  3. 自定义评分类须求达成_init_self_end,在那里将须要反转结果的度量值进行反转

本例_init_self_end中使用:

self.score_pd['commission'] = -self.score_pd['commission']

将手续费数值进行反转,因为本例衡量的典型是手续费的支出越小代表结果越好,所以必要在_init_self_end上校手续费那1列产生负数。

上边创设德姆oScorer,注意传递了至关心器重要字参数metrics_class,使用Metrics德姆o,暗中认可不传递metrics_class将运用AbuMetricsBase做为衡量类提供度量值,不过德姆oScorer中必要动用metrics.commission_sum,所以那边不可不接纳Metrics德姆o,代码如下所示:

备注:已将Metrics德姆o做为abupy内置计策示例因子在品种中,所以本节不另行编写,直接从abupy中import,如下所示

from abupy import MetricsDemo

scorer = DemoScorer(score_tuple_array, metrics_class=MetricsDemo)
# 返回按照评分排序后的队列
scorer_returns_max = scorer.fit_score()
scorer.score_pd.tail()

图片 20

位置代码应用德姆oScorer对grid的结果进行评分,从score_pd.tail()中得以见见commission=-117玖.97,
即手续费总开销为117九.九7的score_commission评分结果在手续费评分结果中是满分一

scorer.score_pd.head()

图片 21

从score_pd.head()中能够见见手续费支付越大的在手续费分数score_commission那1栏中的得分结果就越低,
由此可见假若利用:

scorer = DemoScorer(score_tuple_array, metrics_class=MetricsDemo, weights=[0, 0, 1])

将评分权重都放在手续费的支付上,那么评分的结果最终的就是不怎么进行选购交易,或然购买后不开始展览卖出交易的参数组合了,读者可活动尝试。

有关评分类的越多细节请自行阅读源AbuBaseScorer

计算:对于交易系统的优化,最优参数的取舍主题素材,首先大家要显明全部的参数拟合都以凭仗历史数据的,即拟合壹组最优参数使其对特定历史还是特定一些期货的回测结果趋于完善的实际意义并相当小,有时反而壮志未酬,可是大粒度的总括意义照旧有着。比方上边使用的有的因子的参数你设置为拾0照旧别的不可靠的数那一定是不妥帖的,在总括范围内来界定参数的星星个解是有含义的,可是实际的最优参数却是不存在的,不要在最优参数上沦为误区,适可而止,精通好度,是办好每一件事情的第贰。

本节ipython
notebook

作者: 阿布

abu量化文书档案目录章节

  1. 择时事政治策的开采
  2. 择时布署的优化
  3. 滑点战术与交易手续费
  4. 多支股票择时回测与仓位管理
  5. 选股战术的开销
  6. 回测结果的衡量
  7. 探索政策最优参数和评分
  8. A股商场的回测
  9. 香港股市票市集场的回测
  10. 比特币,Wright币的回测
  11. 股票(stock)百货店的回测
  12. 机械学习与比特币示例
  13. 量化本事分析利用
  14. 量化相关性分析利用
  15. 量化交易和探寻引擎
  16. UMP主评判交易决策
  17. UMP边裁交易决策
  18. 自定义评判决策交易
  19. 数据源
  20. A股全市镇回测
  21. A股UMP决策
  22. 美国股票(stock)全商场回测
  23. 美股UMP决策

abu量化系统文书档案教程持续更新中,请关心群众号中的更新提醒。

愈来愈多阿布量化量化手艺小说

越多关于量化交易有关请阅读《量化交易之路》

更多关于量化交易与机械和工具学习有关请阅读《机器学习之路》

越多关于abu量化系统请关切微信公众号: abu_quant

图片 22

相关文章