卖出因子等照旧选拔同1的设置,本节批注香港股市票市镇场的回测示例

阿布量化版权所有 未经允许 禁止转发

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

abu量化系统github地址(招待+star)

abu量化系统github地址(接待+star)

本节ipython
notebook

本节ipython
notebook

上1节疏解的是A股票市集场的回测,本节批注香港股市票市镇场的回测示例。

上一节疏解的是A股票商城场的回测,本节疏解香港股市票市集场的回测示例。

购销因子,卖出因子等还是选拔一样的安装,如下所示:

购买因子,卖出因子等依然采取同样的装置,如下所示:

# 设置初始资金数
read_cash = 1000000

# 买入因子依然延用向上突破因子
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}
]
# 设置初始资金数
read_cash = 1000000

# 买入因子依然延用向上突破因子
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}
]

一. 香港股市票百货店场的回测示例

择时股票(stock)池使用沙盒缓存数据中的如下股票(stock):

一. 港股票市镇场的回测示例

择时股票(stock)池使用沙盒缓存数据中的如下证券:

香港股市票市集场:

  • 中夏族民共和国恒大(hk0333叁)
  • Tencent控制股份(hk00700)
  • 长城小车(hk0233三)
  • 神州信达(hk0135九)
  • 复星国际(hk00656)
  • 金山软件(hk0388八)
  • 中原安全(hk0231八)
  • 恒生指数(hkHSI)

代码如下所示:

# 择时股票池
choice_symbols = ['hk03333', 'hk00700', 'hk02333', 'hk01359', 'hk00656', 'hk03888', 'hk02318']

与A股票市集场类似首先将abupy量化意况设置为香港股市,代码如下所示:

# 设置市场类型为港股
abupy.env.g_market_target = EMarketTargetType.E_MARKET_TARGET_HK

abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash,
                                                   buy_factors,
                                                   sell_factors,
                                                   n_folds=6,
                                                   choice_symbols=choice_symbols)
AbuMetricsBase.show_general(*abu_result_tuple, only_show_returns=True)

买入后卖出的交易数量:202
买入后尚未卖出的交易数量:3
胜率:50.4950%
平均获利期望:12.9899%
平均亏损期望:-5.9130%
盈亏比:2.4770
策略收益: 85.8217%
基准收益: 18.5928%
策略年化收益: 14.6923%
基准年化收益: 3.1830%
策略买入成交比例:90.7317%
策略资金利用率比例:32.5890%
策略共执行1472个交易日

ca88亚洲城官网 1

从上收入曲线能够看来在大意在20一5年上旬的有一遍收益猛烈的拉升出现,上边输出top十笔收益,代码如下所示:

orders_pd = abu_result_tuple.orders_pd
top_10 = orders_pd.sort_values(by='profit')[::-1].dropna(subset=['sell_price'])[:10]
top_10.filter(['symbol', 'buy_date', 'buy_price', 'sell_date', 'sell_price', 'profit'])

ca88亚洲城官网 2

从输出能够清晰的看来,top3的高受益交易都发出在201伍年3月份购买,1五月份卖掉,3笔收益都13分高。

整合HSI基准在三-一月以内也有多少个拉升,那里的低收入曲线猛烈拉升也得以明白了。

多多时候编写出2个计策后开掘预期收益非常高,境遇那样的情状,假诺你是认真的,那就相应思索怎么下落受益,下降的不只是收入也是高风险,对应的增高的将是系统的安定团结。

如何手艺下降风险,进步牢固性,比如上边的回测,是否要把叁-6月份此番获益猛烈的拉升滤除才叫下跌风险吗?

本来不是,上边的三-十月份拉升收益是随机应变的纯收入,假如要把那段过滤将是逆势行为。

跌落风险是或不是亟需经过买对冲来落成?

实质上也不建议个人投资者买对冲,因为对冲的成品一般都是和岁月相关的,比如期货合作选择权,股票,扩张一个小时维度会将全部交易复杂度提高多少个数据级,并不建议一般交易者进行那种对冲,尤其是以股票(stock)为重要投资目的的形似交易者(不过足以在布置中做同样类其他相关性对冲,在后头的章节会有落成相关性攻略示例)。

自个儿觉着最符合一般投资者的的增进稳定性的章程便是降低交易功用,比方ump评判拦截,首要正是通过学习攻略中的失败交易,从不一样角度实行学习贸易特点,辅导决策拦截交易,拦截了汪洋的交易可以省去佣金,更关键的意义在于边裁防止了最主要的高风险。

本节教师在不思索使用ump系统的意况下,示比方何通过硬编码攻略来下滑贸易功能,提升系统的安澜。

香港股市票市镇场:

  • 中华夏族民共和国恒大(hk0333三)
  • 腾讯控制股份(hk00700)
  • 长城汽车(hk0233三)
  • 华夏信达(hk0135九)
  • 复星国际(hk0065陆)
  • 金山软件(hk0388八)
  • 神州景德镇(hk0231八)
  • 恒生指数(hkHSI)

