依旧针对回测进行滑点或是手续费都以针对1支期货(Futures)实行择时操作,abu量化系统github地址

叁. 多支证券使用不一致的因数进行择时

使用ABuPickTimeExecute.do_symbols_with_diff_factors()函数针对差别的股票使用差异的购买贩卖因子和分化的卖出因子,

切切实实贯彻请查阅源代码ABuPickTimeExecute,使用示比如下:

# 选定noah和sfun
target_symbols = ['usSFUN', 'usNOAH']

# 针对sfun只使用42d向上突破作为买入因子
buy_factors_sfun = [{'xd': 42, 'class': AbuFactorBuyBreak}]
# 针对sfun只使用60d向下突破作为卖出因子
sell_factors_sfun = [{'xd': 60, 'class': AbuFactorSellBreak}]

# 针对noah只使用21d向上突破作为买入因子
buy_factors_noah = [{'xd': 21, 'class': AbuFactorBuyBreak}]
# 针对noah只使用42d向下突破作为卖出因子
sell_factors_noah = [{'xd': 42, 'class': AbuFactorSellBreak}]

factor_dict = dict()
# 构建SFUN独立的buy_factors,sell_factors的dict
factor_dict['usSFUN'] = {'buy_factors': buy_factors_sfun,
                         'sell_factors': sell_factors_sfun}

# 构建NOAH独立的buy_factors,sell_factors的dict
factor_dict['usNOAH'] = {'buy_factors': buy_factors_noah,
                         'sell_factors': sell_factors_noah}

# 初始化资金
capital = AbuCapital(1000000, benchmark)
# 使用do_symbols_with_diff_factors执行
orders_pd, action_pd, all_fit_symbols = ABuPickTimeExecute.do_symbols_with_diff_factors(target_symbols,
                                                                                        benchmark,
                                                                                        factor_dict,
                                                                                        capital)

一般来说代码通过pandas的接力表来分析输出的orders_pd, 来验证:
noah买入因子全体是运用二1d升华突破,sfun买入因子全体是行使42d向上突破:

pd.crosstab(orders_pd.buy_factor, orders_pd.symbol)

图片 1

本节先是讲明择时(什么日期投资), 前边的小节将执教选股

作者: 阿布

回测模块最要紧的组成部份是择时、选股:

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

  • 回测模块:首先交易者编写达成一个贸易战术,它依据一段历史的交易数据,按照交易计策举行效仿买入卖出,战略中得以提到购买规则、卖出规则、选股规则、仓位调控及滑点计策等等,回测的目标是评释交易计策是或不是可行。
  • 实盘模块:将回测通过的方针应用于每一日的实时交易数额,依照政策发出买卖时限信号、卖出功率信号,进行实际的选购、卖出操作。

本节将示例解说多支期货(Futures)进行择时战术的得以完结,照旧采取AbuFactorBuyBreak做为买入计谋,别的四个卖出政策同时生效的结缘。

三.2 买入因子和卖出因子在回测中并且生效

同理使用字典组装卖出因子:

# 使用120天向下突破为卖出信号
sell_factor1 = {'xd': 120, 'class': AbuFactorSellBreak}

# buy_factors 60日向上突破,42日向上突破两个因子
buy_factors = [{'xd': 60, 'class': AbuFactorBuyBreak}, 
               {'xd': 42, 'class': AbuFactorBuyBreak}]

# 只使用120天向下突破为卖出因子
sell_factors = [sell_factor1]
capital = AbuCapital(1000000, benchmark)
orders_pd, action_pd, _ = ABuPickTimeExecute.do_symbols_with_same_factors(['usTSLA'],
                                                                            benchmark,
                                                                            buy_factors,
                                                                            sell_factors,
                                                                            capital, show=True)

图片 2

从上海教室能够观望,大繁多的贸易卖出因子都见效了,但效果很倒霉,
下一节将承接透过增添三个卖出因子同时作用于政策上来提升政策的功力。

本节ipython
notebook

  • 择时(什么日期投资)
  • 选股(投资什么股票(stock))
from abupy import AbuFactorBuyBreak, AbuFactorSellBreak
from abupy import AbuFactorAtrNStop, AbuFactorPreAtrNStop, AbuFactorCloseAtrNStop
from abupy import ABuPickTimeExecute, AbuBenchmark, AbuCapital

# buy_factors 60日向上突破,42日向上突破两个因子
buy_factors = [{'xd': 60, 'class': AbuFactorBuyBreak}, 
               {'xd': 42, 'class': AbuFactorBuyBreak}]
