原创文章第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)
有了这些准备工作,明天可以开始写策略。