【手把手教你】入門量化回測最強神器backtrader(一)

1 引言

目前基于Python的量化回測框架有很多,開源框架有zipline、vnpy、pyalgotrader和backtrader等,而量化平臺有Quantopian(國外)、聚寬、萬礦、優(yōu)礦、米筐、掘金等,這些量化框架或平臺各有優(yōu)劣。就個人而言,比較偏好用backtrader,因為它功能十分完善,有完整的使用文檔,安裝相對簡單(直接pip安裝即可)。優(yōu)點是運行速度快,支持pandas的矢量運算;支持參數(shù)自動尋優(yōu)運算,內(nèi)置了talib股票分析技術指標庫;支持多品種、多策略、多周期的回測和交易;支持pyflio、empyrica分析模塊庫、alphalens多因子分析模塊庫等;擴展靈活,可以集成TensorFlow、PyTorch和Keras等機器學習、神經(jīng)網(wǎng)絡分析模塊。而不足之處在于,backtrader學習起來相對復雜,編程過程中使用了大量的元編程(類class),如果Python編程基礎不扎實(尤其是類的操作),學起來會感到吃力。本文作為backtrader的入門系列之一,對其運行框架進行簡要介紹,并以實際案例展示量化回測的過程。

2 backtrader簡介

如果將backtrader包分解為核心組件,主要包括以下組成部分:

(1)數(shù)據(jù)加載(Data Feed):將

交易策略的數(shù)據(jù)加載到回測框架中。??

(2)交易策略(Strategy):該模塊是編程過程中最復雜的部分,需要設計交易決策,得出買入/賣出信號。

(3)回測框架設置(?Cerebro):需要設置(i)初始資金(ii)傭金(iii)數(shù)據(jù)饋送(iv)交易策略(v)交易頭寸大小。

(4)運行回測:運行Cerebro回測并打印出所有已執(zhí)行的交易。

(5)評估性能(Analyzers):以圖形和風險收益等指標對交易策略的回測結果進行評價。

“Lines”是backtrader回測的數(shù)據(jù),由一系列的點組成,通常包括以下類別的數(shù)據(jù):Open(開盤價), High(最高價), Low(最低價), Close(收盤價), Volume(成交量), OpenInterest(無的話設置為0)。Data Feeds(數(shù)據(jù)加載)、Indicators(技術指標)和Strategies(策略)都會生成 Lines。價格數(shù)據(jù)中的所有”O(jiān)pen” (開盤價)按時間組成一條 Line。所以,一組含有以上6個類別的價格數(shù)據(jù),共有6條 Lines。如果算上“DateTime”(時間,可以看作是一組數(shù)據(jù)的主鍵),一共有7條 Lines。當訪問一條 Line 的數(shù)據(jù)時,會默認指向下標為 0 的數(shù)據(jù)。最后一個數(shù)據(jù)通過下標 -1 來訪問,在-1之后是索引0,用于訪問當前時刻。因此,在回測過程中,無需知道已經(jīng)處理了多少條/分鐘/天/月,”0”一直指向當前值,下標 -1 來訪問最后一個值。

3 回測應用實例

量化回測說白了是使用歷史數(shù)據(jù)去驗證交易策略的性能,因此回測的第一步是搭建交易策略,這也是backtrader要設置的最重要和復雜的部分,策略設定好后,其余部分的代碼編寫是手到擒來。

01 構建策略(Strategy)

交易策略類代碼包含重要的參數(shù)和用于執(zhí)行策略的功能,要定義的參數(shù)或函數(shù)名如下:

(1)params-全局參數(shù),可選:更改交易策略中變量/參數(shù)的值,可用于參數(shù)調(diào)優(yōu)。?

(2)log:日志,可選:記錄策略的執(zhí)行日志,可以打印出該函數(shù)提供的日期時間和txt變量。

(3) __init__:用于初始化交易策略的類實例的代碼。?

(4)notify_order,可選:跟蹤交易指令(order)的狀態(tài)。order具有提交,接受,買入/賣出執(zhí)行和價格,已取消/拒絕等狀態(tài)。?

(5)notify_trade,可選:跟蹤交易的狀態(tài),任何已平倉的交易都將報告毛利和凈利潤。?

(6)next,必選:制定交易策略的函數(shù),策略模塊最核心的部分。

下面以一個簡單的單均線策略為例,展示backtrader的使用過程,即當收盤價上漲突破20日均線買入(做多),當收盤價下跌跌穿20日均線賣出(做空)。為簡單起見,不報告交易回測的日志,因此log、notify_order和notify_trade函數(shù)省略不寫。

classmy_strategy1(bt.Strategy):

#全局設定交易策略的參數(shù)

params=(

('maperiod',20),

)