# 四个卖出因子同时并行生效
sell_factors = [
    {
        'xd': 120,
        'class': AbuFactorSellBreak
    },
    {
        'stop_loss_n': 0.5,
        'stop_win_n': 3.0,
        'class': AbuFactorAtrNStop
    },
    {
        'class': AbuFactorPreAtrNStop,
        'pre_atr_n': 1.0
    },
    {
        'class': AbuFactorCloseAtrNStop,
        'close_atr_n': 1.5
    }]
benchmark = AbuBenchmark()
capital = AbuCapital(1000000, benchmark)

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

阿布量化版权全数 未经允许 禁止转载

3. 卖出择时因子的得以达成

地方装有单子都未曾拍板的原委是未有售出因子,下边首先落到实处类似买入战术的N日趋势突破政策AbuFactorSellBreak,当股票价格向下突破N日压低价位时卖出证券,即当天收盘价格低于N天内最低价格作为卖出功率信号,以为下跌势头创建卖出股票(stock):

class AbuFactorSellBreak(AbuFactorSellXD):
    """示例继承AbuFactorBuyXD, 向下突破卖出择时因子"""
    def support_direction(self):
        """支持的方向,只支持正向"""
        return [ESupportDirection.DIRECTION_CAll.value]

    def fit_day(self, today, orders):
        """
        寻找向下突破作为策略卖出驱动event
        :param today: 当前驱动的交易日金融时间序列数据
        :param orders: 买入择时策略中生成的订单序列
        """
        # 今天的收盘价格达到xd天内最低价格则符合条件
        if today.close == self.xd_kl.close.min():
            for order in orders:
                self.sell_tomorrow(order)

上AbuFactorSellBreak便是完结了卖出突破政策的代码落成:

  1. 卖出因子必要接二连三AbuFactorSellXD也许更复杂的国策承接AbuFactorSellBase
  2. 卖出因子供给贯彻support_direction方法,鲜明攻略扶助的购买计谋方向,本例中[ESupportDirection.DIRECTION_CAll.value]即只协理正向买入计策,即买涨
  3. 卖出因子供给贯彻fit_day,看有未有合乎卖出条件的交易单子

越来越多具体卖出因子完毕代码请阅读AbuFactorSellBase

备注:之后章节的股票(stock)示例讲讲授如何利用ESupportDirection做反向贸易,buy
put

四. 使用并行来提高择时运营作用

当您选取的期货(Futures)十分多的时候,比如很多时候是对全市镇拓展回测,那就需求多过程并行来提高运作效能,AbuPickTimeMaster.do_symbols_with_same_factors_process()函数通过定义n_process_kl(同时获得股票(stock)数量的长河数)和n_process_pick_time(同时拓展择时的历程数)来成功操作.

切实落到实处代码请阅读AbuPickTimeMaster,使用示举个例子下所示:

%%time
from abupy import AbuPickTimeMaster

capital = AbuCapital(1000000, benchmark)
orders_pd, action_pd, _ = AbuPickTimeMaster.do_symbols_with_same_factors_process(
                                    choice_symbols, benchmark, buy_factors, sell_factors, capital,
                                    n_process_kl=4, n_process_pick_time=4)

pid:12502 gen kl_pd complete:100.0%
pid:12503 gen kl_pd complete:100.0%
pid:12504 gen kl_pd complete:100.0%
pid:12505 gen kl_pd complete:100.0%
pid:12506 gen kl_pd complete:100.0%
pid:12507 gen kl_pd complete:100.0%
pid:12508 gen kl_pd complete:100.0%
pid:12509 gen kl_pd complete:100.0%
pid:12503 done!
pid:12505 done!
pid:12506 done!
pid:12507 done!
pid:12504 done!
pid:12502 done!
pid:12509 done!
pid:12508 done!
pid:12510 pick times complete:100.0%
pid:12511 pick times complete:100.0%
pid:12512 pick times complete:100.0%
pid:12513 pick times complete:100.0%
pid:12514 pick times complete:100.0%
pid:12515 pick times complete:100.0%
pid:12516 pick times complete:100.0%
pid:12517 pick times complete:100.0%
pid:12510 done!
pid:12512 done!
pid:12515 done!
pid:12513 done!
pid:12511 done!
pid:12514 done!
pid:12517 done!
pid:12516 done!
CPU times: user 2.48 s, sys: 192 ms, total: 2.67 s
Wall time: 6.36s