代码如下所示:

# 择时股票池
choice_symbols = ['hk03333', 'hk00700', 'hk02333', 'hk01359', 'hk00656', 'hk03888', 'hk02318']

与A股票市廛场类似首先将abupy量化景况设置为香港股市,代码如下所示:

# 设置市场类型为港股
abupy.env.g_market_target = EMarketTargetType.E_MARKET_TARGET_HK

abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash,
                                                   buy_factors,
                                                   sell_factors,
                                                   n_folds=6,
                                                   choice_symbols=choice_symbols)
AbuMetricsBase.show_general(*abu_result_tuple, only_show_returns=True)

买入后卖出的交易数量:202
买入后尚未卖出的交易数量:3
胜率:50.4950%
平均获利期望:12.9899%
平均亏损期望:-5.9130%
盈亏比:2.4770
策略收益: 85.8217%
基准收益: 18.5928%
策略年化收益: 14.6923%
基准年化收益: 3.1830%
策略买入成交比例:90.7317%
策略资金利用率比例:32.5890%
策略共执行1472个交易日

ca88亚洲城官网 3

从上收入曲线能够看来在差不多在201五年上旬的有一次收益猛烈的拉升出现,下边输出top⑩笔收益,代码如下所示:

orders_pd = abu_result_tuple.orders_pd
top_10 = orders_pd.sort_values(by='profit')[::-1].dropna(subset=['sell_price'])[:10]
top_10.filter(['symbol', 'buy_date', 'buy_price', 'sell_date', 'sell_price', 'profit'])

ca88亚洲城官网 4

从输出可以清楚的观望,top三的高受益交易都发出在20一五年三月份选购,6月份售出,三笔受益都卓殊高。

构成HSI基准在三-11月里边也有一个拉升,那里的纯收入曲线猛烈拉升也足以清楚了。

许多时候编写出一个计谋后开掘预期收益相当高,遇到那样的动静,如若您是认真的,这就应该思索怎么下跌受益,下跌的不只是受益也是高危害,对应的滋长的将是系统的稳固性。

怎么样才干下跌危害,提升稳固性,比如下面的回测,是或不是要把三-十二月份此番受益猛烈的拉升滤除才叫降低危机呢?

自然不是,上面包车型客车三-十一月份拉升收益是顺势的收益,即便要把那段过滤将是逆势行为。

降低危机是否内需通过买对冲来落成?

其实也不建议个人投资者买对冲,因为对冲的出品一般都以和岁月相关的,比如期货合作选择权,股票,增添多个岁月维度会将整个交易复杂度提高多少个数据级,并不提出一般交易者实行那种对冲,尤其是以股票(stock)为重大投资对象的貌似交易者(但是能够在安顿中做同样等级次序的相关性对冲,在此后的章节会有完结相关性计策示例)。

本身认为最契合一般投资者的的巩固稳定性的主意正是下落贸易成效,比方ump评判拦截,首要就是通过学习计谋中的失败交易,从不一样角度实行学习贸易特点,指点决策拦截交易,拦截了大气的交易能够省去佣金,更要紧的意义在于边裁制止了珍贵的高危害。

本节上课在不思虑使用ump系统的景观下,示比方何通过硬编码战术来下滑交易作用,提升系统的稳固。

二. 优化战术,升高系统的安宁

上面包车型地铁示范就要突破政策AbuFactorBuyBreak基础上进展下落交易作用,升高系统的牢固性管理。

ca88亚洲城官网,首先看下边采纳AbuTLine.show_least_valid_poly示例,通过get_price获取香港股市大盘HSI三个月收盘价格数据,然后利用AbuTLine.show_least_valid_poly进行poly推断,它回到的结果是质量评定至少poly次拟合曲线能够代表原始曲线y的增势,如下所示显示一遍
曲线即能够表示20140301-二〇一四040一那三个月的拟合市价,如下所示:

hsi = get_price('hkHSI', start_date='20160301', end_date='20160401')
tl.AbuTLine(hsi.price, 'HSI').show_least_valid_poly()

ca88亚洲城官网 5

1

证实poly(暗许=1)次多项式拟合回归的主旋律曲线是还是不是能代表原始曲线y的市价关键代码,请阅读源代码AbuTLine

如上二〇一四0301-2014040一行使3次拟合曲线即能够象征原始曲线,上面向前推一个月二零一六012八-2015022九:

hsi = get_price('hkHSI', start_date='20160128', end_date='20160229')
tl.AbuTLine(hsi.price, 'HSI').show_least_valid_poly()

ca88亚洲城官网 6

4

如上结果彰显至少须求至少7回以上的拟合才得以代表原始曲线,实际上poly的次数越大,越代表此段周期内波动非常的大,从上可视化图也可清楚看到,上面需求陆次拟合才干表示的市场价格鲜明处于震(Yu Zhen)荡市场价格中。

