「手把手教你」入門量化回測最強神器backtrader(三)


 

原創 Python金融量化 2020-04-20 09:10:41

1 引言

關於backtrader,前兩篇推文《【手把手教你】入門量化回測最強神器backtrader(一)》和《【手把手教你】入門量化回測最強神器backtrader(二)》分別介紹了整個框架的組成部分和回測系統的運行,以及策略模塊交易日志的編寫和策略參數的尋優。本文在這兩篇文章的基礎上,着重介紹backtrader的Analyzers模塊,並對策略的業績評價指標進行可視化分析。Analyzers模塊涵蓋了評價一個量化策略的完整指標,如常見的夏普比率、年化收益率、最大回撤、Calmar比率等等。Analyzers模塊原生代碼能獲取的評價指標如下圖所示,其中TradeAnalyzer和PeriodStats又包含了不少指標。由於采用元編程,Analyzers的擴展性較強,可以根據需要添加自己的分析指標,如獲取回測期間每一時刻對應的總資金。

 

「手把手教你」入門量化回測最強神器backtrader(三)

 

 

2 Python實現代碼

01 策略模塊編寫

再次回顧一下交易策略模塊(Strategy)的組成部分。交易策略類代碼通常包含參數或函數名如下:

(1)params-全局參數,可選:更改交易策略中變量/參數的值,可用於參數調優。

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

(3) init:用於初始化交易策略的類實例的代碼。

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

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

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

(7)其他,包括start()、nextsstart()、stop()、prenext()、notify_fund()、notify_store()和notify_cashvalue。

 

下面以技術分析指標RSI(不了解的請自行百度)的擇時策略為例,當RSI<30時買入,RSI>70時賣出。為了簡便起見,策略模塊中只包含最核心的交易信號。

 

import pandas as pd
import backtrader as bt
from datetime import datetime
class MyStrategy(bt.Strategy):
    params=(('short',30),
            ('long',70),)
    def __init__(self):
        self.rsi = bt.indicators.RSI_SMA(
                   self.data.close, period=21)
    def next(self):
        if not self.position:
            if self.rsi < self.params.short:
                self.buy()
        else:
            if self.rsi > self.params.long:
                self.sell()

02 回測設置

回測系統設置與之前一樣,主要是數據加載、交易本金、手續費、交易數量的設置,此處以tushare的舊接口獲取股票002537的交易數據進行量化回測。

from __future__ import (absolute_import, division, print_function,  
                        unicode_literals) 
import tushare as ts
#以股票002537為例
df=ts.get_k_data('002537',start='2010-01-01')
df.index=pd.to_datetime(df.date)
#df['openinterest'] = 0
df=df[['open','high','low','close','volume']]
data = bt.feeds.PandasData(dataname=df,                               
                            fromdate=datetime(2013, 1, 1),                               
                            todate=datetime(2020, 4, 17) )
# 初始化cerebro回測系統設置                           
cerebro = bt.Cerebro()  
# 加載數據
cerebro.adddata(data) 
# 將交易策略加載到回測系統中
cerebro.addstrategy(MyStrategy) 
# 設置初始資本為100,000
cerebro.broker.setcash(100000.0) 
#每次固定交易數量
cerebro.addsizer(bt.sizers.FixedSize, stake=1000) 
#手續費
cerebro.broker.setcommission(commission=0.001) 

03 運行回測

這里重點是Analyzers模塊的調用與結果輸出,調用模塊是cerebro.addanalyzer(),再從模塊中獲取分析指標,如夏普比率是bt.analyzers.SharpeRatio,然后是給該指標重命名方便之后調用,即 _name='SharpeRatio'。要獲取分析指標,需要先執行回測系統,cerebro.run(),並將回測結果賦值給變量results,分析指標存儲在results[0]里 (strat變量代替),通過strat.analyzers.SharpeRatio.get_analysis()即可獲取相應數據,其他指標操作方法類似。

 

print('初始資金: %.2f' % cerebro.broker.getvalue())
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name = 'SharpeRatio')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='DW')
results = cerebro.run()
strat = results[0]
print('最終資金: %.2f' % cerebro.broker.getvalue())
print('夏普比率:', strat.analyzers.SharpeRatio.get_analysis())
print('回撤指標:', strat.analyzers.DW.get_analysis())

 

輸出結果:
初始資金: 100000.00
最終資金: 110215.33
夏普比率: OrderedDict([('sharperatio', 0.094)])
回撤指標: AutoOrderedDict([('len', 280), ('drawdown', 1.01), ('moneydown', 1126.60), ('max', AutoOrderedDict([('len', 280), ('drawdown', 3.61), ('moneydown', 4016.60)]))])

 

04 回測結果可視化

下面輸出回測圖表,一張大圖上包含了三張圖:

(1)資金變動圖:可以看到在實施交易策略的數據期內,資金的盈利/損失。
(2)交易收益/虧損。藍色(紅色)點表示獲利(虧損)交易以及獲利(虧損)多少。
(3)價格圖表。綠色和紅色箭頭分別表示交易策略的進入點和退出點。黑線是交易標的隨時間變化的價格, 條形圖表示每個條形圖期間資金的交易量。

 

%matplotlib inline 
cerebro.plot()

 

「手把手教你」入門量化回測最強神器backtrader(三)

 

 

05 Analyzers模塊指標可視化

 

下面是對Analyzers模塊涵蓋的策略評價指標進行可視化。通過Analyzers獲取的評價指標返回的是字典形式,為更好地展示結果,本文將其這些分析指標的值進行表格和圖形化,采用plotly和dash進行動態可視化(也可以使用pyecharts)。 下圖中用到的所有評價指標的獲取方法與上述的夏普比率和最大回撤是一樣的,由於這部分內容涉及的代碼較多,此處省略(完整代碼見【金融量化】知識星球)。通過圖形和績效評價指標可以直觀的看出量化策略的表現,輸出結果如下:

 

「手把手教你」入門量化回測最強神器backtrader(三)

 

 

「手把手教你」入門量化回測最強神器backtrader(三)

 

 

「手把手教你」入門量化回測最強神器backtrader(三)

 

 

「手把手教你」入門量化回測最強神器backtrader(三)

 

 

3結語

本文以RSI技術指標構建擇時策略為例,着重介紹了Analyzers模塊的調用方法和結果報告,並對回測的評價指標進行可視化。通過上述圖表可見backtrader作為一個本地開源框架的強大之處,只需適當的設置,便可得到與量化平台類似的回測效果。最后,學習沒有捷徑,要想全面而深入地學習backtrader,最好是研讀其官方文檔。當然,編程能力較強的可以直接研究其安裝包的原生代碼,了解各個模塊的構成,並進行功能擴展和數據源對接等。

參考資料:backtrader官方文檔和安裝包原生代碼

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

關於Python金融量化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM