设为首页 加入收藏

TOP

量化投资:第3节 滑点策略与交易手续费(一)
2017-10-19 09:21:36 】 浏览:878
Tags:量化 投资 滑点 策略 交易 手续费

作者: 阿布

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

abu量化系统github地址(欢迎+star,你的支持是我更新的动力!)

本节ipython notebook

上一节使用AbuFactorBuyBreak和AbuFactorSellBreak且混入基本止盈止损策略AbuFactorAtrNStop,
风险控制止损策略AbuFactorPreAtrNStop,利润保护止盈策略AbuFactorCloseAtrNStop来提高交易的盈利效果。

本节将继续在上一节回测的基础上示例择时策略其它使用方法,首先完成上一节的回测准备,如下所示:

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)

1 滑点买入卖出价格确定及策略实现

第一节中实现的买入策略和卖出策略的编写,买入策略中确定买入只是通过make_buy_order函数,确定买单生成,卖出策略确定卖出订单
也只是通过fit_sell_order来提交卖单,那么执行订单,应该使用的什么价格买入或者卖出呢,abupy在默认的策略都是使用当天的均价买入卖出,

当然你可以实现多种复杂的当日交易策略,设置限价单、市价单,获取当日的分时数据再次进行策略分析执行操作,但是如果你的回测数量足够多的情况下,比如全市场回测,按照大数定理,这个均值执行其实是最好的模拟,而且简单、运行速度快。

滑点买入卖出价格确定具体实现代码请阅读AbuSlippageBuyMean和AbuSlippageSellMean,它们的实现都很简单

在买入滑点AbuSlippageBuyMean中有一个小策略当当天开盘价格直接下探7%时,放弃买单,看上一节回测结果中如下图这次交易,从图上就可以发现虽然是突破买入,但明显第二天执行买单时的价格是直线下跌的,且下跌不少,但还是成交了这笔交易。因为开盘下跌幅度没有达到7%的阀值,下面我们就过拟合这次交易避免买入,只为示例

下面编写一个独立的Slippage策略,只简单修改g_open_down_rate的值为0.02

from abupy import AbuSlippageBuyBase, slippage
# 修改买入下跌阀值为0.02
g_open_down_rate = 0.02

class AbuSlippageBuyMean2(AbuSlippageBuyBase):
    """示例日内滑点均价买入类"""

    @slippage.sbb.slippage_limit_up
    def fit_price(self):
        """
 取当天交易日的最高最低均价做为决策价格
 :return: 最终决策的当前交易买入价格
 """
        # TODO 基类提取作为装饰器函数,子类根据需要选择是否装饰,并且添加上根据order的call,put明确细节逻辑
        if self.kl_pd_buy.pre_close == 0 or (self.kl_pd_buy.open / self.kl_pd_buy.pre_close) < (1 - g_open_down_rate):
            # 开盘就下跌一定比例阀值,放弃单子
            return np.inf
        # 买入价格为当天均价,即最高,最低的平均,也可使用高开低收平均等方式计算
        self.buy_price = np.mean([self.kl_pd_buy['high'], self.kl_pd_buy['low']])
        # 返回最终的决策价格
        return self.buy_price

上面编写的AbuSlippageBuyMean2类实现即为滑点买入类的实现:

  1. 滑点买入类需要继承自AbuSlippageBuyBase
  2. 滑点买入类需要实现fit_price来确定交易单执行当日的最终买入价格
  3. slippage_limit_up装饰器是针对a股涨停板买入价格决策的装饰器,处理买入成功概率,根据概率决定是否能买入,及涨停下的买入价格决策,涨停下买入价格模型为,越靠近涨停价格买入成交概率越大,即在涨停下预期以靠近涨停价格买入,

备注:slippage_limit_up及slippage_limit_down具体实现可阅读源代码,后面的章节有示例演示使用

但是滑点类时什么时候被实例化使用的呢,怎么使用我们自己写的这个滑点类呢?首先看买入因子基类AbuFactorBuyBase,在每个买入因子初始化的时候即把默认的滑点类以及仓位管理类(稍后讲解)赋值,如下片段代码所示:

详情请查看AbuFactorBuyBas源代码

class AbuFactorBuyBase(six.with_metaclass(ABCMeta, ABuParamBaseClass)):
    def __init__(self, capital, kl_pd, **kwargs):
        # 走势数据
        self.kl_pd = kl_pd
        # 资金情况数据
        self.capital = capital
        # 滑点类,默认AbuSlippageBuyMean
        self.slippage_class = kwargs['slippage'] \
            if 'slippage' in kwargs else AbuSlippageBuyMean
        # 仓位管理,默认AbuAtrPosition
        self.position_class = kwargs['position'] \
            if 'position' in kwargs else AbuAtrPosition
        if 'win_rate' in kwargs:
            self.win_rate = kwargs['win_rate']
        if 'gains_mean' in kwargs:
            self.gains_mean = kwargs['gains_mean']
        if 'losses_mea
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇python爬取安居客二手房网站数据 下一篇自动化测试基础篇--Selenium多窗..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目