上面总部方这些论断依靠编写计策基本,计策和事先一贯使用的AbuFactorBuyBreak基本1致,差异的是得以落成fit_month方法(fit_month即在回测计策中每3个月施行一遍的章程),
在fit_month中使用show_least_valid_poly总计本月大盘价格市价的least
poly值,尽管当先一个阀值比方2,就表明最近大盘市场价格震荡,那么就封锁交易,直到在fit_month中计算出的least
poly值小于阀值,解锁交易,代码完毕如下所示:

class AbuSDBreak(AbuFactorBuyXD, BuyCallMixin):
    """示例买入因子: 在AbuFactorBuyBreak基础上进行降低交易频率,提高系统的稳定性处理"""
    def _init_self(self, **kwargs):
        """
        :param kwargs: kwargs可选参数poly值,poly在fit_month中和每一个月大盘计算的poly比较,
        若是大盘的poly大于poly认为走势震荡,poly默认为2
        """
        super(AbuSDBreak, self)._init_self(**kwargs)
        # poly阀值,self.poly在fit_month中和每一个月大盘计算的poly比较,若是大盘的poly大于poly认为走势震荡
        self.poly = kwargs.pop('poly', 2)
        # 是否封锁买入策略进行择时交易
        self.lock = False

    def fit_month(self, today):
        # fit_month即在回测策略中每一个月执行一次的方法
        # 策略中拥有self.benchmark,即交易基准对象,AbuBenchmark实例对象,benchmark.kl_pd即对应的市场大盘走势
        benchmark_df = self.benchmark.kl_pd
        # 拿出大盘的今天
        benchmark_today = benchmark_df[benchmark_df.date == today.date]
        if benchmark_today.empty:
            return 0
        # 要拿大盘最近一个月的走势,准备切片的start,end
        end_key = int(benchmark_today.iloc[0].key)
        start_key = end_key - 20
        if start_key < 0:
            return False

        # 使用切片切出从今天开始向前20天的数据
        benchmark_month = benchmark_df[start_key:end_key + 1]
        # 通过大盘最近一个月的收盘价格做为参数构造AbuTLine对象
        benchmark_month_line = AbuTLine(benchmark_month.close, 'benchmark month line')
        # 计算这个月最少需要几次拟合才能代表走势曲线
        least = benchmark_month_line.show_least_valid_poly(show=False)

        if least >= self.poly:
            # 如果最少的拟合次数大于阀值self.poly,说明走势成立,大盘非震荡走势,解锁交易
            self.lock = False
        else:
            # 如果最少的拟合次数小于阀值self.poly,说明大盘处于震荡走势,封锁策略进行交易
            self.lock = True

    def fit_day(self, today):
        if self.lock:
            # 如果封锁策略进行交易的情况下,策略不进行择时
            return None

        # 今天的收盘价格达到xd天内最高价格则符合买入条件
        if today.close == self.xd_kl.close.max():
            return self.buy_tomorrow()

上面重新组合买入因子字典,使用刚刚编写的买进战术AbuSDBreak,突破周期依然60,4二:

buy_factors = [{'xd': 60, 'class': AbuSDBreak}, 
               {'xd': 42, 'class': AbuSDBreak}]

# 使用run_loop_back运行策略
abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash,
                                                   buy_factors,
                                                   sell_factors,
                                                   choice_symbols=choice_symbols,
                                                   n_folds=6)
AbuMetricsBase.show_general(*abu_result_tuple, only_show_returns=True)

买入后卖出的交易数量:122
买入后尚未卖出的交易数量:3
胜率:61.4754%
平均获利期望:11.5062%
平均亏损期望:-4.7367%
盈亏比:3.9707
策略收益: 91.2822%
基准收益: 18.5928%
策略年化收益: 15.6271%
基准年化收益: 3.1830%
策略买入成交比例:98.4000%
策略资金利用率比例:22.8984%
策略共执行1472个交易日

ca88亚洲城官网 7

直观上的受益曲线变的平缓了些,交易数据减少了就好像40%。

动用AbuSDBreak,降低贸易效能,升高系统的安居管理的回测结果:

  • 购入后卖出的贸易数额:1二三
  • 胜率:60.9756%
  • 平均追求利益期望:1二.358玖%
  • 平均亏折期望:-4.661玖%
  • 盈亏比:4.2144
  • 战术获益: 100.127/拾
  • 规则受益: 1八.592八%
  • 方针年化收益: 1七.14壹三%
  • 标准化年化收益: 叁.1八百分之三十
  • 政策买入成交比例:98.41二7%
  • 宗旨资金利用率比例:22.374二%
  • 计谋共实行1四七十五个交易日

