1 引言
關于backtrader东且,前兩篇推文《
手把手教你】入門量化回測最強神器backtrader(一)
》和《
【手把手教你】入門量化回測最強神器backtrader(二)
》分別介紹了整個框架的組成部分和回測系統(tǒng)的運行创夜,以及策略模塊交易日志的編寫和策略參數(shù)的尋優(yōu)。本文在這兩篇文章的基礎上,著重介紹backtrader的Analyzers模塊,并對策略的業(yè)績評價指標進行可視化分析。Analyzers模塊涵蓋了評價一個量化策略的完整指標,如常見的夏普比率盯漂、年化收益率、最大回撤笨农、Calmar比率等等就缆。Analyzers模塊原生代碼能獲取的評價指標如下圖所示,其中TradeAnalyzer和PeriodStats又包含了不少指標谒亦。由于采用元編程违崇,Analyzers的擴展性較強,可以根據(jù)需要添加自己的分析指標诊霹,如獲取回測期間每一時刻對應的總資金羞延。
2Python實現(xiàn)代碼
01 策略模塊編寫
再次回顧一下交易策略模塊(Strategy)的組成部分。交易策略類代碼通常包含參數(shù)或函數(shù)名如下:
(1)params-全局參數(shù)脾还,可選:更改交易策略中變量/參數(shù)的值伴箩,可用于參數(shù)調優(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ù)妖爷,策略模塊最核心的部分。
(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 回測設置
回測系統(tǒng)設置與之前一樣惯殊,主要是數(shù)據(jù)加載、交易本金也殖、手續(xù)費土思、交易數(shù)量的設置,此處以tushare的舊接口獲取股票002537的交易數(shù)據(jù)進行量化回測忆嗜。
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回測系統(tǒng)設置???????????????????????????
cerebro?=?bt.Cerebro()??
#?加載數(shù)據(jù)
cerebro.adddata(data)?
#?將交易策略加載到回測系統(tǒng)中
cerebro.addstrategy(MyStrategy)?
#?設置初始資本為100,000
cerebro.broker.setcash(100000.0)?
#每次固定交易數(shù)量
cerebro.addsizer(bt.sizers.FixedSize,?stake=1000)?
#手續(xù)費
cerebro.broker.setcommission(commission=0.001)?
03 運行回測
這里重點是Analyzers模塊的調用與結果輸出己儒,調用模塊是cerebro.addanalyzer(),再從模塊中獲取分析指標捆毫,如夏普比率是bt.analyzers.SharpeRatio闪湾,然后是給該指標重命名方便之后調用,即 _name='SharpeRatio'绩卤。要獲取分析指標途样,需要先執(zhí)行回測系統(tǒng),cerebro.run()濒憋,并將回測結果賦值給變量results何暇,分析指標存儲在results[0]里 (strat變量代替),通過strat.analyzers.SharpeRatio.get_analysis()即可獲取相應數(shù)據(jù)凛驮,其他指標操作方法類似裆站。
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)資金變動圖:可以看到在實施交易策略的數(shù)據(jù)期內(nèi),資金的盈利/損失遏插。
(2)交易收益/虧損捂贿。藍色(紅色)點表示獲利(虧損)交易以及獲利(虧損)多少。
(3)價格圖表胳嘲。綠色和紅色箭頭分別表示交易策略的進入點和退出點厂僧。黑線是交易標的隨時間變化的價格, 條形圖表示每個條形圖期間資金的交易量了牛。
%matplotlib?inline?
cerebro.plot()
05 Analyzers模塊指標可視化
下面是對Analyzers模塊涵蓋的策略評價指標進行可視化颜屠。通過Analyzers獲取的評價指標返回的是字典形式,為更好地展示結果鹰祸,本文將其這些分析指標的值進行表格和圖形化甫窟,采用plotly和dash進行動態(tài)可視化(也可以使用pyecharts)。?下圖中用到的所有評價指標的獲取方法與上述的夏普比率和最大回撤是一樣的蛙婴,由于這部分內(nèi)容涉及的代碼較多粗井,此處省略。通過圖形和績效評價指標可以直觀的看出量化策略的表現(xiàn)街图,輸出結果如下:
3 結語
本文以RSI技術指標構建擇時策略為例浇衬,著重介紹了Analyzers模塊的調用方法和結果報告,并對回測的評價指標進行可視化餐济。通過上述圖表可見backtrader作為一個本地開源框架的強大之處耘擂,只需適當?shù)脑O置,便可得到與量化平臺類似的回測效果絮姆。最后醉冤,學習沒有捷徑,要想全面而深入地學習backtrader篙悯,最好是研讀其官方文檔蚁阳。當然,編程能力較強的可以直接研究其安裝包的原生代碼鸽照,了解各個模塊的構成螺捐,并進行功能擴展和數(shù)據(jù)源對接等。
參考資料:backtrader官方文檔和安裝包原生代碼
https://www.backtrader.com/docu/
關于Python金融量化
專注于分享Python在金融量化領域的應用移宅。加入【