def__init__(self):

#指定價格序列

self.dataclose=self.datas[0].close

#?初始化交易指令、買賣價格和手續(xù)費

self.order?=None

self.buyprice?=None

self.buycomm?=None

#添加移動均線指標,內(nèi)置了talib模塊

self.sma?=?bt.indicators.SimpleMovingAverage(

self.datas[0],?period=self.params.maperiod)

defnext(self):

ifself.order:#?檢查是否有指令等待執(zhí)行,?

return

#?檢查是否持倉???

ifnotself.position:#?沒有持倉

#執(zhí)行買入條件判斷:收盤價格上漲突破20日均線

ifself.dataclose[0]?>?self.sma[0]:

#執(zhí)行買入

self.order?=?self.buy(size=500)

else:

#執(zhí)行賣出條件判斷:收盤價格跌破20日均線

ifself.dataclose[0]?<?self.sma[0]:

#執(zhí)行賣出

self.order?=?self.sell(size=500)

02 數(shù)據(jù)加載(Data Feeds)

策略設計好后,第二步是數(shù)據(jù)加載,backtrader提供了很多數(shù)據(jù)接口,包括quandl(美股)、yahoo、pandas格式數(shù)據(jù)等,我們主要分析A股數(shù)據(jù)。

mpl.rcParams['axes.unicode_minus']=False

#先引入后面可能用到的包(package)

importpandasaspd

fromdatetimeimportdatetime

importbacktraderasbt

importmatplotlib.pyplotasplt

%matplotlib?inline

#正常顯示畫圖時出現(xiàn)的中文和負號

frompylabimportmpl

mpl.rcParams['font.sans-serif']=['SimHei']

使用tushare獲取浦發(fā)銀行(代碼:600000)數(shù)據(jù)。

#使用tushare舊版接口獲取數(shù)據(jù)

importtushareasts

defget_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']=0

df=df[['open','high','low','close','volume','openinterest']]

returndf

dataframe=get_data('600000')

#回測期間

start=datetime(2010,?3,?31)

end=datetime(2020,?3,?31)

#?加載數(shù)據(jù)

data?=?bt.feeds.PandasData(dataname=dataframe,fromdate=start,todate=end)

03 回測設置(Cerebro)

回測設置主要包括幾項:回測系統(tǒng)初始化,數(shù)據(jù)加載到回測系統(tǒng),添加交易策略, broker設置(如交易資金和交易傭金),頭寸規(guī)模設置作為策略一部分的交易規(guī)模等,最后顯示執(zhí)行交易策略時積累的總資金和凈收益。?

#?初始化cerebro回測系統(tǒng)設置???????????????????????????

cerebro?=?bt.Cerebro()

#將數(shù)據(jù)傳入回測系統(tǒng)

cerebro.adddata(data)

#?將交易策略加載到回測系統(tǒng)中

cerebro.addstrategy(my_strategy1)

#?設置初始資本為10,000

startcash?=10000

cerebro.broker.setcash(startcash)

#?設置交易手續(xù)費為?0.2%

cerebro.broker.setcommission(commission=0.002)

04 執(zhí)行回測

輸出回測結果。

print(f'凈收益:{round(pnl,2)}')

d1=start.strftime('%Y%m%d')

d2=end.strftime('%Y%m%d')

print(f'初始資金:{startcash}\n回測期間:{d1}:{d2}')

#運行回測系統(tǒng)

cerebro.run()

#獲取回測結束后的總資金

portvalue?=?cerebro.broker.getvalue()

pnl?=?portvalue?-?startcash

#打印結果

print(f'總資金:{round(portvalue,2)}')

結果如下:

初始資金:?10000

回測期間:20100331:20200331

總資金:?12065.36

凈收益:?2065.36

05 可視化

對上述結果進行可視化,使用內(nèi)置的matplotlib畫圖。至此,簡單的單均線回測就完成了。下面圖形展示了浦發(fā)銀行在回測期間的價格走勢、買賣點和交易總資金的變化等。當然,本文著重以最簡化的例子展示backtrader的框架和運行過程,要想更詳細的展示回測過程和結果,還需要加入其他函數(shù)和模塊,關于Analyzers分析模塊的應用請留意下一篇推文。

%matplotlib?inline?#在jupyter notebook上運行

cerebro.plot(style='candlestick')

4 結語

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

參考資料:

backtrader官方文檔:

https://www.backtrader.com/docu/


關于Python金融量化

專注于分享Python在金融量化領域的應用。加入知識星球,可以免費獲取量化投資視頻資料、量化金融相關PDF資料、公眾號文章Python完整源碼、量化投資前沿分析框架,與博主直接交流、結識圈內(nèi)朋友等。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容