依旧接纳%%time度量代码块运行时刻,此前运用起来时行使ABuPickTimeExecute运维一样的回测输出运营时刻1九.二s,
行使AbuPickTimeMaster使用参数n_process_pick_time=八,即起步几个择时进度后,运营时刻裁减到陆.3六s,从输出的新闻也足以看看几个pid同时实行
择时

  • pid:84544 pick times complete:100.0%
  • pid:84545 pick times complete:100.0%
  • pid:84546 pick times complete:100.0%
  • pid:84547 pick times complete:100.0%
  • pid:84548 pick times complete:100.0%
  • pid:84549 pick times complete:100.0%
  • pid:84550 pick times complete:100.0%
  • pid:84551 pick times complete:100.0%

多进度的周转格局在开始展览多支股票(stock)设置全市集计谋回测时是尤其实用的,本节由于choice_symbols中的期货(Futures)数少,n_process_kl即互相金融数据搜集模块
并不曾应用,还有局地索要留意的地点也还不曾讲到,在后续的全集镇回测章节讲承继上课。

备注:

由于本例开荒进度数较多,但是每种进程处理的天职万分少,所以在cpu不够快的电脑上结果可能刚刚相反,多进程方式的运营也行会尤其耗费时间,效用更低,属正常现象,前面包车型大巴例证每一种进度恐怕会处理几十几百个交易对象就不会油不过生创造销毁进程的开支大于职分实行时间的情景

  • 专程是windows系统,mac上不会时有爆发,由于mac上的相互使用joblib,在windows上长职分joblib存在bug,所以windows上互动只是包裹为joblib的接口形式,实际情况阅读源代码ABuParallel

在对的时刻,遇见对的人(股票),是一种幸福

在对的时光,遇见错的人(证券),是壹种忧伤

在错的岁月,遇见对的人(期货(Futures)),是一声叹息

在错的时刻,遇见错的人(股票(stock)),是壹种无奈

一. 多支期货使用一样的因数举行择时

挑选的证券如下所示:
choice_symbols = [‘usTSLA’, ‘usNOAH’, ‘usSFUN’, ‘usBIDU’, ‘usAAPL’,
‘usGOOG’, ‘usWUBA’, ‘usVIPS’]

备注:本节示范都依照美国股市,针对A股票集镇场及香港股市票市镇场,比特币,期货(Futures)市集后在末端的章节疏解

# 我们假定choice_symbols是我们选股模块的结果,
choice_symbols = ['usTSLA', 'usNOAH', 'usSFUN', 'usBIDU', 'usAAPL',
                  'usGOOG', 'usWUBA', 'usVIPS']

使用ABuPickTimeExecute.do_symbols_with_same_factors()函数对多支期货使用一样的购置因子,卖出因子

%%time
capital = AbuCapital(1000000, benchmark)
orders_pd, action_pd, all_fit_symbols_cnt = ABuPickTimeExecute.do_symbols_with_same_factors(choice_symbols,
                                                                                            benchmark,
                                                                                            buy_factors,
                                                                                            sell_factors,
                                                                                            capital,
                                                                                            show=False)

CPU times: user 18.5 s, sys: 264 ms, total: 20.1 s
Wall time: 19.2 s

运作完结,使用了ipython的magic code
%%time去总结代码块运维时刻,呈现运维了1玖.2s,本节最终会使用多进度形式运作一样的回测,会和这么些日子进行比较。

备考:具体实在运维时刻依据cpu的习性明确

下面代码展现orders_pd中前十二个交易数额:

orders_pd[:10]

图片 3

通过buy_cnt列能够窥见每一趟交易数额都差别,由于个中有基金管控模块暗中同意使用atr进行仓位调节

暗许资金管理调节使用AbuAtrPosition,详细的情况请阅读源代码,上边会有自定义仓位处理的演示。

上边代码显示action_pd中前十一个表现数据:

action_pd[:10]

图片 4

  • 专注deal列代表了贸易是或不是成交,由于内部有开支管控模块,所以不是具备交易功率信号都能够最后成交。

上边大家采用abu量化系统一测试量模块对总体结果做个心地,如下图所示(之后章节会对度量方法及模块举行详尽批注,这里请先简单利用就能够)。

from abupy import AbuMetricsBase 
metrics = AbuMetricsBase(orders_pd, action_pd, capital, benchmark)
metrics.fit_metrics()
metrics.plot_returns_cmp(only_show_returns=True)

买入后卖出的交易数量:67
买入后尚未卖出的交易数量:3
胜率:43.2836%
平均获利期望:12.2712%
平均亏损期望:-4.9050%
盈亏比:1.9327
策略收益: 29.4383%
基准收益: 15.0841%
策略年化收益: 14.7192%
基准年化收益: 7.5420%
策略买入成交比例:84.2857%
策略资金利用率比例:22.3612%
策略共执行504个交易日

