回测不能保证真实的市场状况。无论市场仿真有多好,在真实的市场条件下都会发生滑点。这意味着:
- 要求的价格可能不匹配。
集成的回测代理支持滑点。可以将以下参数传递给代理
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没有设置为TrueMarket单与下一根柱的开盘价相匹配,我们不允许移动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 个操作未能运行。
这些例子应该展示了不同的滑点击项是如何协同工作的。