本节时使用AbuFactorBuyBreak的回测结果:

  • 购入后卖出的贸易数额:201
  • 胜率:50.7463%
  • 平均获取利益期望:一叁.261⑨%
  • 平均赔本期望:-伍.912一%
  • 盈亏比:2.6158
  • 战略收益: 玖三.751二%
  • 规则受益: 1捌.5928%
  • 安排年化收益: 1陆.04玖八%
  • 标准化年化收益: 3.1捌十分之三
  • 政策买入成交比例:九一.1765%
  • 宗旨资金利用率比例:3二.3四一成
  • 战略共实践147三个交易日

上边那种增进系统稳定的办法供给在政策增加一些交易规则,阀值进行贸易的筛选过滤,后边的章节会示例使用abupy中ump评判拦截种类,其亮点是:

  1. 不须要在切实政策中硬编码
  2. 不供给人工设定阀值,即且使得代码逻辑清晰
  3. 分离基础计谋和政策优化监督模块,进步灵活度和适配性
  4. 察觉计谋中躲藏的贸易计谋难题
  5. 能够通过不停的学习新的贸易数据(给每三个公判看愈来愈多的比赛录制,升高竞技摄像水准),进步拦截水平

读者可机关行使方面包车型客车AbuSDBreak做为上一节A股回测的国策,重新进行回测,从结果你可以发掘与本节香港股市的回测类似,交易功用降低,交易得逞可能率提升。

贰. 优化计谋,升高系统的安宁

上边包车型客车示范将要突破政策AbuFactorBuyBreak基础上进展降低交易功效,进步系统的牢固性管理。

率先看上面选取AbuTLine.show_least_valid_poly示例,通过get_price获取港股大盘HSI一个月收盘价格数据,然后选择AbuTLine.show_least_valid_poly实行poly判定,它回到的结果是检测至少poly次拟合曲线能够象征原始曲线y的增势,如下所示呈现2回
曲线即能够代表二〇一四0301-二零一六040一那7个月的拟合市场价格,如下所示:

hsi = get_price('hkHSI', start_date='20160301', end_date='20160401')
tl.AbuTLine(hsi.price, 'HSI').show_least_valid_poly()

ca88亚洲城官网 8

1

申明poly(私下认可=一)次多项式拟合回归的来头曲线是或不是能代表原始曲线y的增势关键代码,请阅读源代码AbuTLine

如上2015030一-贰零一4040一行使贰回拟合曲线即能够象征原始曲线,上面向前推半年2014012八-二零一五0229:

hsi = get_price('hkHSI', start_date='20160128', end_date='20160229')
tl.AbuTLine(hsi.price, 'HSI').show_least_valid_poly()

ca88亚洲城官网 9

4

如上结果展现至少必要至少4遍以上的拟合才方可代表原始曲线,实际上poly的次数越大,越代表此段周期内波动比极大,从上可视化图也可清楚看到,下边供给7回拟合才具表示的增势鲜明处于震(Yu Zhen)荡市场价格中。

上面遵照上边那些论断依附编写计谋基本,战术和事先平昔利用的AbuFactorBuyBreak基本等同,差别的是贯彻fit_month方法(fit_month即在回测计谋中每三个月实施叁回的主意),
在fit_month中使用show_least_valid_poly总括前段时期大盘价格汇兑的least
poly值,倘诺超越二个阀值举例二,就印证目前大盘市场价格震荡,那么就封锁交易,直到在fit_month中总计出的least
poly值小于阀值,解锁交易,代码完毕如下所示:

class AbuSDBreak(AbuFactorBuyXD, BuyCallMixin):
    """示例买入因子: 在AbuFactorBuyBreak基础上进行降低交易频率,提高系统的稳定性处理"""
    def _init_self(self, **kwargs):
        """
        :param kwargs: kwargs可选参数poly值,poly在fit_month中和每一个月大盘计算的poly比较,
        若是大盘的poly大于poly认为走势震荡,poly默认为2
        """
        super(AbuSDBreak, self)._init_self(**kwargs)
        # poly阀值,self.poly在fit_month中和每一个月大盘计算的poly比较,若是大盘的poly大于poly认为走势震荡
        self.poly = kwargs.pop('poly', 2)
        # 是否封锁买入策略进行择时交易
        self.lock = False

    def fit_month(self, today):
        # fit_month即在回测策略中每一个月执行一次的方法
        # 策略中拥有self.benchmark,即交易基准对象,AbuBenchmark实例对象,benchmark.kl_pd即对应的市场大盘走势
        benchmark_df = self.benchmark.kl_pd
        # 拿出大盘的今天
        benchmark_today = benchmark_df[benchmark_df.date == today.date]
        if benchmark_today.empty:
            return 0
        # 要拿大盘最近一个月的走势,准备切片的start,end
        end_key = int(benchmark_today.iloc[0].key)
        start_key = end_key - 20
        if start_key < 0:
            return False

        # 使用切片切出从今天开始向前20天的数据
        benchmark_month = benchmark_df[start_key:end_key + 1]
        # 通过大盘最近一个月的收盘价格做为参数构造AbuTLine对象
        benchmark_month_line = AbuTLine(benchmark_month.close, 'benchmark month line')
        # 计算这个月最少需要几次拟合才能代表走势曲线
        least = benchmark_month_line.show_least_valid_poly(show=False)

        if least >= self.poly:
            # 如果最少的拟合次数大于阀值self.poly,说明走势成立,大盘非震荡走势,解锁交易
            self.lock = False
        else:
            # 如果最少的拟合次数小于阀值self.poly,说明大盘处于震荡走势,封锁策略进行交易
            self.lock = True

    def fit_day(self, today):
        if self.lock:
            # 如果封锁策略进行交易的情况下,策略不进行择时
            return None

        # 今天的收盘价格达到xd天内最高价格则符合买入条件
        if today.close == self.xd_kl.close.max():
            return self.buy_tomorrow()

