
1 引言
目前基于Python的量化回測框架有很多,開源框架有zipline、vnpy、pyalgotrader和backtrader等,而量化平臺有Quantopian(國外)、聚寬、萬礦、優礦、米筐、掘金等,這些量化框架或平臺各有優劣。就個人而言,比較偏好用backtrader,因為它功能十分完善,有完整的使用文檔,安裝相對簡單(直接pip安裝即可)。優點是運行速度快,支持pandas的矢量運算;支持參數自動尋優運算,內置了talib股票分析技術指標庫;支持多品種、多策略、多周期的回測和交易;支持pyflio、empyrica分析模塊庫、alphalens多因子分析模塊庫等;擴展靈活,可以集成TensorFlow、PyTorch和Keras等機器學習、神經網絡分析模塊。而不足之處在于,backtrader學習起來相對復雜,編程過程中使用了大量的元編程(類class),如果Python編程基礎不扎實(尤其是類的操作),學起來會感到吃力。本文作為backtrader的入門系列之一,對其運行框架進行簡要介紹,并以實際案例展示量化回測的過程。
2 backtrader簡介
如果將backtrader包分解為核心組件,主要包括以下組成部分:
(1)數據加載(Data Feed):將交易策略的數據加載到回測框架中。
(2)交易策略(Strategy):該模塊是編程過程中最復雜的部分,需要設計交易決策,得出買入/賣出信號。
(3)回測框架設置( Cerebro):需要設置(i)初始資金(ii)傭金(iii)數據饋送(iv)交易策略(v)交易頭寸大小。
(4)運行回測:運行Cerebro回測并打印出所有已執行的交易。
(5)評估性能(Analyzers):以圖形和風險收益等指標對交易策略的回測結果進行評價。
“Lines”是backtrader回測的數據,由一系列的點組成,通常包括以下類別的數據:Open(開盤價), High(最高價), Low(最低價), Close(收盤價), Volume(成交量), OpenInterest(無的話設置為0)。Data Feeds(數據加載)、Indicators(技術指標)和Strategies(策略)都會生成 Lines。價格數據中的所有”Open” (開盤價)按時間組成一條 Line。所以,一組含有以上6個類別的價格數據,共有6條 Lines。如果算上“DateTime”(時間,可以看作是一組數據的主鍵),一共有7條 Lines。當訪問一條 Line 的數據時,會默認指向下標為 0 的數據。最后一個數據通過下標 -1 來訪問,在-1之后是索引0,用于訪問當前時刻。因此,在回測過程中,無需知道已經處理了多少條/分鐘/天/月,”0”一直指向當前值,下標 -1 來訪問最后一個值。

