简述
现实交易中,用户在经纪行(如 证券公司)开设交易账户,然后向Backtrader提供broker对象模拟现实世界的经济行。broker对象支持各种订单类型,它的主要功能有,检查库存现金能否满足已提交订单的现金需求、在策略的每次迭代中跟踪现金与市值余额、维护各个标的资产的仓位信息、维护佣金和滑点。在类似期货这样的资产交易中,broker会自动在每次迭代时调整现金,因为资产价格变化意味着现金的增加或减少。
默认的经纪行对象类型是 backtrader.brokers.backbroker.BackBroker,主要用于回测,故称为回测broker。
中国用户要实盘交易,则必须开发自己的实盘broker类。
在next中访问broker
self.log(
f'cash {self.broker.getcash()}, value {self.broker.getvalue()}'
)
自定义佣金规则,中国股市印花税
'''自定义佣金类,考虑中国印花税'''
import backtrader as bt
from feed import feed
from logger import lg
class stampCommissionScheme(bt.CommInfoBase):
'''
本佣金模式下,买入股票仅支付佣金,卖出股票支付佣金和印花税
'''
params = (
('stamp_duty', 0.005), # 印花税率
('percabs', 'True')
)
def _getcommission(self, size, price, pseudoexec):
# size > 0, 买入,不考虑印花税
if size > 0:
return size * price * self.p.commission
# size < 0, 卖出, 考虑印花税
elif size < 0:
return size * price * (self.p.stamp_duty + self.p.commission)
else:
return 0
注意:佣金类stampDutyCommissionScheme 的参数percabs默认设为True。则意味着backtrader将佣金率 0.001理解为设定值0.001,若设为False,则理解为 0.001%
使用自定义的佣金规则
cerebro = bt.Cerebro()
cerebro.adddata(feed)
cerebro.addstrategy(SmaCross)
comminfo = stampCommissionScheme(stamp_duty=0.005, commission=0.001)
cerebro.broker.addcommissioninfo(comminfo)