上边重新构成买入因子字典,使用刚刚编写的购买发卖战略AbuSDBreak,突破周期依然60,4二:

buy_factors = [{'xd': 60, 'class': AbuSDBreak}, 
               {'xd': 42, 'class': AbuSDBreak}]

# 使用run_loop_back运行策略
abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash,
                                                   buy_factors,
                                                   sell_factors,
                                                   choice_symbols=choice_symbols,
                                                   n_folds=6)
AbuMetricsBase.show_general(*abu_result_tuple, only_show_returns=True)

买入后卖出的交易数量:122
买入后尚未卖出的交易数量:3
胜率:61.4754%
平均获利期望:11.5062%
平均亏损期望:-4.7367%
盈亏比:3.9707
策略收益: 91.2822%
基准收益: 18.5928%
策略年化收益: 15.6271%
基准年化收益: 3.1830%
策略买入成交比例:98.4000%
策略资金利用率比例:22.8984%
策略共执行1472个交易日

ca88亚洲城官网 10

直观上的收入曲线变的四之日了些,交易数额减小了接近40%。

行使AbuSDBreak,下落贸易效能,进步系统的一帆风顺管理的回测结果:

  • 选购后卖出的交易数额:1二3
  • 胜率:60.9756%
  • 平均追求利益期望:1二.358九%
  • 平均耗损期望:-四.661九%
  • 盈亏比:4.2144
  • 陈设收益: 拾0.1270%
  • 规格收益: 1八.592八%
  • 攻略年化收益: 一7.1四壹三%
  • 标准年化收益: 三.183/十
  • 计划买入成交比例:9八.412七%
  • 战术资金利用率比例:22.374二%
  • 政策共施行147陆个交易日

本节时选择AbuFactorBuyBreak的回测结果:

  • 购置后卖出的贸易数额:20壹
  • 胜率:50.7463%
  • 平均追求利益期望:一三.261玖%
  • 平均亏本期望:-伍.91二壹%
  • 盈亏比:2.6158
  • 计划受益: 九3.751二%
  • 原则收益: 18.592八%
  • 宗旨年化收益: 1陆.04玖8%
  • 基准年化受益: 叁.1捌三成
  • 政策买入成交比例:九壹.1765%
  • 政策资金利用率比例:3二.3410%
  • 布署共实施1四七12个交易日

地点那种增加系统稳固的艺术供给在政策增添一些交易规则,阀值进行交易的筛选过滤,前面包车型大巴章节会示例使用abupy中ump评判拦截系统,其优点是:

  1. 不须求在实际政策中硬编码
  2. 不须求人工设定阀值,即且使得代码逻辑清晰
  3. 暌违基础战术和宗旨优化监督模块,进步灵活度和适配性
  4. 意识计谋中暗藏的交易计策难点
  5. 能够因此不停的读书新的交易数额(给每二个裁定看越来越多的竞赛摄像,升高比赛录制水准),提升拦截水平

读者可活动行使方面包车型客车AbuSDBreak做为上1节A股回测的安插,重新举行回测,从结果你能够开采与本节港股的回测类似,交易效用下降,交易得逞可能率升高。

3 将优化计谋的’计策’做为类装饰器实行包装

在上头说过使用ump模块的帮助和益处有个是:分离基础战术和计划优化监督模块,进步灵活度和适配性,

骨子里上边运用的AbuSDBreak中的优化战略能够封装在贰个装饰器类中,之后编写的有所战略都足以挑选是或不是通过那些类装饰器举行政策优化,代码如下所示:

