Backtrader交易基礎

查看賬戶情況:

class TestStrategy(bt.Strategy):def next(self):print('當前可用資金', self.broker.getcash())print('當前總資產', self.broker.getvalue())print('當前持倉量', self.broker.getposition(self.data).size)print('當前持倉成本', self.broker.getposition(self.data).price)# 也可以直接獲取持倉print('當前持倉量', self.getposition(self.data).size)print('當前持倉成本', self.getposition(self.data).price)# 注:getposition() 需要指定具體的標的數據集

滑點設置:

# 方式1:通過 BackBroker 類中的 slip_perc 參數設置百分比滑點
cerebro.broker = bt.brokers.BackBroker(slip_perc=0.0001)
# 方式2:通過調用 brokers 的 set_slippage_perc 方法設置百分比滑點
cerebro.broker.set_slippage_perc(perc=0.0001)# 方式1:通過 BackBroker 類中的 slip_fixed 參數設置固定滑點
cerebro.broker = bt.brokers.BackBroker(slip_fixed=0.001)
# 方式2:通過調用 brokers 的 set_slippage_fixed 方法設置固定滑點
cerebro.broker = cerebro.broker.set_slippage_fixed(fixed=0.001)

參數說明:

有關滑點的其他設置
slip_open:是否對開盤價做滑點處理,該參數在 BackBroker() 類中默認為 False,在 set_slippage_perc 和set_slippage_fixed 方法中默認為 True;
slip_match:是否將滑點處理后的新成交價與成交當天的價格區間 low ~ high 做匹配,如果為 True,則根據新成交價重新匹配調整價格區間,確保訂單能被執行;如果為 False,則不會與價格區間做匹配,訂單不會執行,但會在下一日執行一個空訂單;默認取值為 True;
slip_out:如果新成交價高于最高價或低于最高價,是否以超出的價格成交,如果為 True,則允許以超出的價格成交;如果為 False,實際成交價將被限制在價格區間內 ?low ~ high;默認取值為 False;
slip_limit:是否對限價單執行滑點,如果為 True,即使 slip_match 為Fasle,也會對價格做匹配,確保訂單被執行;如果為 False,則不做價格匹配;默認取值為 True。

# 情況1:
set_slippage_fixed(fixed=0.35,slip_open=False,slip_match=True,slip_out=False)
# 由于 slip_open=False ,不會對開盤價做滑點處理,所以仍然以原始開盤價 32.63307367 成交# 情況2:
set_slippage_fixed(fixed=0.35,slip_open=True,slip_match=True,slip_out=False)# 情況3:
set_slippage_fixed(fixed=0.35,slip_open=True,slip_match=True,slip_out=True)
# 滑點調整的新成交價為 32.63307367+0.35 = 32.98307367,超出了當天最高價 32.94151482
# 允許做價格匹配 slip_match=True, 而且運行以超出價格區間的新成交價執行 slip_out=True
# 最終以新成交價 32.98307367 成交# 情況4:
set_slippage_fixed(fixed=0.35,slip_open=True,slip_match=False,slip_out=True)
# 滑點調整的新成交價為 32.63307367+0.35 = 32.98307367,超出了當天最高價 32.94151482
# 由于不進行價格匹配 slip_match=False,新成交價超出價格區間無法成交
# 2019-01-17 這一天訂單不會執行,但會在下一日 2019-01-18 執行一個空訂單
# 再往后的 2019-07-02,也未執行訂單,下一日 2019-07-03 執行空訂單
# 即使 2019-07-03的 open 39.96627412+0.35 < high 42.0866713 滿足成交條件,也不會補充成交

交易稅費管理

股票:目前 A 股的交易費用分為 2 部分:傭金和印花稅,
其中傭金雙邊征收,不同證券公司收取的傭金各不相同,一般在 0.02%-0.03% 左右,單筆傭金不少于 5 元;
印花稅只在賣出時收取,稅率為 0.1%。


期貨:期貨交易費用包括交易所收取手續費和期貨公司收取傭金 2 部分,交易所手續費較為固定,
不同期貨公司傭金不一致,而且不同期貨品種的收取方式不相同,有的按照固定費用收取,有的按成交金額的固定百分比收取:
合約現價*合約乘數*手續費費率。除了交易費用外,期貨交易時還需上交一定比例的保證金 。

Backtrader 也提供了多種交易費設置方式,既可以簡單的通過參數進行設置,也可以結合交易條件自定義費用函數:

根據交易品種的不同,Backtrader 將交易費用分為 股票 Stock-like 模式和期貨 Futures-like 種模式;
根據計算方式的不同,Backtrader 將交易費用分為 PERC 百分比費用模式 和 FIXED 固定費用模式 ;

Stock-like 模式與 PERC 百分比費用模式對應,期貨 Futures-like 與 FIXED 固定費用模式對應;

在設置交易費用時,最常涉及如下 3 個參數:

commission:手續費 / 傭金;

mult:乘數;

margin:保證金 / 保證金比率 。

雙邊征收:買入和賣出操作都要收取相同的交易費用 。

cerebro.broker.setcommission(# 交易手續費,根據margin取值情況區分是百分比手續費還是固定手續費commission=0.0,# 期貨保證金,決定著交易費用的類型,只有在stocklike=False時起作用margin=None,# 乘數,盈虧會按該乘數進行放大mult=1.0,# 交易費用計算方式,取值有:# 1.CommInfoBase.COMM_PERC 百分比費用# 2.CommInfoBase.COMM_FIXED 固定費用# 3.None 根據 margin 取值來確定類型commtype=None,# 當交易費用處于百分比模式下時,commission 是否為 % 形式# True,表示不以 % 為單位,0.XX 形式;False,表示以 % 為單位,XX% 形式percabs=True,# 是否為股票模式,該模式通常由margin和commtype參數決定# margin=None或COMM_PERC模式時,就會stocklike=True,對應股票手續費;# margin設置了取值或COMM_FIXED模式時,就會stocklike=False,對應期貨手續費stocklike=False,# 計算持有的空頭頭寸的年化利息# days * price * abs(size) * (interest / 365)interest=0.0,# 計算持有的多頭頭寸的年化利息interest_long=False,# 杠桿比率,交易時按該杠桿調整所需現金leverage=1.0,# 自動計算保證金# 如果False,則通過margin參數確定保證金# 如果automargin<0,通過mult*price確定保證金# 如果automargin>0,如果automargin*price確定保證金automargin=False,# 交易費用設置作用的數據集(也就是作用的標的)# 如果取值為None,則默認作用于所有數據集(也就是作用于所有assets)name=None)

從上述各參數的含義和作用可知,margin 、commtype、stocklike 存在 2 種默認的配置規則:股票百分比費用、期貨固定費用,具體如下:
第 1 條規則:未設置 margin(即 margin 為 0 / None / False)→ commtype 會指向 COMM_PERC 百分比費用 → 底層的 _stocklike 屬性會設置為 True → 對應的是“股票百分比費用”。
所以如果想為股票設置交易費用,就令 margin = 0 / None / False,或者令 stocklike=True;

第 2 條規則:為 margin 設置了取值 → ? commtype 會指向 COMM_FIXED 固定費用 → 底層的 _stocklike 屬性會設置為 False → 對應的是“期貨固定費用”,因為只有期貨才會涉及保證金。
所以如果想為期貨設置交易費用,就需要設置 margin,此外還需令 stocklike=True,margin 參數才會起作用 。

自定義交易費用的例子

# 自定義期貨百分比費用
class CommInfo_Fut_Perc_Mult(bt.CommInfoBase):params = (('stocklike', False), # 指定為期貨模式('commtype', bt.CommInfoBase.COMM_PERC), # 使用百分比費用('percabs', False), # commission 以 % 為單位)def _getcommission(self, size, price, pseudoexec):# 計算交易費用return (abs(size) * price) * (self.p.commission/100) * self.p.mult# pseudoexec 用于提示當前是否在真實統計交易費用# 如果只是試算費用,pseudoexec=False# 如果是真實的統計費用,pseudoexec=Truecomminfo = CommInfo_Fut_Perc_Mult(commission=0.1, # 0.1%mult=10,margin=2000) # 實例化
cerebro.broker.addcommissioninfo(comminfo)# 上述自定義函數,也可以通過 setcommission 來實現
cerebro.broker.setcommission(commission=0.1, #0.1%mult=10,margin=2000,percabs=False,commtype=bt.CommInfoBase.COMM_PERC,stocklike=False)

下面是考慮傭金和印花稅的股票百分比費用:

class StockCommission(bt.CommInfoBase):params = (('stocklike', True), # 指定為期貨模式('commtype', bt.CommInfoBase.COMM_PERC), # 使用百分比費用模式('percabs', True), # commission 不以 % 為單位('stamp_duty', 0.001),) # 印花稅默認為 0.1%# 自定義費用計算公式def _getcommission(self, size, price, pseudoexec):if size > 0: # 買入時,只考慮傭金return abs(size) * price * self.p.commissionelif size < 0: # 賣出時,同時考慮傭金和印花稅return abs(size) * price * (self.p.commission + self.p.stamp_duty)else:return 0

成交量限制管理

形式1:bt.broker.fillers.FixedSize(size)?

通過 FixedSize() 方法設置最大的固定成交量:size,該種模式下的成交量限制規則如下:

訂單實際成交量的確定規則:取(size、訂單執行那天的 volume 、訂單中要求的成交數量)中的最小者;

訂單執行那天,如果訂單中要求的成交數量無法全部滿足,則只成交部分數量。第二天不會補單。

# 通過 BackBroker() 類直接設置
cerebro = Cerebro()
filler = bt.broker.fillers.FixedSize(size=xxx)
newbroker = bt.broker.BrokerBack(filler=filler)
cerebro.broker = newbroker# 通過 set_filler 方法設置
cerebro = Cerebro()
cerebro.broker.set_filler(bt.broker.fillers.FixedSize(size=xxx))# self.order = self.buy(size=2000) # 每次買入 2000 股
# cerebro.broker.set_filler(bt.broker.fillers.FixedSize(size=3000)) # 固定最大成交量

形式2:bt.broker.fillers.FixedBarPerc(perc)

通過 FixedBarPerc(perc) 將 訂單執行當天 bar 的總成交量 volume 的 perc % 設置為最大的固定成交量,該模式的成交量限制規則如下:

訂單實際成交量的確定規則:取 (volume * perc /100、訂單中要求的成交數量) 的 最小者;
訂單執行那天,如果訂單中要求的成交數量無法全部滿足,則只成交部分數量。

# 通過 BackBroker() 類直接設置
cerebro = Cerebro()
filler = bt.broker.fillers.FixedBarPerc(perc=xxx)
newbroker = bt.broker.BrokerBack(filler=filler)
cerebro.broker = newbroker# 通過 set_filler 方法設置
cerebro = Cerebro()
cerebro.broker.set_filler(bt.broker.fillers.FixedBarPerc(perc=xxx))
# perc 以 % 為單位,取值范圍為[0.0,100.0]# self.order = self.buy(size=2000) # 以下一日開盤價買入2000股
# cerebro.broker.set_filler(bt.broker.fillers.FixedBarPerc(perc=50))

形式3:bt.broker.fillers.BarPointPerc(minmov=0.01,perc=100.0)

BarPointPerc() 在考慮了價格區間的基礎上確定成交量,在訂單執行當天,成交量確定規則為:

通過 minmov 將 當天 bar 的價格區間 low ~ high 進行均勻劃分,得到劃分的份數:

part = ?(high -low +minmov) ?// minmov ?(向下取整)

再對當天 bar 的總成交量 volume 也劃分成相同的份數 part ,這樣就能得到每份的平均成交量:

volume_per = volume // part?

最終,volume_per * (perc / 100)就是允許的最大成交量,實際成交時,對比訂單中要求的成交量,就可以得到最終實際成交量

實際成交量 = min ( volume_per * (perc / 100), 訂單中要求的成交數量 )

# 通過 BackBroker() 類直接設置
cerebro = Cerebro()
filler = bt.broker.fillers.BarPointPerc(minmov=0.01,perc=100.0)
newbroker = bt.broker.BrokerBack(filler=filler)
cerebro.broker = newbroker# 通過 set_filler 方法設置
cerebro = Cerebro()
cerebro.broker.set_filler(bt.broker.fillers.BarPointPerc(minmov=0.01,perc=100.0))
# perc 以 % 為單位,取值范圍為[0.0,100.0]# self.order = self.buy(size=2000) # 以下一日開盤價買入2000股# cerebro.broker.set_filler(bt.broker.fillers.BarPointPerc(minmov=0.1, perc=50)) # 表示 50%

交易時機管理
對于交易訂單生成和執行時間,Backtrader 默認是 “當日收盤后下單,次日以開盤價成交”,這種模式在回測過程中能有效避免使用未來數據。
但對于一些特殊的交易場景,比如“all_in”情況下,當日所下訂單中的數量是用當日收盤價計算的(總資金 / 當日收盤價),次日以開盤價執行訂單時,
如果開盤價比昨天的收盤價提高了,就會出現可用資金不足的情況。
為了應對一些特殊交易場景,Backtrader 還提供了一些 cheating 式的交易時機模式:Cheat-On-Open 和 Cheat-On-Close。

Cheat-On-Open

Cheat-On-Open 是“當日下單,當日以開盤價成交”模式,在該模式下,Strategy 中的交易邏輯不再寫在 next() 方法里,而是寫在特定的 next_open()、nextstart_open() 、prenext_open() 函數中,具體設置可參考如下案例:

方式1:bt.Cerebro(cheat_on_open=True);
方式2:cerebro.broker.set_coo(True);
方式3:BackBroker(coo=True)。

Cheat-On-Close

Cheat-On-Close 是“當日下單,當日以收盤價成交”模式,在該模式下,Strategy 中的交易邏輯仍寫在 next() 中,具體設置如下:

方式1:cerebro.broker.set_coc(True);
方式2:BackBroker(coc=True)

class TestStrategy(bt.Strategy):......def next(self):# 取消之前未執行的訂單if self.order:self.cancel(self.order)# 檢查是否有持倉if not self.position:# 10日均線上穿5日均線,買入if self.crossover > 0:print('{} Send Buy, open {}'.format(self.data.datetime.date(),self.data.open[0]))self.order = self.buy(size=100) # 以下一日開盤價買入100股# # 10日均線下穿5日均線,賣出elif self.crossover < 0:self.order = self.close() # 平倉,以下一日開盤價賣出......# 實例化大腦
cerebro= bt.Cerebro()
.......
# 當日下單,當日收盤價成交
cerebro.broker.set_coc(True)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449520.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449520.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449520.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IP地址分類/IP地址10開頭和172開頭和192開頭的區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 IP地址分類/IP地址10開頭和172開頭和192開頭的區別/判斷是否同一網段 簡單來說在公司或企業內部看到的就基本都是內網IP&#xff0c;AB…

Redis數據結構之簡單動態字符串SDS

Redis的底層數據結構非常多&#xff0c;其中包括SDS、ZipList、SkipList、LinkedList、HashTable、Intset等。如果你對Redis的理解還只停留在get、set的水平的話&#xff0c;是遠遠不足以應對面試提問的。本文簡單介紹了Redis底層最重要的數據結構 - 簡單動態字符串&#xff08…

Centos7 安裝OpenTSDB

Centos7 安裝OpenTSDB https://www.imzcy.cn/1697.html轉載于:https://www.cnblogs.com/RHadoop-Hive/p/10563385.html

職場潛規則冷思考:別讓老板“殺”了你

一位3年前共事過的同事走了&#xff0c;就在他以200多萬的房貸代價拿到大門鑰匙的時候&#xff0c;猝然倒在新房的樓梯上。另一個曾經在同一戰壕里沖鋒陷陣的同事被老板辭掉了&#xff0c;兢兢業業&#xff0c;起早貪黑&#xff0c;竟然沒有熬過35歲下崗這一關&#xff0c;這時…

Backtrader交易基礎2

成交價格確定&#xff1a; Order.Market 市價單&#xff0c;以當時市場價格成交的訂單&#xff0c;不需要自己設定價格。市價單能被快速達成交易&#xff0c;防止踏空&#xff0c;盡快止損/止盈&#xff1b; 按下一個 Bar &#xff08;即生成訂單的那個交易日的下一個交易日&…

windows 小技巧

2019獨角獸企業重金招聘Python工程師標準>>> 桌面圖標顯示不全、圖標呈現白色方塊 ie4uinit -show 關閉占用指定端口的進程 獲取進程: netstat -ano | findstr 端口號關閉進程&#xff1a;taskkill -f -pid 進程號文件被占用 打開任務管理器&#xff0c;切換到 性能…

進一步了解 apt-get 的幾個命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 用 apt-get 也很久了&#xff0c;沒多想它的實現&#xff0c;最近遇到 gstreamer 裝不上的問題&#xff0c;才多看看了它 apt-get 就是…

java學習筆記20(Arraylist復習,Collection接口方法,迭代器,增強型for循環)

集合&#xff1a;集合是Java提供的一種容器&#xff0c;可以用來存儲多個數據&#xff1b; 集合與數組的區別&#xff1a;集合的長度是可變的&#xff0c;數組的長度是固定的 集合中存儲的數據必須是引用類型數據&#xff1b; ArrayList回顧&#xff1a; public class Person {…

backtrader數據基礎

cerebro bt.Cerebro() cerebro.addstrategy(TestStrategy2) codes[600862.SH,300326.SZ,300394.SZ] #加載最近兩日交易數據 for code in codes:feed Addmoredata(dataname get_data(code,20200506),namecode)cerebro.adddata(feed) cerebro.run() 數據查看&#xff1a; cl…

談判學:三招了解對方底線

導讀&#xff1a;談判者都希望能了解對方的底線&#xff0c;最直接的一招就是將對手變成“朋友”&#xff0c;只是這種“內奸法”畢竟不是常規之法。大多數情況下&#xff0c;談判雙方也不可能像《無間道》一樣在對方陣營安放臥底&#xff0c;但是我們完全可以通過一些辦法來揣…

JSLint檢測Javascript語法規范

前端javascript代碼編寫中&#xff0c;有一個不錯的工具叫JSLint&#xff0c;可以檢查代碼規范化&#xff0c;壓縮JS&#xff0c;CSS等&#xff0c;但是他的語法規范檢查個人覺得太“苛刻”了&#xff0c;會提示各種各樣的問題修改建議&#xff0c;有時候提示的信息我們看的莫名…

Apt 命令解說(apt-get update、apt-cache search package、apt-get install package、apt-get remove )

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 高級打包工具&#xff08;英語&#xff1a;Advanced Packaging Tools&#xff0c;縮寫為APT&#xff09;是Debian及其派生發行版的軟件包…

SQL SERVER 2012 AlwaysOn - 維護篇 03

搭建 AlwaysOn 是件非常繁瑣的工作&#xff0c;需要從兩方面考慮&#xff0c;操作系統層面和數據庫層面&#xff0c;AlwaysOn 非常依賴于操作系統&#xff0c;域控&#xff0c;群集&#xff0c;節點等概念&#xff1b; DBA 不但要熟悉數據庫也要熟悉操作系統的一些概念&#xf…

指標研究與多周期

哪些地方會用到指標 &#xff1f; 回顧一下 Backtrader 的主要功能模塊和回測流程&#xff08;見&#xff1a;Backtrader 來了&#xff01;&#xff09;可以發現&#xff0c;只有在編寫策略Strategy 時才會涉及到指標的計算和使用&#xff0c;而且是 Strategy 中的 __init__()…

區塊鏈BAAS平臺:公共或私人區塊鏈編程以用于各種用途

2019獨角獸企業重金招聘Python工程師標準>>> 人們可以為公共或私人區塊鏈編程以用于各種用途。理論上&#xff0c;我認為犧牲權力下放的方面可以解決區塊鏈技術背后的許多當前問題。區塊鏈仍然可以包容&#xff0c;而不是分散。這如何解決當前的一些問題&#xff1f…

CURL 是什么

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 cURL是一個利用URL語法在命令行下工作的文件傳輸工具&#xff0c;1997年首次發行。 它支持文件上傳和下載&#xff0c;所以是綜合傳輸工…

易用性問題回復

針對淘寶網為例&#xff0c;以一次完整的購物流程為背景&#xff0c;我們分析了在淘寶網中的一些易用性的體現&#xff0c;主要場景如下圖所示: 在本場景中&#xff0c;新用戶下載淘寶app時&#xff0c;第一次打開應用&#xff0c;淘寶app會出現新手指引&#xff0c;教會用戶如…

易盛極星期貨量化教學

我目前量化實盤做期貨交易用的是這個軟件。主要就是因為它可以做套利合約&#xff0c;還有就是國企的外包&#xff0c;安全&#xff08;vnpy的狗咬狗害怕&#xff09;。 策略模板&#xff1a; 設置全局參數變量&#xff1a; #導入包 import talib #選擇合約代碼 code1 #設…

eBay是如何進行大數據集元數據發現的

很多大數據系統每天都會收集數PB的數據。這類系統通常主要用于查詢給定時間范圍內的原始數據記錄&#xff0c;并使用了多個數據過濾器。但是&#xff0c;要發現或識別存在于這些大型數據集中的唯一屬性可能很困難。 在大型數據集上執行運行時聚合&#xff08;例如應用程序在特定…

職業發展 先“立功”還是先“安內”?

導讀&#xff1a;職業生涯更上一層樓&#xff0c;章良躊躇滿志&#xff0c;想在短期內建功立業&#xff0c;奠定江湖地位。但他清楚&#xff0c;自己運籌中的分公司服務升級計劃&#xff0c;對公司整體和自己的職業生涯都非常有利&#xff0c;卻將不可避免地轉移老將掌握的部分…