01?引言
股票市場自交易以來芙粱,人們就開始孜孜不倦地探索各種各樣的投資理論,其中技術分析是重要的理論之一滑潘。實際上衫哥,技術分析是100多年前創(chuàng)建的股票投資理論化撕,是投資者對股票量價變化長期觀察歸納總結的若干“規(guī)律”。技術分析以市場行為(價格和成交量)為研究對象,以判斷市場趨勢并跟隨趨勢的周期性變化來指導交易,認為市場行為包容一切信息、價格以趨勢方式波動窗宇、歷史會重演。目前特纤,股票分析的技術指標超過1000多種军俊,從功能角度而言,總體可以分為趨勢類捧存、擺動類和能量類指標粪躬。趨勢類指標結合均線特征,根據(jù)股價與指標之間的關系分析股價趨勢強弱昔穴,如MACD指標镰官。擺動類指標根據(jù)股票的成交量、價格和時空吗货,通過公式得出一個數(shù)值泳唠,通過該數(shù)值波動規(guī)律指導交易,如KDJ宙搬、RSI指標笨腥。能量類指標通過分析成交量變化來預測股價波動,如OBV勇垛、VOL指標等脖母。本文主要介紹backtrader回測框架中技術分析指標(indicators)的調用方法、自定義指標的編寫以及技術指標的歷史回測闲孤。
關于backtrader的入門和進階見公眾號系列推文:
(1)【手把手教你】入門量化回測最強神器backtrader(一)
(2)【手把手教你】入門量化回測最強神器backtrader(二)
(3)【手把手教你】入門量化回測最強神器backtrader(三)
(4)backtrader如何加載股票因子數(shù)據(jù)谆级?以換手率、市盈率為例進行回測【附Python代碼】
(5)如何用backtrader對股票組合進行量化回測?
(6)【手把手教你】用backtrader量化回測海龜交易策略
02?Indicators指標調用backtrader回測框架內置了很多技術分析指標肥照,封裝在indicators中脚仔。打開backtrader安裝路徑,以Anaconda為例舆绎,打開\Lib\site-packages\backtrader\玻侥,進入indicators文件夾,可以看到里面有48個py文件亿蒸,文件名是各個技術指標或公示的簡稱,打開這些文件可以進一步了解包含的具體指標掌桩,以及調用的函數(shù)名和參數(shù)等边锁。
以MACD指標為例,使用Notepad++軟件打開macd.py文件波岛,可以看到MACD和MACDHisto兩個類茅坛,其中MACD是計算MACD指標的類,而MACDHisto則是MACD的子類则拷,增加了macd和信號線之間差異的“直方圖”贡蓖,調用的時候直接使用bt.ind.MACD(參數(shù))。下面以常用的MACD煌茬、RSI斥铺、布林帶指標為例,為大家展示其調用方法坛善。
使用tushare獲取數(shù)據(jù)晾蜘,并設置為backtrader的數(shù)據(jù)格式。
import?backtrader?as?bt
import?pandas?as?pd
import?numpy?as?np
import?tushare?as?ts?
def?get_data(code,start='2010-01-01',end='2020-08-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']]
????return?df
dataframe=get_data('600000',start='2015-01-01')
dataframe.head()
寫一個測試策略眠屎,在輸出圖形中呈現(xiàn)MACD剔交、MACD帶柱、RSI和布林帶技術指標改衩。
class?TestStrategy(bt.Strategy):
????def?__init__(self):
????????bt.ind.MACD(self.data)
????????bt.ind.MACDHisto(self.data)
????????bt.ind.RSI(self.data,period=14)
????????bt.ind.BBands(self.data)
將回測系統(tǒng)設置封裝成main函數(shù)岖常,后面還會反復用到。
def?main(data,strategy,pf=False):
????cerebro?=?bt.Cerebro()
????feed?=?bt.feeds.PandasData(dataname=data)
????cerebro.adddata(feed)?
????#加載策略
????cerebro.addstrategy(strategy)
????#?設置初始資本為10,000
????startcash?=?100000
????cerebro.broker.setcash(startcash)?
????#?設置交易手續(xù)費為?0.1%
????cerebro.broker.setcommission(commission=0.001)?
????cerebro.run()
????#獲取回測結束后的總資金
????portvalue?=?cerebro.broker.getvalue()
????pnl?=?portvalue?-?startcash
????if?pf:
????????print(f'總資金:?{round(portvalue,2)}')
????????print(f'凈收益:?{round(pnl,2)}')
????%matplotlib?inline
????cerebro.plot()
回測結果如下圖所示葫督。
data=get_data('601318','2020-03-01')
main(data,TestStrategy)
上述策略只是調用了技術指標用于畫圖竭鞍,下面以MACD指標為例,調用該指標計算MACD柱橄镜,當MACD柱大于0(金叉)時發(fā)出買入信號笼蛛,當MACD柱小于0(死叉)時發(fā)出賣出信號。
class?TradeStrategy(bt.Strategy):
????params=(('p1',12),('p2',26),('p3',9),)
????def?__init__(self):
????????self.order?=?None
????????#獲取MACD柱
????????self.macdhist?=?bt.ind.MACDHisto(self.data,
????????????????????????period_me1=self.p.p1,?
????????????????????????period_me2=self.p.p2,?
????????????????????????period_signal=self.p.p3)
????def?next(self):
????????if?not?self.position:
????????????#?得到當前的賬戶價值
????????????total_value?=?self.broker.getvalue()
????????????#1手=100股蛉鹿,滿倉買入
????????????ss=int((total_value/100)/self.datas[0].close[0])*100
????????????#當MACD柱大于0(紅柱)且無持倉時滿倉買入
????????????if?self.macdhist?>?0:
????????????????self.order=self.buy(size=ss)
????????else:
????????????#當MACD柱小于0(綠柱)且持倉時全部清倉
????????????if?self.macdhist?<?0:
????????????????self.close()
以中國平安股票為例滨砍,使用MACD指標對2010.1-2020.9年數(shù)據(jù)進行歷史回測。
data=get_data('601318','2010-03-01')
main(data,TradeStrategy,pf=True)#期初資金:100000
#期末資金:?225440.47
#凈收益:?125440.47
backtrader的可擴展性很強,除了內置的技術分析指標外惋戏,可以通過類的擴展進行自定義指標领追。20日均線在實戰(zhàn)中具有一定的指導意義,可以根據(jù)價格偏離20日均線的某個閾值構建類似于布林帶的通道線指標响逢。
定義一個指標的類绒窑,該類繼承bt.Indicator,均線采用20日周期舔亭,上下限閾值分別為20%和15%些膨。
class?TrendBand(bt.Indicator):
????lines?=?('mid','top','bot',)
????params?=?(('maperiod',20),
??????????????('period',3),
??????????????('highRate',1.2),
??????????????('lowRate',0.85),)
????#與價格在同一張圖
????plotinfo?=?dict(subplot=False)
????def?__init__(self):
????????ema?=?bt.ind.EMA(self.data,?period=self.p.maperiod)
????????#計算上中下軌線
????????self.l.mid=bt.ind.EMA(ema,period=self.p.period)
????????self.l.top=bt.ind.EMA(self.mid*self.p.highRate,\
??????????????????????????????period=self.p.period)
????????self.l.bot=bt.ind.EMA(self.mid*self.p.lowRate,\
??????????????????????????????period=self.p.period)
????????super(TrendBand,?self).__init__()
首先看一下該指標的圖形。
class?TestStrategy2(bt.Strategy):
????def?__init__(self):
????????TrendBand(self.data)
回測結果:
data=get_data('601318','2010-01-01')
main(data,TestStrategy2)
下面基于該指標構建交易策略并回測钦铺,當價格站在中軌線上订雾,且成交量突破20日新高時買入,當價格突破上軌線時賣出矛洞。
class?MyStrategy(bt.Strategy):
????params=(('period',20),)
????def?__init__(self):
????????self.order?=?None
????????self.mid?=?TrendBand(self.data).mid?
????????self.top?=?TrendBand(self.data).top
????????self.bot?=?TrendBand(self.data).bot
????????#設置買入信號
????????self.buy_sig=bt.And(\
???????????self.data.close>self.mid,\
???????????self.data.volume==bt.ind.Highest(\
???????????self.data.volume,period=self.p.period))
????????#賣出信號
????????self.sell_sig=self.data.close>self.top
????def?next(self):
????????if?not?self.position:
????????????#?得到當前的賬戶價值
????????????total_value?=?self.broker.getvalue()
????????????#1手=100股洼哎,滿倉買入
????????????ss=int((total_value/100)/self.datas[0].close[0])*100
????????????if?self.buy_sig:
????????????????self.order=self.buy(size=ss)
????????else:
????????????if?self.sell_sig:
????????????????self.close()
仍然以中國平安為例,回測結果如下圖所示:
data=get_data('601318','2010-01-01')
main(data,MyStrategy,True)
#期初資金:100000.00
#期末資金:?398949.39
#凈收益:?298949.39
本文主要介紹了backtrader回測框架中indicators的調用沼本、自定義指標的編寫以及歷史回測噩峦。其中自定義指標主要是示例作用,不構成任何投資建議抽兆。歷史回測中僅以中國平安個股為例识补,具有一定的局限性,感興趣的讀者可以參考組合回測那篇推文辫红,對全市場股票進行組合回測以進一步判斷自定義指標的實用性李请。最后再強調一句,學習沒有捷徑厉熟,要想全面而深入地學習backtrader回測框架导盅,最好的方法是研讀其官方文檔。公眾號后臺回復“backtrader”可獲取《backtrader入門指南》的中文文檔揍瑟。
參考資料:
?backtrader官方文檔和安裝包原生代碼
? ? https://www.backtrader.com/docu/
專注于分享Python在金融量化領域的應用白翻。加入知識星球,可以免費獲取量化投資視頻資料绢片、量化金融相關PDF資料滤馍、公眾號文章Python完整源碼、量化投資前沿分析框架底循,與博主直接交流巢株、結識圈內朋友等。