3 回測應用實例
量化回測說白了是使用歷史數據去驗證交易策略的性能,因此回測的第一步是搭建交易策略,這也是backtrader要設置的最重要和復雜的部分,策略設定好后,其余部分的代碼編寫是手到擒來。
01構建策略(Strategy)
交易策略類代碼包含重要的參數和用于執行策略的功能,要定義的參數或函數名如下:
(1)params-全局參數,可選:更改交易策略中變量/參數的值,可用于參數調優。
(2)log:日志,可選:記錄策略的執行日志,可以打印出該函數提供的日期時間和txt變量。
(3) __init__:用于初始化交易策略的類實例的代碼。
(4)notify_order,可選:跟蹤交易指令(order)的狀態。order具有提交,接受,買入/賣出執行和價格,已取消/拒絕等狀態。
(5)notify_trade,可選:跟蹤交易的狀態,任何已平倉的交易都將報告毛利和凈利潤。
(6)next,必選:制定交易策略的函數,策略模塊最核心的部分。
下面以一個簡單的單均線策略為例,展示backtrader的使用過程,即當收盤價上漲突破20日均線買入(做多),當收盤價下跌跌穿20日均線賣出(做空)。為簡單起見,不報告交易回測的日志,因此log、notify_order和notify_trade函數省略不寫。
class my_strategy1(bt.Strategy):#全局設定交易策略的參數params=(('maperiod',20),)def __init__(self):#指定價格序列self.dataclose=self.datas[0].close# 初始化交易指令、買賣價格和手續費self.order = Noneself.buyprice = Noneself.buycomm = None#添加移動均線指標,內置了talib模塊self.sma = bt.indicators.SimpleMovingAverage(self.datas[0], period=self.params.maperiod)def next(self):if self.order: # 檢查是否有指令等待執行, return# 檢查是否持倉 if not self.position: # 沒有持倉#執行買入條件判斷:收盤價格上漲突破20日均線if self.dataclose[0] > self.sma[0]:#執行買入self.order = self.buy(size=500) else:#執行賣出條件判斷:收盤價格跌破20日均線if self.dataclose[0] < self.sma[0]:#執行賣出self.order = self.sell(size=500)
02數據加載(Data Feeds)
策略設計好后,第二步是數據加載,backtrader提供了很多數據接口,包括quandl(美股)、yahoo、pandas格式數據等,我們主要分析A股數據。
mpl.rcParams['axes.unicode_minus']=False
#先引入后面可能用到的包(package)
import pandas as pd
from datetime import datetime
import backtrader as bt
import matplotlib.pyplot as plt
%matplotlib inline #正常顯示畫圖時出現的中文和負號
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']#使用tushare舊版接口獲取數據
import tushare as ts
def get_data(code,start='2010-01-01',end='2020-03-31'):df=ts.get_k_data(code,autype='qfq',start=start,end=end)df.index=pd.to_datetime(df.date)df['openinterest']=0df=df[['open','high','low','close','volume','openinterest']]return df
dataframe=get_data('600000')
#回測期間
start=datetime(2010, 3, 31)
end=datetime(2020, 3, 31)
# 加載數據
data = bt.feeds.PandasData(dataname=dataframe,fromdate=start,todate=end)
03 回測設置(Cerebro)
回測設置主要包括幾項:回測系統初始化,數據加載到回測系統,添加交易策略, broker設置(如交易資金和交易傭金),頭寸規模設置作為策略一部分的交易規模等,最后顯示執行交易策略時積累的總資金和凈收益。
# 初始化cerebro回測系統設置
cerebro = bt.Cerebro()
#將數據傳入回測系統
cerebro.adddata(data)
# 將交易策略加載到回測系統中
cerebro.addstrategy(my_strategy1)
# 設置初始資本為10,000
startcash = 10000
cerebro.broker.setcash(startcash)
# 設置交易手續費為 0.2%
cerebro.broker.setcommission(commission=0.002)
04 執行回測
輸出回測結果。
print(f'凈收益: {round(pnl,2)}')
d1=start.strftime('%Y%m%d')
d2=end.strftime('%Y%m%d')
print(f'初始資金: {startcash}n回測期間:{d1}:{d2}')
#運行回測系統
cerebro.run()
#獲取回測結束后的總資金
portvalue = cerebro.broker.getvalue()
pnl = portvalue - startcash
#打印結果
print(f'總資金: {round(portvalue,2)}')初始資金: 10000
回測期間:20100331:20200331
總資金: 12065.36
凈收益: 2065.36
05可視化
對上述結果進行可視化,使用內置的matplotlib畫圖。至此,簡單的單均線回測就完成了。下面圖形展示了浦發銀行在回測期間的價格走勢、買賣點和交易總資金的變化等。當然,本文著重以最簡化的例子展示backtrader的框架和運行過程,要想更詳細的展示回測過程和結果,還需要加入其他函數和模塊,關于Analyzers分析模塊的應用請留意下一篇推文。
%matplotlib inline #在jupyter notebook上運行
cerebro.plot(style='candlestick')

4 結語
backtrader是目前功能最完善的Python量化回測框架之一(單機版),得到歐洲很多銀行、基金等金融機構的青睞,并應用于實盤交易中。作為入門序列之一,本文簡單介紹了backtrader框架的各個組成部分,然后以20日單均線策略為例,展示了回測系統的編程和運行。公眾號接下來將以專題的形式為大家全面介紹backtrader的應用。學習沒有捷徑,要想全面而深入地學習backtrader回測框架,最好的方法是研讀其官方文檔。
參考資料:
backtrader官方文檔:
https://www.backtrader.com/docu/