Backtrader 教程:经纪人 - 滑点

  |  

回测不能保证真实的市场状况。无论市场仿真有多好,在真实的市场条件下都会发生滑点。这意味着:

  • 要求的价格可能不匹配。

集成的回测代理支持滑点。可以将以下参数传递给代理

  • slip_perc (default: 0.0 ) 绝对值(和正数)百分比,应该用于在买入/卖出订单中向上/向下滑动价格

    笔记:

    • 0.011%

    • 0.0010.1%

  • slip_fixed (默认: 0.0 ) 单位百分比(和正数)应该用于向上/向下滑动买/卖订单的价格

    注意:如果slip_perc不为零,则优先于此。

  • slip_open (默认: False ) 是否为订单运行滑动价格,这将专门使用下一根柱的开盘价。一个例子是Market单,它使用下一个可用的分时运行,即:柱的开盘价。

    这也适用于其他一些运行,因为当移动到新柱时,逻辑会尝试检测开盘价是否与请求的价格/运行类型匹配。

  • slip_match (默认值: True

    如果为True ,经纪人将通过以high / low价格限制滑点来提供匹配,以防它们被超过。

    如果为False ,经纪人将不会将订单与当前价格匹配,并将在下一次迭代中尝试运行

  • slip_limit (默认值: True

    即使slip_matchFalseLimit单也将匹配到所请求的精确匹配价格。

    此选项控制该行为。

    如果为True ,则Limit订单将通过将价格限制为limit / high / low来匹配

    如果False和滑点超过上限,则不匹配

  • slip_out (默认值: False

    即使价格超出high范围,也提供滑low

这个怎么运作

为了决定何时应用滑点,订单运行类型被考虑在内:

  • Close -没有应用滑

    此订单与close价匹配,此价格是当天的最后一个价格。滑点不会发生,因为订单只能在交易时段的最后一个分时发生,这是一个没有公差的独特价格。

  • Market - 应用滑点

    请检查slip_open异常。因为Market单将与下一根柱的开盘价匹配。

  • Limit - 按照这个逻辑应用滑点

    • 如果匹配价格是开盘价,则根据参数slip_open应用滑点。如果应用,价格将永远不会低于要求的limit

    • 如果匹配价格不是limit ,则应用滑点上限为high / low 。在这种情况下, slip_mlimit适用于决定在超过上限的情况下是否会发生匹配

    • 如果匹配价格是limit ,则不应用滑点

  • Stop - 一旦订单被触发,与Market订单相同的逻辑适用

  • StopLimit - 一旦订单被触发,与Limit订单相同的逻辑适用

这种方法试图在仿真和可用数据的范围内提供最现实的方法

配置滑点

代理已经由cerebro引擎为每次运行使用默认参数实例化。有两种方法可以改变行为:

  • 使用方法配置滑点

    BackBroker.set_slippage_perc(perc, slip_open= True , slip_limit= True , slip_match= True , slip_out= False )

    将滑点配置为基于百分比

    BackBroker.set_slippage_fixed(固定, slip_open= True , slip_limit= True , slip_match= True , slip_out= False )

    将滑点配置为基于固定点

  • 替换代理,如下所示:

    import backtrader as bt
    
    cerebro = bt.Cerebro()
    cerebro.broker = bt.brokers.BackBroker(slip_perc=0.005)  # 0.5%
    

实际例子

源包含一个使用订单运行类型Market和使用信号的多头/空头方法的示例。这应该允许理解逻辑。

一个没有滑点的运行和一个供以后参考的初始图:

$ ./slippage.py --plot
01 2005-03-22 23:59:59 SELL Size: -1 / Price: 3040.55
02 2005-04-11 23:59:59 BUY  Size: +1 / Price: 3088.47
03 2005-04-11 23:59:59 BUY  Size: +1 / Price: 3088.47
04 2005-04-19 23:59:59 SELL Size: -1 / Price: 2948.38
05 2005-04-19 23:59:59 SELL Size: -1 / Price: 2948.38
06 2005-05-19 23:59:59 BUY  Size: +1 / Price: 3034.88
...
35 2006-12-19 23:59:59 BUY  Size: +1 / Price: 4121.01

使用配置为1.5%的滑点进行相同的运行:

$ ./slippage.py --slip_perc 0.015
01 2005-03-22 23:59:59 SELL Size: -1 / Price: 3040.55
02 2005-04-11 23:59:59 BUY  Size: +1 / Price: 3088.47
03 2005-04-11 23:59:59 BUY  Size: +1 / Price: 3088.47
04 2005-04-19 23:59:59 SELL Size: -1 / Price: 2948.38
05 2005-04-19 23:59:59 SELL Size: -1 / Price: 2948.38
06 2005-05-19 23:59:59 BUY  Size: +1 / Price: 3034.88
...
35 2006-12-19 23:59:59 BUY  Size: +1 / Price: 4121.01

没有变化。这是该方案的预期行为。

  • 运行类型: Market

  • 并且slip_open没有设置为True

    Market单与下一根柱的开盘价相匹配,我们不允许移动open

运行将slip_open设置为True

$ ./slippage.py --slip_perc 0.015 --slip_open
01 2005-03-22 23:59:59 SELL Size: -1 / Price: 3021.66
02 2005-04-11 23:59:59 BUY  Size: +1 / Price: 3088.47
03 2005-04-11 23:59:59 BUY  Size: +1 / Price: 3088.47
04 2005-04-19 23:59:59 SELL Size: -1 / Price: 2948.38
05 2005-04-19 23:59:59 SELL Size: -1 / Price: 2948.38
06 2005-05-19 23:59:59 BUY  Size: +1 / Price: 3055.14
...
35 2006-12-19 23:59:59 BUY  Size: +1 / Price: 4121.01

并且可以立即看到价格已经移动。并且分配的价格最差或与操作 35 相同。这不是复制和粘贴错误

  • 20016-12-19 的openhigh点是一样的。

    价格不能推high至高点之上,因为这意味着返回一个不存在的价格。

当然,如果愿意low话, backtrader允许在high范围之外匹配slip_out 。激活它的运行:

$ ./slippage.py --slip_perc 0.015 --slip_open --slip_out
01 2005-03-22 23:59:59 SELL Size: -1 / Price: 2994.94
02 2005-04-11 23:59:59 BUY  Size: +1 / Price: 3134.80
03 2005-04-11 23:59:59 BUY  Size: +1 / Price: 3134.80
04 2005-04-19 23:59:59 SELL Size: -1 / Price: 2904.15
05 2005-04-19 23:59:59 SELL Size: -1 / Price: 2904.15
06 2005-05-19 23:59:59 BUY  Size: +1 / Price: 3080.40
...
35 2006-12-19 23:59:59 BUY  Size: +1 / Price: 4182.83

匹配价格的匹配表达式是:OMG! (我的天啊!)。价格明显超出范围。看一下操作 35 就足够了,它已在4182.83处匹配。对本文档中图表的快速检查表明,该资产从未接近该价格。

slip_match的默认值为True ,这意味着反向交易者提供匹配,无论是上限价格还是不上限价格,如上所示。让我们禁用它:

$ ./slippage.py --slip_perc 0.015 --slip_open --no-slip_match
01 2005-04-15 23:59:59 SELL Size: -1 / Price: 3028.10
02 2005-05-18 23:59:59 BUY  Size: +1 / Price: 3029.40
03 2005-06-01 23:59:59 BUY  Size: +1 / Price: 3124.03
04 2005-10-06 23:59:59 SELL Size: -1 / Price: 3365.57
05 2005-10-06 23:59:59 SELL Size: -1 / Price: 3365.57
06 2005-12-01 23:59:59 BUY  Size: +1 / Price: 3499.95
07 2005-12-01 23:59:59 BUY  Size: +1 / Price: 3499.95
08 2006-02-28 23:59:59 SELL Size: -1 / Price: 3782.71
09 2006-02-28 23:59:59 SELL Size: -1 / Price: 3782.71
10 2006-05-23 23:59:59 BUY  Size: +1 / Price: 3594.68
11 2006-05-23 23:59:59 BUY  Size: +1 / Price: 3594.68
12 2006-11-27 23:59:59 SELL Size: -1 / Price: 3984.37
13 2006-11-27 23:59:59 SELL Size: -1 / Price: 3984.37

起泡藤壶!从 35 降至 13。理由:

如果滑点将匹配价格推高至柱线的high或低于柱线的low ,则禁用slip_match将禁止匹配操作。似乎在请求滑点的1.5%的情况下,大约 22 个操作未能运行。

这些例子应该展示了不同的滑点击项是如何协同工作的。

推荐阅读

相关文章

Backtrader细分佣金计划

不久前,委员会计划的实施进行了重新设计。最重要的是:涉及的部分返工: 保留原始的佣金信息类和行为 打开大门,轻松创建用户定义的佣金 将格式 xx% 作为新佣金方案的默认值,而不是 0.xx(只是一个品味问题),保持行为可配置 扩展委员会概述了基本要素。

Backtrader佣金计划

backtrader 的诞生是出于必要。我自己的...有一种感觉,我控制着自己的回溯测试平台,可以尝试新的想法。但是,在这样做并且从一开始就完全 open 采购它时,很明显它必须有一种方法来满足他人的需求和愿望。 作为未来的交易者,我本可以选择基于点的计算和每轮佣金的固定价格,但这将是一个错误。

Backtrader对逐笔报价数据重新采样

backtrader 已经可以从分钟数据中重新采样。接受价格变动数据不是问题,只需将 4 个常用字段(open、 high、 low、 close)设置为价格变动值。 但是传递要重新采样的逐笔报价数据再次生成相同的数据。作为或版本 1.1.11.88,情况已不再如此。

Backtrader教程:安装

要求和版本 backtrader 是独立的,没有外部依赖关系(除非要绘图) 基本要求是: Python 2.7 Python 3.2 / 3.3/ 3.4 / 3.5 pypy/pypy3 如果需要绘图,则其他要求: Matplotlib >= 1.4.

BacktraderPyFolio 集成

注意 2017年2月 pyfolio API 已更改,不再 create_full_tear_sheet 具有 gross_lev 作为命名参数的参数。

Backtrader迪克森移动平均线

下面的reddit帖子以自己的作者Nathan Dickson(reddit句柄)命名了这个平均值Dickson移动平均线。 在一次对reddit Algotrading 的定期访问中,我发现了一篇关于移动平均线的帖子,该移动平均线试图模仿Jurik移动平均线(又名JMA)。

Backtrader教程:Cerebro - 优化 - 改进

backtrader版本1.8.12.99改进了在多处理过程中管理data feeds和结果的方式。

Backtrader教程:绘图 - 日期范围

该版本1.9.31.x 增加了制作部分绘图的功能。 使用策略实例中保存的完整时间戳数组的索引 或者使用实际datetime.date 或 datetime.datetime 实例来限制必须绘制的内容。 一切都超过标准cerebro.plot。

Backtrader条形同步

文献和/或行业中缺乏标准公式不是问题,因为问题实际上可以总结为: 条形同步 工单 #23 提出了一些问题,即是否可以 backtrader 考虑计算 相对体积 指针。 请求者需要将给定时刻的 volume 与前一个交易日的相同时刻进行比较。

Backtrader教程:佣金计划 - 信贷利息

在某些情况下,真实经纪人的现金金额可能会减少,因为资产操作包括利率。例子: 卖空股票 交易所买卖基金包括多头和空头 该费用直接与经纪人帐户中的现金余额挂钩。但它仍然可以被视为佣金计划的一部分。因此,它已被建模为 backtrader。