原創文章第72篇,專注“個人成長與財富自由、世界運作的邏輯, AI量化投資”。
backtrader最大的優點,它是面向交易的。
市面上很多開源的框架,更像是學術的,面向研究和學習的。離生產環境還比較遠,包括qlib。
國內的vnpy算是功能完善度比較高的,口號是“by traders, for traders”,大致就是這樣的目標,但vnpy的程式碼有點重,安裝和使用較複雜。
01 交易條件
交易條件的設定要儘可能“高度模擬”真實交易場景。交易條件設定,最常見的有初始資金、交易稅費、滑點、期貨保證金比率等。對成交量做限制、對漲跌幅做限制、對訂單生成和執行時機做限制。交易條件可以透過 Broker來管理
方式1:透過設定backtrader。brokers。BackBroker() 類中的引數,生成新的broker例項,再將新的例項賦值給cerebro。broker ;
方式2:透過呼叫broker中的”set_xxx“ 方法來修改條件,還可透過”get_xxx“ 方法檢視當前設定的條件取值。
一般推薦使用方式2:
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)
02 滑點
一般滑點在所難免,由於網路延時、市場波動等原因。
滑點分為百分比、固定兩種。以高於+p的價格買,以低於-P的價格賣出。
若二者均設定,則百分比優先順序高。
cerebro。broker。set_slippage_perc(0。0001)cerebro。broker。set_slippage_fixed(0。03)
03 交易費用
交易費用不可忽視,尤其是在交易頻率比較高的策略中。
bt中簡單配置交易費用很容易,但如果要更真實的模擬市場,則需要了解一些細節。
比如交易費率為“萬分之三”,買賣都收,直接setcommission即可。
cerebro。broker。setcommission(0。0003)
但A股實際上還有一個單筆不低於5元,且賣出還有印花稅。
這就需要繼承bt。CommInfoBase,然後自己寫計算邏輯。
class MyStockCommissionScheme(bt。CommInfoBase): ‘’‘ 1。佣金按照百分比。 2。每一筆交易有一個最低值,比如5塊,當然有些券商可能會免5。 3。賣出股票還需要收印花稅。 4。可能有的平臺還需要收平臺費。 ’‘’ params = ( (‘stampduty’, 0。005), # 印花稅率 (‘commission’, 0。005), # 佣金率 (‘stocklike’, True),#股票類資產,不考慮保證金 (‘commtype’, bt。CommInfoBase。COMM_PERC),#按百分比 (‘minCommission’, 5),#最小佣金 (‘platFee’, 0),#平臺費用 ) def _getcommission(self, size, price, pseudoexec): ‘’‘ size>0,買入操作。 size<0,賣出操作。 ’‘’ if size > 0: # 買入,不考慮印花稅,需要考慮最低收費 return max(size * price * self。p。commission,self。p。minCommission)+platFee elif size < 0: # 賣出,考慮印花稅。 return max(abs(size) * price * self。p。commission,self。p。minCommission)+abs(size) * price * self。p。stampduty+platFee else: return 0 # 防止特殊情況下size為0。cerebro。broker。setcommission(0。0003)cerebro。broker。addcommissioninfo(MyStockCommissionScheme())
04 交易訂單型別
回測中使用比較多的還是
市價單和限價單
。
bt支援
市值,限價,止損,止損限價,止損追蹤,止損追蹤限價
。
預設是市價單,就是使用下一個Bar的open來交易。
self。buy(exectype=bt。Order。Market)
05 交易函式
策略的核心就是依照計算好的規則,向broker釋出交易指令。
指令有
常規的買或賣
,或
有按目標下單
。
常規買賣就是 buy, sell, close。買、賣和平倉。
而目標下單函式會根據交易目標自動確定買賣方向。
1, order_target_size,成交後到多少份
2,order_target_value,成交後倉位到多少
3, order_target_percent,成交後倉位佔比
# 按目標數量下單self。order = self。order_target_size(target=size)# 按目標金額下單self。order = self。order_target_value(target=value)# 按目標百分比下單self。order = self。order_target_percent(target=percent)
有了這些準備工作,明天可以開始寫策略。