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 個操作未能執行。

這些例子應該展示了不同的滑點選項是如何協同工作的。

推薦閱讀

相關文章

BacktraderPython Hidden Powers 2

讓我們進一步討論一下Python的隱藏功能如何在 backtrader 中使用,以及如何實現它以嘗試實現主要目標:易用性 這些定義是什麼? 例如指標: import backtrader as bt class MyIndicator(bt.

Backtrader教程:經紀人 - 體積灌裝 - 灌裝機

backtrader經紀商類比在使用volume執行訂單時具有預設策略: 忽略 volume 這是基於2個前提: 在市場中交易的流動性足以一次性完全吸收買入/賣出訂單 真正的 volume 匹配需要真正的狼 一個簡單的例子是Fill or Kill 訂單。

Backtrader教程:安裝

要求和版本 backtrader 是獨立的,沒有外部依賴關係(除非要繪圖) 基本要求是: Python 2.7 Python 3.2 / 3.3/ 3.4 / 3.5 pypy/pypy3 如果需要繪圖,則其他要求: Matplotlib >= 1.4.

Backtrader教程:倉位

資產的頭寸通常從策略中檢查: position (財產)或 getposition(data=None, broker=None) 這將返回策略在默認broker狀態下datas[0]的位置,由cerebro 倉位只是指示: 資產被持有size 平均價格price 它作為一種狀態,

Backtrader期貨補償與現貨補償

版本1.9.32.116 增加了對社區中呈現的有趣用例 的支援 以期貨開始交易,包括實物交割 讓一個指標告訴你一些事情 如果需要, close 現貨價格操作,有效地取消實物交割,無論是為了接收貨物還是為了必須交付貨物(並希望獲利)來頭寸。

Backtrader教程:數據饋送 - 展期交割

並非每個供應商都為可以交易的工具提供連續的未來。有時提供的數據是仍然有效的到期日期的數據,即:仍在交易的日期 這在回溯測試方面並不是很有幫助,因為數據分散在幾個不同的儀器上,這些儀器另外...時間重疊。 能夠正確地將這些儀器的數據從過去連接到連續的流中,可以減輕疼痛。

Backtrader回溯

在一些關於改進的ShapeRatio的提示之後, backtrader 已將此分析儀添加到其武器庫中。 文獻位於: 從對數回報的好處開始,並遵循在SharpeRatio方程的分母中具有標準偏差的副作用,本文檔開發了該分析儀的公式和期望。

Backtrader教程:Cerebro - 優化 - 改進

backtrader版本1.8.12.99改進了在多處理過程中管理data feeds和結果的方式。

Backtrader信貸利息

在某些情況下,真實經紀人的現金金額可能會減少,因為資產操作包括利率。例子: 賣空股票 交易所買賣基金包括多頭和空頭 這意味著不僅交易構成了系統的盈利能力,因為信貸上的利息在帳戶上佔有一席之地。 為了涵蓋這種情況, backtrader 包括(從發佈1.8.8.96開始)功能來考慮這一點。

Backtrader終極振蕩器

backtrader開發啟動時的目標之一是使開發新的指標變得非常容易(至少對作者本人而言),以在數學和視覺上測試想法。 門票#102 是關於將 UltimateOscillator 添加到 backtrader 注意 它將在下一個版本中添加,同時可以使用下面的代碼使用它。 票證中所示的參考: 以及: 無需在這裡重複。