class AbuLeastPolyWrap(object):
    """
        做为买入因子策略装饰器封装show_least_valid_poly对大盘震荡大的情况下封锁交易
    """

    def __call__(self, cls):
        """只做为买入因子策略类的装饰器"""

        if isinstance(cls, six.class_types):
            # 只做为类装饰器使用

            init_self = cls._init_self
            org_fit_day = cls.fit_day

            # fit_month不是必须实现的
            org_fit_month = getattr(cls, 'fit_month', None)
            def init_self_wrapped(*args, **kwargs):
                # 拿出被装饰的self对象
                warp_self = args[0]
                # 外部可以设置poly阀值,self.poly在fit_month中和每一个月大盘计算的poly比较,
                # 若是大盘的poly大于poly认为走势震荡
                warp_self.poly = kwargs.pop('poly', 2)
                # 是否封锁买入策略进行择时交易
                warp_self.lock = False
                # 调用原始的_init_self
                init_self(*args, **kwargs)

            def fit_day_wrapped(*args, **kwargs):
                # 拿出被装饰的self对象
                warp_self = args[0]
                if warp_self.lock:
                    # 如果封锁策略进行交易的情况下,策略不进行择时
                    return None
                return org_fit_day(*args, **kwargs)

            def fit_month_wrapped(*args, **kwargs):
                warp_self = args[0]
                today = args[1]
                # fit_month即在回测策略中每一个月执行一次的方法
                # 策略中拥有self.benchmark,即交易基准对象,AbuBenchmark实例对象,benchmark.kl_pd即对应的市场大盘走势
                benchmark_df = warp_self.benchmark.kl_pd
                # 拿出大盘的今天
                benchmark_today = benchmark_df[benchmark_df.date == today.date]
                if benchmark_today.empty:
                    return 0
                # 要拿大盘最近一个月的走势,准备切片的start,end
                end_key = int(benchmark_today.ix[0].key)
                start_key = end_key - 20
                if start_key < 0:
                    return 0

                # 使用切片切出从今天开始向前20天的数据
                benchmark_month = benchmark_df[start_key:end_key+1]
                # 通过大盘最近一个月的收盘价格做为参数构造AbuTLine对象
                benchmark_month_line = tl.AbuTLine(benchmark_month.close, 'benchmark month line')
                # 计算这个月最少需要几次拟合才能代表走势曲线
                least = benchmark_month_line.show_least_valid_poly(show=False)

                if least >= warp_self.poly:
                    # 如果最少的拟合次数大于阀值self.poly,说明走势成立,大盘非震荡走势,解锁交易
                    warp_self.lock=False
                else:
                    # 如果最少的拟合次数小于阀值self.poly,说明大盘处于震荡走势,封锁策略进行交易
                    warp_self.lock=True

                if org_fit_month is not None:
                    return org_fit_month(*args, **kwargs)

            cls._init_self = init_self_wrapped
            init_self_wrapped.__name__ = '_init_self'

            cls.fit_day = fit_day_wrapped
            fit_day_wrapped.__name__ = 'fit_day'

            cls.fit_month = fit_month_wrapped
            fit_month_wrapped.__name__ = 'fit_month'

            return cls
        else:
            raise TypeError('AbuLeastPolyWrap just for class warp')

上面编辑三个比非常粗略的陈设,三番五次涨两日就买入股票(stock),示例AbuLeastPolyWrap的使用:

@AbuLeastPolyWrap()
class AbuTwoDayBuy(AbuFactorBuyTD, BuyCallMixin):
    """示例AbuLeastPolyWrap,混入BuyCallMixin,即向上突破触发买入event"""
    def _init_self(self, **kwargs):
        """简单示例什么都不编写了"""
        pass

    def fit_day(self, today):
        """
        针对每一个交易日拟合买入交易策略,今天涨,昨天涨就买
        :param today: 当前驱动的交易日金融时间序列数据
        :return:
        """
        # 今天的涨幅
        td_change = today.p_change
        # 昨天的涨幅
        yd_change = self.yesterday.p_change

        if td_change > 0 and 0 < yd_change < td_change:
            # 连续涨两天, 且今天的涨幅比昨天还高 ->买入, 用到了今天的涨幅,只能明天买
            return self.buy_tomorrow()
        return None

如下通过字典装载买入因子,只行使AbuTwoDayBuy1个购入因子,字典中设定poly=二,
即多于一遍拟合的趋向都感到大盘是处在震荡市价,封锁交易行为,因为基础战术AbuTwoDayBuy中的实现属于频仍购买战略,所以AbuLeastPolyWrap装饰器装饰那个政策的目的就是决定下跌贸易功效,提过牢固性。

备考: 读者可尝试切换poly值1-肆来进展回测,查看回测效果

buy_factors = [{'class': AbuTwoDayBuy, 'poly': 2}]

最后依然选用abu.run_loop_back对交易进行回测:

abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash,
                                                   buy_factors,
                                                   sell_factors,
                                                   choice_symbols=choice_symbols,
                                                   n_folds=6)
AbuMetricsBase.show_general(*abu_result_tuple, only_show_returns=True)

买入后卖出的交易数量:598
买入后尚未卖出的交易数量:13
胜率:47.6589%
平均获利期望:12.2090%
平均亏损期望:-7.2464%
盈亏比:1.7095
策略收益: 108.1026%
基准收益: 18.5928%
策略年化收益: 18.5067%
基准年化收益: 3.1830%
策略买入成交比例:55.3191%
策略资金利用率比例:49.3860%
策略共执行1472个交易日