图片 5

一. 购买择时因子的编排

乌龟交易法则是量化杰出书籍中的卓绝作品,它里面介绍过壹种倾向追踪政策:N日大势突破政策

趋势突破定义为当天收盘价格超越N天内的最高价或低价,超越最高价格作为购买确定性信号买入股票(stock)持有,超越最低价格作为卖出实信号。

上边将用abupy来兑现陆龟交易法则作为1个买进因子的落成代码,向杰出致敬:

class AbuFactorBuyBreak(AbuFactorBuyXD, BuyCallMixin):
    """示例继承AbuFactorBuyXD完成正向突破买入择时类, 混入BuyCallMixin,即向上突破触发买入event"""
    def fit_day(self, today):
        """
        针对每一个交易日拟合买入交易策略,寻找向上突破买入机会
        :param today: 当前驱动的交易日金融时间序列数据
        :return:
        """
        # 今天的收盘价格达到xd天内最高价格则符合买入条件
        if today.close == self.xd_kl.close.max():
            # 生成买入订单, 由于使用了今天的收盘价格做为策略信号判断,所以信号发出后,只能明天买
            return self.buy_tomorrow()
        return None

上AbuFactorBuyBreak就是完结了海龟突破政策的代码落成:

  1. 购进因子需求持续AbuFactorBuyXD或许更复杂的宗旨承接AbuFactorBuyBase
  2. 选购因子混入BuyCallMixin,即做为正向攻略,股票(stock)相关的方针全体是正向战术,即买涨,后续章节示例证券,期货合作选择权会使用BuyPutMixin
  3. 选购因子须求完毕fit_day,即每3个交易日如何施行交易战略,当符合购买条件后,使用buy_tomorrow或者buy_today生成订单

越多购买因子完毕代码请阅读AbuFactorBuyBase

abu量化文书档案目录章节

  1. 择时战略的费用
  2. 择时攻略的优化
  3. 滑点计策与交易手续费
  4. 多支股票择时回测与仓位管理
  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

abu量化文档目录章节

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

abu量化系统文档教程持续更新中,请关怀群众号中的更新提示。

愈来愈多阿布量化量化技能作品

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

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

图片 7

二. 自定义仓位管理战略的兑现

地点使用AbuMetricsBase实行衡量,大家总括出:

  1. 胜率:41.79%
  2. 平均贪图利益期望:1二.0一%
  3. 平均亏蚀期望:-四.玖一%

有那四个参数就可以运用kelly公式来做仓位调整,Abu凯利Position落成如下:

class AbuKellyPosition(AbuPositionBase):
    """示例kelly仓位管理类"""

    def fit_position(self, factor_object):
        """
        fit_position计算的结果是买入多少个单位(股,手,顿,合约)
        需要factor_object策略因子对象通过历史回测统计胜率,期望收益,期望亏损,
        并设置构造当前factor_object对象,通过kelly公司计算仓位
        :param factor_object: ABuFactorBuyBases子类实例对象
        :return:买入多少个单位(股,手,顿,合约)
        """
        # 败率
        loss_rate = 1 - self.win_rate
        # kelly计算出仓位比例
        kelly_pos = self.win_rate - loss_rate / (self.gains_mean / self.losses_mean)
        # 最大仓位限制,依然受上层最大仓位控制限制,eg:如果kelly计算出全仓,依然会减少到75%,如修改需要修改最大仓位值
        kelly_pos = self.pos_max if kelly_pos > self.pos_max else kelly_pos
        # 结果是买入多少个单位(股,手,顿,合约)
        return self.read_cash * kelly_pos / self.bp * self.deposit_rate

    def _init_self(self, **kwargs):
        """kelly仓位控制管理类初始化设置"""

        # 默认kelly仓位胜率0.50
        self.win_rate = kwargs.pop('win_rate', 0.50)
        # 默认平均获利期望0.10
        self.gains_mean = kwargs.pop('gains_mean', 0.10)
        # 默认平均亏损期望0.05
        self.losses_mean = kwargs.pop('losses_mean', 0.05)

        """以默认的设置kelly根据计算0.5 - 0.5 / (0.10 / 0.05) 仓位将是0.25即25%"""

自定义仓位管理代码如上Abu凯利Position:

  1. 仓位处理类要求持续AbuPositionBase
  2. 仓位管理类主要供给落成函数fit_position,即基于买卖价格,本金基数等交融买入计谋对购买单位张开测算
  3. 仓位管理类首要供给贯彻函数_init_self,外部通过字典参数将胜率等参数实行关键子参数设置(详见后选取示例)

