设为首页 加入收藏

TOP

量化投资:第3节 滑点策略与交易手续费(二)
2017-10-19 09:21:36 】 浏览:879
Tags:量化 投资 滑点 策略 交易 手续费
n' in kwargs: self.losses_mean = kwargs['losses_mean'] self._init_self(**kwargs)

之后因子在每次生效产生买单的时候会触发AbuOrder实例对象的fit_buy_order()函数,fit_buy_order()中将滑点类,仓位管理类实例化后,执行买入价格及数量确定,代码片段如下所示,详情请查看源代码。

def fit_buy_order(self, day_ind, factor_object):
    kl_pd = factor_object.kl_pd
    # 要执行买入当天的数据
    kl_pd_buy = kl_pd.iloc[day_ind + 1]
    # 买入因子名称
    factor_name = factor_object.factor_name \
        if hasattr(factor_object, 'factor_name') else 'unknown'
    # 滑点类设置
    slippage_class = factor_object.slippage_class
    # 仓位管理类设置
    position_class = factor_object.position_class
    # 初始资金,也可修改策略使用剩余资金
    read_cash = factor_object.capital.read_cash
    # 实例化滑点类
    fact = slippage_class(kl_pd_buy, factor_name)
    # 执行fit_price(), 计算出买入价格
    bp = fact.fit_price()
    # 如果滑点类中决定不买入,撤单子,bp就返回正无穷
    if bp < np.inf:
        # 实例化仓位管理类
        position = position_class(kl_pd_buy, factor_name, bp, 
                                  read_cash)
        # 执行fit_position(),通过仓位管理计算买入的数量
        buy_stock_cnt = int(position.fit_position(factor_object))
        if buy_stock_cnt < 1:
            return

卖出因子的滑点操作及仓位管理与买入类似,读者可以自行阅读源代码。

由以上代码我们可以发现通过buy_factors的字典对象中传入slippage便可以自行设置滑点类,由于上图显示的交易是60日突破产生的买单,所以我们只修改60日突破的字典对象,执行后可以看到如下图所示,过滤了两个60日突破的买单,即过滤了上图所示的交易,代码如下所示:

备注:实际上如果只是修改g_open_down_rate的值,可以通过模块全局变量直接修改,本节只为示例使用流程

# 针对60使用AbuSlippageBuyMean2
buy_factors2 = [{'slippage': AbuSlippageBuyMean2, 'xd': 60,
                 'class': AbuFactorBuyBreak},
                {'xd': 42, 'class': AbuFactorBuyBreak}]
capital = AbuCapital(1000000, benchmark)
orders_pd, action_pd, _ = ABuPickTimeExecute.do_symbols_with_same_factors(['usTSLA'],
                                                                            benchmark,
                                                                            buy_factors2,
                                                                            sell_factors,
                                                                            capital,
                                                                            show=True)

2. 交易手续费的计算以及自定义手续费

交易必然会产生手续费,手续费的计算在ABuCommission模块中,比如本例中使用的的美股交易回测,使用的手续费计算代码如下所示:

def calc_commission_us(trade_cnt, price):
    """
    美股计算交易费用:每股0.01,最低消费2.99
    :param trade_cnt: 交易的股数(int)
    :param price: 每股的价格(美元)(暂不使用,只是保持接口统一)
    :return: 计算结果手续费
    """
    # 每股手续费0.01
    commission = trade_cnt * 0.01
    if commission < 2.99:
        # 最低消费2.99
        commission = 2.99
    return commission
    

针对不同市场美股,a股,港股,比特币,期货有不同计算手续费的方法,更多详情请阅读ABuCommission模块源代码

下面先看看之前的回测交易中产生的手续费情况,查看代码如下所示:

capital.commission.commission_df

如果你想把自己的计算手续费的方法使用在回测中,只需要编写手续费函数,示例如下所示:

def calc_commission_us2(trade_cnt, price):
    """
 手续费统一7美元
 """
    return 7

如上编写的手续费函数统一每次买入卖出都是7美元手续费,手续费函数有两个参数一个trade_cnt代表买入(卖出)股数,
另一个参数是price,代表买入(卖出)价格,下面使用这个自定义的手续费方法做回测,代码如下所示:

# 构造一个字典key='buy_commission_func', value=自定义的手续费方法函数
commission_dict = {'buy_commission_func': calc_commission_us2}
# 将commission_dict做为参数传入AbuCapital
capital = AbuCapital(1000000, benchmark, user_commission_dict=commission_dict)
# 除了手续费自定义外,回测其它设置不变,show=False不可视化回测交易
orders_pd, action_pd, _ = ABuPickTimeExecute.do_symbols_with_same_factors(['usTSLA'],
                                                                            benchmark,
                                                                            buy_factors2,
                                                                            sell_factors,
                                                                            capital,
                                                                            show=False)
# 回测完成后查看手续费情况
capital.commission.commission_df

从上面回测交易手续费结果可以看到,买入的手续费都变成了7元,卖出手续费还是之前的算法,下面的回测将买入卖出手续费计算方法都变成使用自定义的方法,代码如下所示:

# 卖出字典key='sell_commission_func', 指向同一个手续费方法,当然也可以定义不同的方法
commission_dict = {'buy_commission_func': calc_commission_us2, 'sell_commission_func': calc_commission_us2}
# 将commission_dict做为参数传入AbuCapital
capital = AbuCapital(1000000, benchmark, user_commission_dict=commission_dict)
# 除了
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇python爬取安居客二手房网站数据 下一篇自动化测试基础篇--Selenium多窗..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目