ca88亚洲城官网 11

能够见见AbuTwoDayBuy那个政策有多么轻巧以至简陋,不过合作AbuLeastPolyWrap进行回测的职能也还是可以。

粗略的基本功战术是最棒的,轻易攻略和复杂战略输出的都只是如曾几何时候买,曾几何时卖。

基础战略追求的就应当是归纳(能够一句话表明您的底蕴计策),不要刻意追求复杂的政策,对量化计策战败结果的人为分析,通过外层支持优化计谋,教导政策,让政策本人实行学习,自己调解才是应当追求复杂的地点。

在《量化交易之路》中反复重申:投资的指标必要有三个比较可信赖的预计结果,投机的靶子是收获交易可能率优势,量化交易更赞成于投机范畴,预测肯定了强烈,可能率优势不须要一定鲜明性,对明明认知的出入导致交易者最后的交易行为产生根本差异,复杂的国策和轻易的计划都对应着概率优势,不过对于计谋本人复杂的政策并不一定比简单的计策有效。

对此香港股市交易还有四个针锋相对别的市镇非常的地点,即每手的数量,A股市集每手的数目是定值100,美国股票1股也得以购销,香港股市是每3个交易项目都有和好相应的每手数量,上面采取AbuHkUnit对每手数量进行询问:

unit = AbuHkUnit()
{symbol: unit.query_unit(symbol) for symbol in choice_symbols}

{'hk00656': 500,
 'hk00700': 100,
 'hk01359': 1000,
 'hk02318': 500,
 'hk02333': 500,
 'hk03333': 1000,
 'hk03888': 1000}

可以看到每3个期货(Futures)的unit都是例外的,在abupy内部会基于资金管理总计出来的购买数量和相应股票的unit进行对照,不满意一手的不可能拍板,其它市镇的落实也近乎。

三 将优化攻略的’战略’做为类装饰器举行打包

在上头说过使用ump模块的助益有个是:分离基础战略和政策优化监督模块,进步灵活度和适配性,

实则下边使用的AbuSDBreak中的优化攻略能够封装在八个装饰器类中,之后编写的具备计谋都得以选用是或不是经过那么些类装饰器实行政策优化,代码如下所示:

class AbuLeastPolyWrap(object):
    """
        做为买入因子策略装饰器封装show_least_valid_poly对大盘震荡大的情况下封锁交易
    """

    def __call__(self, cls):
        """只做为买入因子策略类的装饰器"""

        if isinstance(cls, six.class_types):
            # 只做为类装饰器使用

            init_self = cls._init_self
            org_fit_day = cls.fit_day

            # fit_month不是必须实现的
            org_fit_month = getattr(cls, 'fit_month', None)
            def init_self_wrapped(*args, **kwargs):
                # 拿出被装饰的self对象
                warp_self = args[0]
                # 外部可以设置poly阀值,self.poly在fit_month中和每一个月大盘计算的poly比较,
                # 若是大盘的poly大于poly认为走势震荡
                warp_self.poly = kwargs.pop('poly', 2)
                # 是否封锁买入策略进行择时交易
                warp_self.lock = False
                # 调用原始的_init_self
                init_self(*args, **kwargs)

            def fit_day_wrapped(*args, **kwargs):
                # 拿出被装饰的self对象
                warp_self = args[0]
                if warp_self.lock:
                    # 如果封锁策略进行交易的情况下,策略不进行择时
                    return None
                return org_fit_day(*args, **kwargs)

            def fit_month_wrapped(*args, **kwargs):
                warp_self = args[0]
                today = args[1]
                # fit_month即在回测策略中每一个月执行一次的方法
                # 策略中拥有self.benchmark,即交易基准对象,AbuBenchmark实例对象,benchmark.kl_pd即对应的市场大盘走势
                benchmark_df = warp_self.benchmark.kl_pd
                # 拿出大盘的今天
                benchmark_today = benchmark_df[benchmark_df.date == today.date]
                if benchmark_today.empty:
                    return 0
                # 要拿大盘最近一个月的走势,准备切片的start,end
                end_key = int(benchmark_today.ix[0].key)
                start_key = end_key - 20
                if start_key < 0:
                    return 0

                # 使用切片切出从今天开始向前20天的数据
                benchmark_month = benchmark_df[start_key:end_key+1]
                # 通过大盘最近一个月的收盘价格做为参数构造AbuTLine对象
                benchmark_month_line = tl.AbuTLine(benchmark_month.close, 'benchmark month line')
                # 计算这个月最少需要几次拟合才能代表走势曲线
                least = benchmark_month_line.show_least_valid_poly(show=False)

                if least >= warp_self.poly:
                    # 如果最少的拟合次数大于阀值self.poly,说明走势成立,大盘非震荡走势,解锁交易
                    warp_self.lock=False
                else:
                    # 如果最少的拟合次数小于阀值self.poly,说明大盘处于震荡走势,封锁策略进行交易
                    warp_self.lock=True

                if org_fit_month is not None:
                    return org_fit_month(*args, **kwargs)

            cls._init_self = init_self_wrapped
            init_self_wrapped.__name__ = '_init_self'

            cls.fit_day = fit_day_wrapped
            fit_day_wrapped.__name__ = 'fit_day'

            cls.fit_month = fit_month_wrapped
            fit_month_wrapped.__name__ = 'fit_month'

            return cls
        else:
            raise TypeError('AbuLeastPolyWrap just for class warp')

