回測不能保證真實的市場狀況。無論市場模擬有多好,在真實的市場條件下都會發生滑點。這意味著:
- 要求的價格可能不匹配。
集成的回測代理支持滑點。可以將以下參數傳遞給代理
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 個操作未能執行。
這些例子應該展示了不同的滑點選項是如何協同工作的。