Backtrader 交易基础 | 您所在的位置:网站首页 › python作弊 › Backtrader 交易基础 |
查看账户状态: 类测试策略(bt.Strategy): 定义下一个(自我): 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) 注意:getposition()需要指定具体的目标数据集滑动点设置: #方法一:通过BackBroker类中的slip_perc参数设置百分比滑动点 cerebro.broker u003d bt.brokers.BackBroker(slip_percu003d0.0001) 方法二:通过调用经纪人集合_滑点_perc方法设置百分比滑点cerebro.broker.set_slippage_minute(分钟u003d0.0001) 方法一:通过BackBroker类中的slip_fixed参数设置固定滑动点cerebro.broker u003d bt.brokers.BackBroker(slip_fixedu003d0.001) 方法二:通过调用经纪人集合_slippage_fixed方法设置固定滑动点cerebro.broker u003d cerebro.broker.set_slippage_fixed(fixedu003d0.001) 参数说明: 滑点的附加设置 slip_open:是否处理开盘价的滑点。该参数在BackBroker()类中默认为False,而set_slippage_perc和set_slippage_fixed方法中默认值为True; slip_match:是否将滑点处理后的新成交价与交易日的低~高价区间匹配。如果为True,则价格区间将根据新的成交价格重新匹配调整,以保证订单能够被执行;如果为False,则不匹配价格区间,订单不会被执行,但会在次日执行空单;默认值是true; slip_out:如果新的成交价高于或低于最高价,是否以超出的价格成交。如果为True,则允许以超出的价格进行交易;如果为False,实际成交价将限制在价格区间{low ~ high;默认值为假; slip_limit:限价单是否执行滑点。如果为True,即使slip_match为Fasle,价格也会被匹配,以确保订单被执行;如果为 False,则不会进行价格匹配;默认值是true。 #案例一: set_slippage_fixed(fixedu003d0.35, 滑_openu003d假, 滑_matchu003d真, 滑_outu003d假) 由于slip_openu003dFalse,开盘价不会做滑点处理,所以还是按原开盘价32.63307367交易 案例2:set_slippage_fixed(fixedu003d0.35, 滑_openu003d真, 滑_matchu003d真, 滑_outu003d假) #案例3: set_slippage_fixed(fixedu003d0.35, 滑_openu003d真, 滑_matchu003d真, 滑_outu003d真) 滑动点调整后的新成交价为32.63307367 + 0.35 u003d 32.98307367,超过当日最高价32.94151482 允许价格匹配slip_matchu003dTrue,并以超出价格范围的新交易价格运行执行slip_outu003dTrue 最终成交价为32.98307367 案例4:set_slippage_fixed(fixedu003d0.35, 滑_openu003d真, 滑_matchu003d假, 滑_outu003d真) 滑动点调整后的新成交价为32.63307367 + 0.35 u003d 32.98307367,超过当日最高价32.94151482 由于没有价格匹配,slip_matchu003dFalse,新的交易价格超出价格范围,无法交易 2019年1月17日不执行订单,2019年1月18日执行空单 2019年7月2日无订单执行,次日2019年7月3日执行空单 即使2019年7月3日开盘39.96627412 + 0.35 0,如果 automargin*price 确定保证金自动保证金u003d假, 交易成本设置函数的数据集(即函数的目标) 如果值为None,则默认应用于所有数据集(即所有资产)名称u003d无) 从以上参数的含义和作用可以看出,margin、commtype和stocklike默认有两种配置规则:股票百分比费用和期货固定费用,如下: comm / margin 类型未设置为 1_ Perc percent fee → bottom_ stocklike 属性将设置为 True → 对应“stock percent fee”。 因此,如果要设置股票交易手续费,让margin u003d 0 / None / False,或者stocklikeu003dTrue; 规则2:设置margin的值→commtype指向COMM_FIXED费用→bottom_stocklike属性设置为False→对应“期货固定费用”,因为只有期货才会涉及保证金。 因此,如果要设置期货的交易费用,就需要设置保证金。此外,您需要设置 stocklikeu003dTrue 才能使保证金参数起作用。 自定义交易成本示例 # 自定义期货百分比费用 类 CommInfo_Fut_Perc_Mult(bt.CommInfoBase): 参数 u003d ( ('stocklike', False), # 指定为期货模式 ('commtype', bt.CommInfoBase.COMM_PERC), # 使用百分比费用 ('percabs', False), # 佣金百分比 ) def _getcommission(自我,大小,价格,伪执行): 计算交易成本return (abs(size) * price) * (self.p.commission/100) * self.p.mult #pseudoexec 用于提示交易成本是否真正被计算在内 如果只是试用成本,pseudoexecu003dFalse 如果是真正的统计成本,pseudoexecu003dTruecomminfo u003d CommInfo_Fut_Perc_Mult( 佣金u003d0.1, # 0.1% 很多u003d10, marginu003d2000) # 实例化 cerebro.broker.addcommissioninfo(comminfo) 以上自定义函数也可以通过setcommission实现cerebro.broker.setcommission(commissionu003d0.1, #0.1% 很多u003d10, 边距u003d2000, percabsu003d假, commtypeu003dbt.CommInfoBase.COMM_PERC, 类似股票u003d假) 以下是考虑佣金和印花税的股份百分比费用: 类 StockCommission(bt.CommInfoBase): 参数 u003d ( ('stocklike', True), # 指定为期货模式 ('commtype', bt.CommInfoBase.COMM_PERC), # 使用百分比收费模式 ('percabs', True), # 佣金不在% ('stamp_duty', 0.001),) # 印花税默认为0.1% 用户自定义费用计算公式def _getcommission(自我,大小,价格,伪执行): if size > 0: # 购买时只考虑佣金 返回 abs(size) * 价格 * self.p.commission elif size < 0: # 卖出时,佣金和印花税都考虑 返回 abs(size) * price * (self.p.commission + self.p.stamp_duty) 其他: 返回 0 音量限制管理 形式 1:bt.broker 填充物。固定尺寸(尺寸) 使用 FixedSize() 方法设置最大固定交易量:size。该模式下的交易量限制规则如下: 订单实际交易量的确定规则:取最小的(大小、订单执行当天的交易量、订单需要的交易数量); 订单执行当日,若无法完全满足订单要求的成交量,则仅完成部分成交量。我们不会在第二天补上账单。 # 直接通过BackBroker()类设置 大脑 u003d 大脑() 填充物 u003d bt.broker.fillers.FixedSize(sizeu003dxxx) newbroker u003d bt.broker.BrokerBack(filleru003dfiller) cerebro.broker u003d 新经纪人 通过 set_filler 方法设置大脑 u003d 大脑() cerebro.broker.set_filler(bt.broker.fillers.FixedSize(sizeu003dxxx)) self.order u003d self.buy(sizeu003d2000) # 每次购买 2000 股 cerebro.broker.set_filler(bt.broker.fillers.FixedSize(sizeu003d3000)) # 固定最大交易量形式 2:bt.broker 填充物。 FixedBarPerc(perc) 通过 fixedparperc (PERC) 将订单执行当天柱线总交易量的 perc% 设置为最大固定交易量。该模式的交易量限制规则如下: 订单实际交易量的确定规则:取最小(volume * perc /100,订单所需的交易量); 订单执行当日,若无法完全满足订单要求的成交量,则仅完成部分成交量。 # 直接通过BackBroker()类设置 大脑 u003d 大脑() 填充物 u003d bt.broker.fillers.FixedBarPerc(percu003dxxx) newbroker u003d bt.broker.BrokerBack(filleru003dfiller) cerebro.broker u003d 新经纪人 通过 set_filler 方法设置大脑 u003d 大脑() cerebro.broker.set_filler(bt.broker.fillers.FixedBarPerc(percu003dxxx)) perc 为 in%,取值范围为 [0.0100.0] self.order u003d self.buy(sizeu003d2000) # 次日开盘价买入2000股 cerebro.broker.set_filler(bt.broker.fillers.FixedBarPerc(percu003d50))形式 3:bt.broker 填充物。 BarPointPerc(minmovu003d0.01,percu003d100.0) BarPointPerc() 在考虑价格范围的基础上确定交易量。在订单执行当天,交易量确定如下: 将当日bar的价格区间low ~ high用minmov平均分割得到分割的股数: part u003d (high -low +minmov) // minmov (向下取整) 当日柱线总成交量的成交量也被分成相同数量的部分,这样就可以得到每个部分的平均交易量: 体积_per u003d 体积 // 部分 最后,volume_per * (perc / 100) 是允许的最大交易量。实际交易完成后,通过比较订单中所需的交易量即可得到最终的实际交易量 实际交易量 u003d min (volume_per * (perc / 100), 订单需要的交易数量) # 直接通过BackBroker()类设置 大脑 u003d 大脑() 填充物 u003d bt.broker.fillers.BarPointPerc(minmovu003d0.01,percu003d100.0) newbroker u003d bt.broker.BrokerBack(filleru003dfiller) cerebro.broker u003d 新经纪人 通过 set_filler 方法设置大脑 u003d 大脑() cerebro.broker.set_filler(bt.broker.fillers.BarPointPerc(minmovu003d0.01,percu003d100.0)) perc 为 in%,取值范围为 [0.0100.0] self.order u003d self.buy(sizeu003d2000) # 次日开盘价买入2000股 cerebro.broker.set_filler(bt.broker.fillers.BarPointPerc(minmovu003d0.1, percu003d50)) # 表示50%交易时间管理 对于交易订单的产生和执行时间,Backtrader默认为“当日收盘后下单,次日以开盘价收盘”。这种模式可以有效避免在回测过程中使用未来的数据。 但是对于一些特殊的交易场景,比如“all_in”,当日下单的数量是按当日收盘价(总资金/当日收盘价)计算的。次日以开盘价执行订单时, 如果开盘价高于昨天的收盘价,就会出现可用资金短缺的情况。 为了应对一些特殊的交易场景,Backtrader还提供了一些交易计时模式:开盘作弊和收盘作弊。 开场作弊 开市作弊是“当日下单,当日开盘价成交”的模式。这种模式下,Strategy中的事务逻辑不再写在next()方法中,而是在具体的next_open(),nextstart_open(),prenext_open()函数中,参考以下具体设置示例: 模式一:bt.Cerebro(cheat\on\openu003dTrue); 方法二:脑经纪人。设置_ coo(真); 方法 3:BackBroker(coou003dTrue)。 作弊关闭 收盘作弊是“当日下单,当日收盘价”的模式。在这种模式下,Strategy 中的事务逻辑仍然写在 next() 中。具体设置如下: 方法一:脑经纪人。设置_ coc(True); 模式 2:BackBroker(cocu003dTrue) 类测试策略(bt.Strategy): ...... 定义下一个(自我): 取消之前未执行的订单如果 self.order: self.cancel(self.order) 检查是否有仓位如果不是 self.position: 在10日均线上穿5日均线并买入如果 self.crossover > 0: print('{}发送购买,打开{}'.format(self.data.datetime.date(),self.data.open[0])) self.order u003d self.buy(sizeu003d100) # 次日开盘价买入100股 ##10日均线下穿5日均线卖出 elif self.crossover < 0: self.order u003d self.close() # 平仓,以次日开盘价卖出 ...... 实例化大脑大脑u003d bt.大脑() ....... 当天下单,当天成交cerebro.broker.set_coc(True) |
CopyRight 2018-2019 实验室设备网 版权所有 |