abu量化系统github地址(应接+star),本节疏解港股票市场场的回测示例

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

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

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

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

本节ipython
notebook

本节ipython
notebook

上1节疏解的是A股票集镇场的回测,本节讲明香港股市票百货店场的回测示例。

上1节讲授的是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)池使用沙盒缓存数据中的如下股票:

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

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

香港股市票市廛场:

  • 中夏族民共和国恒大(hk0333三)
  • Tencent控制股份(hk00700)
  • 长城汽车(hk0233③)
  • 华夏信达(hk0135玖)
  • ca88亚洲城官网,复星国际(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亚洲城官网 1

从上收入曲线能够见见在大致在二〇一六年上旬的有1遍受益猛烈的拉升出现,下边输出top10笔收益,代码如下所示:

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

从出口可以清楚的来看,top三的高收入交易都发出在20一伍年二月份购买,十月份卖掉,3笔受益都充裕高。

结缘HSI基准在三-10月以内也有三个拉升,那里的获益曲线猛烈拉升也能够知晓了。

洋洋时候编写出1个政策后意识预期收益相当高,遭受这么的状态,借使你是认真的,那就应当思索怎么下落收益,降低的不可是收入也是高风险,对应的进步的将是系统的安定团结。

怎么着才具下跌危害,升高牢固性,比如下边包车型客车回测,是还是不是要把三-五月份本次受益猛烈的拉升滤除才叫降低风险吗?

自然不是,下边包车型大巴3-3月份拉升受益是因时制宜的受益,借使要把那段过滤将是逆势行为。

降落危机是还是不是索要通过买对冲来达成?

实质上也不建议个人投资者买对冲,因为对冲的制品一般都以和岁月相关的,比方期货合作选择权,股票(stock),扩张三个光阴维度会将1切交易复杂度提高多少个数据级,并不建议一般交易者举办那种对冲,特别是以股票(stock)为第壹投资目标的相似交易者(不过能够在方针中做一样档案的次序的相关性对冲,在现在的章节会有成就相关性战术示例)。

自家感觉最符合一般投资者的的提升稳固性的不二等秘书籍正是下降贸易功效,举例ump评判拦截,主要就是经过学习计谋中的战败交易,从差异角度开始展览学习贸易特点,指引决策拦截交易,拦截了多量的交易能够节省佣金,更器重的意思在于边裁防止了重大的高风险。

本节上课在不思量使用ump系统的景色下,示比如何通过硬编码攻略来下滑交易功效,进步系统的稳固性。

香港股市票商场场:

  • 中中原人民共和国恒大(hk03333)
  • 腾讯控制股份(hk00700)
  • 长城小车(hk0233三)
  • 华夏信达(hk0135玖)
  • 复星国际(hk0065陆)
  • 金山软件(hk0388八)
  • 神州鹰潭(hk02318)
  • 恒生指数(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伍年上旬的有三遍收益猛烈的拉升出现,下边输出top10笔受益,代码如下所示:

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壹伍年二月份购入,七月份卖出,三笔收益都非常高。

整合HSI基准在叁-二月以内也有3个拉升,那里的低收入曲线猛烈拉升也能够领会了。

多多时候编写出二个政策后意识预期收益相当高,蒙受那样的情形,假诺你是当真的,那就应当思虑怎么下落受益,下落的不不过收入也是高危机,对应的增高的将是系统的安澜。

怎么样才能下降危害,提升稳固性,比方上边的回测,是否要把3-4月份此番受益猛烈的拉升滤除才叫降低危机吗?

本来不是,下面的三-十二月份拉升收益是相机行事的纯收入,倘诺要把那段过滤将是逆势行为。

降落危害是否亟需通过买对冲来达成?

骨子里也不提议个人投资者买对冲,因为对冲的制品一般都是和时间相关的,比方期货合作选择权,证券,扩大三个时辰维度会将整个交易复杂度进步多少个数据级,并不建议一般交易者实行那种对冲,尤其是以证券为机要投资对象的形似交易者(可是足以在政策中做一样类别的相关性对冲,在随后的章节会有形成相关性战术示例)。

本人觉着最适合一般投资者的的拉长牢固性的不二等秘书籍正是下落交易效用,比如ump评判拦截,重要就是通过学习战术中的退步交易,从不一致角度展开学习贸易特点,指引决策拦截交易,拦截了大批量的交易能够节约佣金,更首要的含义在于边裁防止了重在的高危害。

本节教师在不思虑使用ump系统的情事下,示举例何通过硬编码战略来下降贸易成效,升高系统的安居。

二. 优化计谋,升高系统的平静

上边包车型大巴言传身教就要突破政策AbuFactorBuyBreak基础上拓展下跌交易作用,升高系统的一路顺风管理。

先是看上边选用AbuTLine.show_least_valid_poly示例,通过get_price获取港股大盘HSI三个月收盘价格数据,然后使用AbuTLine.show_least_valid_poly举办poly判定,它回到的结果是检测至少poly次拟合曲线能够代表原始曲线y的涨势,如下所示展现一回
曲线即可以表示2015030一-贰零一四040一那八个月的拟合市价,如下所示:

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

ca88亚洲城官网 5

1

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

如上2014030一-二零一五0401使用3遍拟合曲线即能够象征原始曲线,下面向前推1个月二〇一五012八-二零一五022九:

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

ca88亚洲城官网 6

4

如上结果呈现至少供给至少伍回以上的拟合才可以代表原始曲线,实际上poly的次数越大,越代表此段周期内波动异常的大,从上可视化图也可清楚看到,上面要求陆遍拟合才具表示的市场价格明显处于震(英文名:yú zhèn)荡汇兑中。

下边根据地方那么些论断依赖编写计策基本,计策和前边一直使用的AbuFactorBuyBreak基本一致,分裂的是促成fit_month方法(fit_month即在回测战略中每二个月实施壹回的主意),
在fit_month中使用show_least_valid_poly总括下个月大盘价格涨势的least
poly值,假如高出1个阀值比如二,就认证近来大盘市场价格震荡,那么就封锁交易,直到在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%
  • 平均渔利期望:12.3589%
  • 平均亏本期望:-四.661玖%
  • 盈亏比:4.2144
  • 宗旨收益: 100.1270%
  • 规范化收益: 1八.592八%
  • 政策年化受益: 一七.14一3%
  • 规则年化收益: 3.183/10
  • 战略买入成交比例:九八.41二柒%
  • 计策资金利用率比例:2二.3742%
  • 政策共施行1四712个交易日

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

  • 购买贩卖后卖出的贸易数据:20一
  • 胜率:50.7463%
  • 平均获取利益期望:1叁.261九%
  • 平均耗损期望:-5.91二壹%
  • 盈亏比:2.6158
  • 政策受益: 九叁.751贰%
  • 典型化收益: 1八.5928%
  • 攻略年化受益: 1陆.04玖八%
  • 标准年化收益: 3.1捌三成
  • 安插买入成交比例:玖一.17陆伍%
  • 计策资金利用率比例:3二.3肆百分之拾
  • 政策共实行14柒拾5个交易日

地点那种增加系统稳固的诀窍供给在安排增多一些交易规则,阀值进行交易的筛选过滤,前边的章节会示例使用abupy中ump评判拦截系统,其独到之处是:

  1. 不供给在现实政策中硬编码
  2. 不必要人工设定阀值,即且使得代码逻辑清晰
  3. 分别基础战术和安插优化监督模块,提升灵活度和适配性
  4. 发觉战术中隐藏的交易战略难点
  5. 能够经过不断的学习新的贸易数额(给每二个宣判看越多的比赛录制,升高竞赛摄像水准),升高拦截水平

读者可自动行使方面包车型地铁AbuSDBreak做为上一节A股回测的国策,重新实行回测,从结果你可以窥见与本节香港股市的回测类似,交易功用降低,交易成功可能率提升。

二. 优化计策,进步系统的安居乐业

上边包车型客车示范将要突破政策AbuFactorBuyBreak基础上实行下落交易功用,提升系统的安定团结管理。

率先看上边选拔AbuTLine.show_least_valid_poly示例,通过get_price获取香港股市大盘HSI5个月收盘价格数据,然后使用AbuTLine.show_least_valid_poly进行poly决断,它回到的结果是检查评定至少poly次拟合曲线可以代表原始曲线y的涨势,如下所示呈现2次
曲线即能够表示二零一五0301-二零一四040一那五个月的拟合汇兑,如下所示:

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

如上二〇一六030一-20150401运用2次拟合曲线就能够以表示原始曲线,上面向前推半年二〇一五0128-二〇一四022九:

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

ca88亚洲城官网 9

4

如上结果展现至少需求至少4回以上的拟合才能够象征原始曲线,实际上poly的次数越大,越代表此段周期内波动不小,从上可视化图也可清晰看出,上面要求柒回拟合本事代表的增势分明处于震(Yu Zhen)荡行情中。

上面依据下边那几个论断依赖编写攻略基本,攻略和事先一向利用的AbuFactorBuyBreak基本均等,不一样的是促成fit_month方法(fit_month即在回测攻略中每六个月施行1次的格局),
在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二三
  • 胜率:60.9756%
  • 平均贪图利益期望:1二.358九%
  • 平均亏本期望:-肆.661玖%
  • 盈亏比:4.2144
  • 宗旨收益: 100.12十二分7
  • 基准收益: 18.592八%
  • 政策年化受益: 一7.141三%
  • 标准化年化收益: 三.1八十分三
  • 布署买入成交比例:玖八.41二7%
  • 方针资金利用率比例:2二.374贰%
  • 计策共实行14710个交易日

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

  • 购买后卖出的贸易数额:20壹
  • 胜率:50.7463%
  • 平均渔利期望:一三.2619%
  • 平均赔本期望:-伍.91二一%
  • 盈亏比:2.6158
  • 战略受益: 九3.751贰%
  • 标准收益: 18.5928%
  • 宗旨年化收益: 1陆.04九8%
  • 规格年化受益: 三.1八百分之三十
  • 政策买入成交比例:九壹.17陆五%
  • 安顿资金利用率比例:3贰.34百分之10
  • 宗旨共实施1四七10四个交易日

上边这种拉长系统稳固的办法要求在战术增多一些交易规则,阀值实行贸易的筛选过滤,前面包车型大巴章节会示例使用abupy中ump评判拦截种类,其优点是:

  1. 不须要在现实战术中硬编码
  2. 不需求人工设定阀值,即且使得代码逻辑清晰
  3. 告辞基础战术和计策优化监督模块,升高灵活度和适配性
  4. 发觉计策中潜藏的贸易计策难题
  5. 能够经过不停的就学新的贸易数额(给每1个裁定看更多的交锋摄像,升高竞赛录制水准),进步拦截水平

读者可自动行使方面包车型地铁AbuSDBreak做为上壹节A股回测的战术,重新开始展览回测,从结果你能够窥见与本节香港股市的回测类似,交易效用下落,交易成功概率提升。

3 将优化战术的’攻略’做为类装饰器进行包装

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

实质上上边运用的AbuSDBreak中的优化计策能够封装在1个装饰器类中,之后编写的具备计谋都能够挑选是还是不是经过那一个类装饰器进行政策优化,代码如下所示:

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遍拟合的倾向都是为大盘是处在震荡汇兑,封锁交易行为,因为基础计策AbuTwoDayBuy中的达成属于频仍购买战略,所以AbuLeastPolyWrap装饰器装饰那个宗旨的目标正是调整下跌交易功能,提过稳固性。

备考: 读者可尝试切换poly值壹-四来开始展览回测,查看回测效果

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股票市镇场每手的多少是定值十0,美国期货(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}

能够见见每一个股票(stock)的unit都是见仁见智的,在abupy内部会依赖开销管理总计出来的买入数量和呼应期货(Futures)的unit举行相比,不满意一手的不可能拍板,其余市4的贯彻也就像。

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

在上头说过使用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')

上边编辑3个很简短的国策,接二连三涨二日就买卖买股票票(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=二,
即多于三回拟合的矛头都觉着大盘是居于震(Yu Zhen)荡市场价格,封锁交易行为,因为基础计策AbuTwoDayBuy中的达成属于频仍购买战术,所以AbuLeastPolyWrap装饰器装饰这几个宗旨的目的就是决定下跌交易作用,提过稳定性。

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

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实行回测的功效也还足以。

大致的基本功战略是最佳的,轻松计策和复杂战略输出的都只是何许时候买,哪一天卖。

基础战术追求的就应有是简约(能够一句话表达你的基础战略),不要刻意追求复杂的计谋,对量化攻略战败结果的人工分析,通过外层援救优化攻略,教导安顿,让政策自身进行学习,自己调度才是理所应当追求复杂的地点。

在《量化交易之路》中反复重申:投资的对象供给有2个相比规范的展望结果,投机的靶子是收获交易概率优势,量化交易更赞成于投机范畴,预测确定了醒目,可能率优势不要求确定显著性,对同理可得认知的出入导致交易者最后的交易行为时有产生根本差距,复杂的政策和轻巧的战术都对应着可能率优势,可是对于攻略本人复杂的安排并不一定比轻易的宗旨有效。

对于香港股市交易还有贰个相对其余市四独特的地点,即每手的多少,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}

可以观察每3个股票(stock)的unit都是不相同的,在abupy内部会依据资金处理总结出来的购置数量和相应证券的unit举行自己检查自纠,不满足一手的不可能成交,此外商城的得以落成也近乎。

abu量化文书档案目录章节

  1. 择时计谋的付出
  2. 择时战术的优化
  3. 滑点计策与交易手续费
  4. 多支股票(stock)择时回测与仓位管理
  5. 选股计策的支付
  6. 回测结果的心地
  7. 探寻政策最优参数和评分
  8. A股票市集场的回测
  9. 香港股市商铺的回测
  10. 比特币,赖特币的回测
  11. 期货(Futures)集镇的回测
  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. 多支股票(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

ca88亚洲城官网 14