回测不能保证真实的市场状况。无论市场仿真有多好,在真实的市场条件下都会发生滑点。这意味着:
- 要求的价格可能不匹配。
集成的回测代理支持滑点。可以将以下参数传递给代理
slip_perc
(default:0.0
) 绝对值(和正数)百分比,应该用于在买入/卖出订单中向上/向下滑动价格笔记:
0.01
为1%
0.001
为0.1%
slip_fixed
(默认:0.0
) 单位百分比(和正数)应该用于向上/向下滑动买/卖订单的价格注意:如果
slip_perc
不为零,则优先于此。slip_open
(默认:False
) 是否为订单运行滑动价格,这将专门使用下一根柱的开盘价。一个例子是Market
单,它使用下一个可用的分时运行,即:柱的开盘价。这也适用于其他一些运行,因为当移动到新柱时,逻辑会尝试检测开盘价是否与请求的价格/运行类型匹配。
slip_match
(默认值:True
)如果为
True
,经纪人将通过以high / low
价格限制滑点来提供匹配,以防它们被超过。如果为
False
,经纪人将不会将订单与当前价格匹配,并将在下一次迭代中尝试运行slip_limit
(默认值:True
)即使
slip_match
为False
,Limit
单也将匹配到所请求的精确匹配价格。此选项控制该行为。
如果为
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 的
open
和high
点是一样的。价格不能推
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 个操作未能运行。
这些例子应该展示了不同的滑点击项是如何协同工作的。