backtrader框架学习:交易配置篇

  • Post author:
  • Post category:其他


原创文章第72篇,专注“个人成长与财富自由、世界运作的逻辑, AI量化投资”。


backtrader最大的优点,它是面向交易的。

市面上很多开源的框架,更像是学术的,面向研究和学习的。离生产环境还比较远,包括qlib。

国内的vnpy算是功能完善度比较高的,口号是“by traders, for traders”,大致就是这样的目标,但vnpy的代码有点重,安装和使用较复杂。


01 交易条件

交易条件的设置要尽可能“高度模拟”真实交易场景。交易条件设置,最常见的有初始资金、交易税费、滑点、期货保证金比率等。对成交量做限制、对涨跌幅做限制、对订单生成和执行时机做限制。交易条件可以通过 Broker来管理

方式1:通过设置backtrader.brokers.BackBroker() 类中的参数,生成新的broker实例,再将新的实例赋值给cerebro.broker ;

方式2:通过调用broker中的”set_xxx“ 方法来修改条件,还可通过”get_xxx“ 方法查看当前设置的条件取值。

一般推荐使用方式2:

def next(self):
    print('当前可用资金', self.broker.getcash())
    print('当前总资产', self.broker.getvalue())
    print('当前持仓量', self.broker.getposition(self.data).size)
    print('当前持仓成本', self.broker.getposition(self.data).price)
    # 也可以直接获取持仓
    print('当前持仓量', self.getposition(self.data).size)
    print('当前持仓成本', self.getposition(self.data).price)


02 滑点

一般滑点在所难免,由于网络延时、市场波动等原因。

滑点分为百分比、固定两种。以高于+p的价格买,以低于-P的价格卖出。

若二者均设置,则百分比优先级高。

cerebro.broker.set_slippage_perc(0.0001)
cerebro.broker.set_slippage_fixed(0.03)

03 交易费用

交易费用不可忽视,尤其是在交易频率比较高的策略中。

bt中简单配置交易费用很容易,但如果要更真实的模拟市场,则需要了解一些细节。

比如交易费率为“万分之三”,买卖都收,直接setcommission即可。

cerebro.broker.setcommission(0.0003)

但A股实际上还有一个单笔不低于5元,且卖出还有印花税。

这就需要继承bt.CommInfoBase,然后自己写计算逻辑。

class MyStockCommissionScheme(bt.CommInfoBase):
    '''
    1.佣金按照百分比。    2.每一笔交易有一个最低值,比如5块,当然有些券商可能会免5.
    3.卖出股票还需要收印花税。    4.可能有的平台还需要收平台费。    '''
    params = (
        ('stampduty', 0.005),  # 印花税率
        ('commission', 0.005),  # 佣金率
        ('stocklike', True),#股票类资产,不考虑保证金
        ('commtype', bt.CommInfoBase.COMM_PERC),#按百分比
        ('minCommission', 5),#最小佣金
        ('platFee', 0),#平台费用
    )

    def _getcommission(self, size, price, pseudoexec):
        '''
        size>0,买入操作。        size<0,卖出操作。        '''
        if size > 0:  # 买入,不考虑印花税,需要考虑最低收费
            return max(size * price * self.p.commission,self.p.minCommission)+platFee
        elif size < 0:  # 卖出,考虑印花税。
            return max(abs(size) * price * self.p.commission,self.p.minCommission)+abs(size) * price * self.p.stampduty+platFee
        else:
            return 0  # 防止特殊情况下size为0.
cerebro.broker.setcommission(0.0003)
cerebro.broker.addcommissioninfo(MyStockCommissionScheme())


04 交易订单类型

回测中使用比较多的还是

市价单和限价单

bt支持

市值,限价,止损,止损限价,止损追踪,止损追踪限价

默认是市价单,就是使用下一个Bar的open来交易。

self.buy(exectype=bt.Order.Market)


05 交易函数

策略的核心就是依照计算好的规则,向broker发布交易指令。

指令有

常规的买或卖

,或

有按目标下单

常规买卖就是 buy, sell, close。买、卖和平仓。

而目标下单函数会根据交易目标自动确定买卖方向。

1, order_target_size,成交后到多少份

2,order_target_value,成交后仓位到多少

3, order_target_percent,成交后仓位占比

# 按目标数量下单
self.order = self.order_target_size(target=size)
# 按目标金额下单
self.order = self.order_target_value(target=value)
# 按目标百分比下单
self.order = self.order_target_percent(target=percent)

有了这些准备工作,明天可以开始写策略。



版权声明:本文为weixin_38175458原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。