越多资金管理代码请阅读AbuPositionBase

上面编辑buy_factors二,其42d突破使用position=Abu凯利Position

  • 参数胜率:metrics.win_rate(41.79%)
  • 可望收益:metrics.gains_mean(12.01%)
  • 目的在于亏空:metrics.losses_mean(-4.91%),

代码如下所示:

from abupy import AbuKellyPosition

# 42d使用刚刚编写的AbuKellyPosition,60d仍然使用默认仓位管理类,即abupy中内置的AbuAtrPosition类
buy_factors2 = [{'xd': 60, 'class': AbuFactorBuyBreak},
                {'xd': 42, 'position': {'class': AbuKellyPosition, 'win_rate': metrics.win_rate, 
                                        'gains_mean': metrics.gains_mean, 'losses_mean': -metrics.losses_mean},
                 'class': AbuFactorBuyBreak}]

capital = AbuCapital(1000000, benchmark)
orders_pd, action_pd, all_fit_symbols_cnt = ABuPickTimeExecute.do_symbols_with_same_factors(choice_symbols,
                                                                                            benchmark,
                                                                                            buy_factors2,
                                                                                            sell_factors,
                                                                                            capital,
                                                                                            show=False)

从出口生成的orders_pd中能够看来buy
Pos列全数4二d突破都选拔了Abu凯利Position,60d照样采用AbuAtrPosition

orders_pd[:10].filter(['symbol', 'buy_cnt', 'buy_factor', 'buy_pos'])

图片 8

量化系统一般分为回测模块、实盘模块。

在此之前的章节无论讲授政策优化,依然针对回测实行滑点或是手续费都以对准一支股票(stock)进行择时操作。

只有在对的年月购买对的期货才具毛利,就如下边张小娴的名言一样,能够把‘期货(Futures)’
代替 ‘人’完全合乎逻辑。

作者: 阿布

2. 解释形式一步一步对政策进行回测

本节首先通过分解流程格局一步一步完成应用AbuFactorBuyBreak进行回测,目标是为着更清楚的验证内部操作流程,
编码进程会显的多少复杂臃肿,但其实在编辑成功3个政策后只需要采用1行代码即能够成功回测,在末端的小节中会实行解说。

经过字典格局伊始化买入buy_factors,首先落成针对一支股票(stock)的择时操作:

  • benchmark的意义为标准参考,基准暗中认可使用回测股票(stock)对应市镇的大盘指数
  • 私下认可参数下回测过去两年的交易数据,传递AbuBenchmark(n_folds=2)参数修改回测周期
  • AbuCapital为资本主类,参数必要开首开销设定,那里开始设定一千000(100万),另3个参数为刚刚介绍过的benchmark(基准参考)对象
  • buy_factors由两个购买因子组成,实行择时的时候多个因子同时并行生效

    # buy_factors 60日向上突破,423日进步突破三个因子
    buy_factors = [{‘xd’: 60, ‘class’: AbuFactorBuyBreak},

               {'xd': 42, 'class': AbuFactorBuyBreak}]
    

    benchmark = AbuBenchmark()
    capital = AbuCapital(1000000, benchmark)

择时ABuPickTimeExecute首要驱动格局为时间驱动,即通过时间体系壹天1天递进,通过买进因子卖出因子的fit来询问是不是有事件生成(买入卖出游为),其余也有框架使用事件驱动,它们分别有独家的亮点,原始的abu框架正是时间驱动+事件驱动的,它最大的优点是实行效用比时间驱动高,不过灵活性及扩充性要比时间驱动差。

上面选拔ABuPickTimeExecute初阶张开择时交易回测,ABuPickTimeExecute实际上不是最精简的回测接口,更简便易行的接口可以接纳abu.run_loop_back()函数,在前边的章节将会以身作则使用,本节目标是为着更明显的辨证内部操作流程。

由回测结果图可观望由于AbuPickTimeWorker未有安装sell_factors,所以具备的交易单子都直接保存未有售出:

  • orders_pd:全体交易的连带数据(之后会有内容显示)
  • action_pd:全部交易的一坐一起数据(之后会有内容呈现)

    orders_pd, actionpd, = ABuPickTimeExecute.do_symbols_with_same_factors([‘usTSLA’],

                                                                            benchmark,
                                                                            buy_factors,
                                                                            None,
                                                                            capital, show=True)
    

图片 9

本节ipython
notebook

abu量化系统github地址
(您的star是作者的引力!)

本节分界面操作教程录像播放地址

相关文章