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

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在金融量化領域的應用移宅。加入【

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末归粉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子漏峰,更是在濱河造成了極大的恐慌糠悼,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浅乔,死亡現(xiàn)場離奇詭異倔喂,居然都是意外死亡铝条,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門席噩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來班缰,“玉大人,你說我怎么就攤上這事悼枢〔和” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵馒索,是天一觀的道長莹妒。 經(jīng)常有香客問我,道長绰上,這世上最難降的妖魔是什么旨怠? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蜈块,結果婚禮上鉴腻,老公的妹妹穿的比我還像新娘。我一直安慰自己百揭,他們只是感情好爽哎,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著信峻,像睡著了一般倦青。 火紅的嫁衣襯著肌膚如雪瓮床。 梳的紋絲不亂的頭發(fā)上盹舞,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音隘庄,去河邊找鬼踢步。 笑死,一個胖子當著我的面吹牛丑掺,可吹牛的內(nèi)容都是我干的获印。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼街州,長吁一口氣:“原來是場噩夢啊……” “哼兼丰!你這毒婦竟也來了?” 一聲冷哼從身側響起唆缴,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤鳍征,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后面徽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艳丛,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡匣掸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了氮双。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碰酝。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖戴差,靈堂內(nèi)的尸體忽然破棺而出送爸,到底是詐尸還是另有隱情,我是刑警寧澤暖释,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布碱璃,位于F島的核電站,受9級特大地震影響饭入,放射性物質發(fā)生泄漏嵌器。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一谐丢、第九天 我趴在偏房一處隱蔽的房頂上張望爽航。 院中可真熱鬧,春花似錦乾忱、人聲如沸讥珍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衷佃。三九已至,卻和暖如春蹄葱,著一層夾襖步出監(jiān)牢的瞬間氏义,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工图云, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惯悠,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓竣况,卻偏偏與公主長得像克婶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子丹泉,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容