上边编辑一个很轻易的国策,一而再涨二日就买入证券,示例AbuLeastPolyWrap的采取:

@AbuLeastPolyWrap()
class AbuTwoDayBuy(AbuFactorBuyTD, BuyCallMixin):
    """示例AbuLeastPolyWrap,混入BuyCallMixin,即向上突破触发买入event"""
    def _init_self(self, **kwargs):
        """简单示例什么都不编写了"""
        pass

    def fit_day(self, today):
        """
        针对每一个交易日拟合买入交易策略,今天涨,昨天涨就买
        :param today: 当前驱动的交易日金融时间序列数据
        :return:
        """
        # 今天的涨幅
        td_change = today.p_change
        # 昨天的涨幅
        yd_change = self.yesterday.p_change

        if td_change > 0 and 0 < yd_change < td_change:
            # 连续涨两天, 且今天的涨幅比昨天还高 ->买入, 用到了今天的涨幅,只能明天买
            return self.buy_tomorrow()
        return None

如下通过字典装载买入因子,只利用AbuTwoDayBuy三个购得因子,字典中设定poly=2,
即多于1回拟合的大势都认为大盘是居于震先生荡行情,封锁交易作为,因为基础计谋AbuTwoDayBuy中的落成属于频仍购买战略,所以AbuLeastPolyWrap装饰器装饰这些政策的目的正是决定降低贸易效用,提过牢固性。

备注: 读者可尝试切换poly值一-4来开展回测,查看回测效果

buy_factors = [{'class': AbuTwoDayBuy, 'poly': 2}]

最后还是采用abu.run_loop_back对交易进行回测:

abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash,
                                                   buy_factors,
                                                   sell_factors,
                                                   choice_symbols=choice_symbols,
                                                   n_folds=6)
AbuMetricsBase.show_general(*abu_result_tuple, only_show_returns=True)

买入后卖出的交易数量:598
买入后尚未卖出的交易数量:13
胜率:47.6589%
平均获利期望:12.2090%
平均亏损期望:-7.2464%
盈亏比:1.7095
策略收益: 108.1026%
基准收益: 18.5928%
策略年化收益: 18.5067%
基准年化收益: 3.1830%
策略买入成交比例:55.3191%
策略资金利用率比例:49.3860%
策略共执行1472个交易日

ca88亚洲城官网 12

能够观察AbuTwoDayBuy那几个计策有多么轻巧以至简陋,但是同盟AbuLeastPolyWrap举办回测的魔法也还足以。

轻便的底蕴计策是最棒的,简单战术和错综复杂计谋输出的都只是几时买,哪一天卖。

基本功攻略追求的就应有是粗略(能够一句话表达您的根基计谋),不要刻意追求复杂的政策,对量化计策失利结果的人工分析,通过外层扶助优化计策,指点政策,让政策自个儿实行学习,自己调度才是理所应当追求复杂的位置。

在《量化交易之路》中反复重申:投资的对象须要有三个相比较标准的预测结果,投机的靶子是收获交易概率优势,量化交易更赞成于投机范畴,预测肯定了醒目,可能率优势不需求一定分明性,对明明认知的差距导致交易者最终的交易作为发出根本不一致,复杂的宗旨和精炼的方针都对应着可能率优势,但是对于战略自个儿复杂的计策并不一定比轻松的计谋有效。

对于香港股市交易还有一个针锋相对其余市镇非凡的地点,即每手的数额,A股票市镇场每手的多少是定值100,美国期货(Futures)一股也足以购买发卖,香港股市是每二个贸易项目都有谈得来相应的每手数量,下边选拔AbuHkUnit对每手数量进行询问:

unit = AbuHkUnit()
{symbol: unit.query_unit(symbol) for symbol in choice_symbols}

{'hk00656': 500,
 'hk00700': 100,
 'hk01359': 1000,
 'hk02318': 500,
 'hk02333': 500,
 'hk03333': 1000,
 'hk03888': 1000}

能够见见每叁个股票的unit都以例外的,在abupy内部会基于开支管理计算出来的购买数量和呼应股票(stock)的unit举行对照,不知足一手的不可能成交,其余市镇的得以完结也就像。

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

ca88亚洲城官网 13

abu量化文书档案目录章节

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

ca88亚洲城官网 14

相关文章