Backtrader 交易基础 您所在的位置:网站首页 python作弊 Backtrader 交易基础

Backtrader 交易基础

2023-03-23 16:43| 来源: 网络整理| 查看: 265

查看账户状态:

类测试策略(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 如果是真正的统计成本,pseudoexecu003dTrue

comminfo 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 实验室设备网 版权所有