量化投資學習筆記01——初識Pyalgotrade量化交易回測框架

年初學習量化投資,一開始想本身從頭寫,仍是受了C/C++的影響。結果困在了計算回測數據那裏,結果老也不對,就暫時放下了。最近試了一下python的各個量化投資框架,發現一個能用的——pyalgotrade,從新開始吧。這是一個事件驅動型量化交易框架。
使用pyalgotrade的一大問題是數據獲取,其支持從yahoo,谷歌等途徑得到數據,但要獲取A股數據比較麻煩。仍是用tushare獲取數據比較方便。但pyalgotrade並不直接支持tushare數據格式。網上有人介紹了將tushare數據轉換成pyalgotrade能接受的數據源的方法,我先按照其方法本身寫了一個tsfeed的程序,用於將從tushare獲取的數據轉化成pyalgotrade能夠接受的數據。後來忽然發現有個現成的:pyalgotrade_tushare。試用了一下,比我寫的好,就用它吧。用pip install pyalgotrade_tushare 安裝便可。
如今就開始幹活了。先要測試一下pyalgotrade回測數據對不對。我找了個參照標準:在聚寬上開通了個帳號,按入門教程寫了個策略:2016-2018年每一個交易日買入100股平安銀行(000001),回測結果以下:
如今用pyalgotrade來實現一下這個策略。先用tushare下載平安銀行及滬深300指數的2016年數據。
首先從csv文件創建數據源。
from pyalgotrade_tushare import tools, barfeed    


instruments = ["000001"]    
feeds = tools.build_feed(instruments, 2016, 2018, "histdata")
若是沒有下載過數據,會自動下載之後存到histdata目錄裏,若是下載過,就自動使用目錄裏的數據了。feeds是BarFeed類型,就是其中的數據驅動pyalgotrade回測框架運行。
接着就從Pyalgotrade.strategy.BacktestingStrategy繼承本身的策略類。
 
class  MyStrategy(strategy.BacktestingStrategy):    
def __init__(self, feed, instrument, brk):        super().__init__(feed, brk)        self.__position = None        self.__instrument = instrument        self.getBroker()        self.__cost = 0.0    def onEnterOk(self, position):        execInfo = position.getEntryOrder().getExecutionInfo()        def onEnterCanceled(self, position):        self.__position = None    def onExitOk(self, position):        execInfo = position.getExitOrder().getExecutionInfo()        self.info("賣出 %.2f" % (execInfo.getPrice()))        self.__position = None    def onExitCanceled(self, position):        # If the exit was canceled, re-submit it.        
        self.__position.exitMarket()            def onBars(self, bars):         brk = self.getBroker()        shares = 100        price = bars[self.__instrument].getPrice()         if brk.getCash() < price*shares:              self.info("現金不足")              return         self.__position = self.enterLong(self.__instrument, shares, True)        self.__cost += brk.getCommission().calculate(brk, price, shares)        self.info("可用現金%.2f 股價%.2f 持股數量%d 市值1:%.2f 市值2:%.2f 計算市值:%.2f 交易成本%.2f" % (brk.getCash(), price, brk.getShares(self.__instrument), brk.getEquity(), self.getResult(), (brk.getCash() + brk.getShares(self.__instrument)*price), self.__cost))              

# x = input(&quot;按任意鍵繼續&quot;)
其中onBar是必須重寫的,即每次數據更新要執行的操做。
而後設置手續費,滑點等設置。
 
# 設置手續費    
broker_commision = broker.backtesting.TradePercentage(0.0003)    
brk = broker.backtesting.Broker(cash, feeds, broker_commision)

 

Broker對象是進行交易的類。
而後生成策略對象:
myStrategy = MyStrategy(feeds,     instruments[0], brk)

 

接下來生成用於計算回測指標的四個對象,並將其添加進入策略中:
 
retAnalyzer = returns.Returns()    
myStrategy.attachAnalyzer(retAnalyzer)    
sharpeAnalyzer = sharpe.SharpeRatio()    
myStrategy.attachAnalyzer(sharpeAnalyzer)    
drawDownAnalyzer = drawdown.DrawDown()   
myStrategy.attachAnalyzer(drawDownAnalyzer)     
tradesAnalyzer = trades.Trades()     
myStrategy.attachAnalyzer(tradesAnalyzer)

 

若是要做圖,相似的,也要將繪圖對象添加進入策略對象。
from pyalgotrade import plotter     


plter = plotter.StrategyPlotter(myStrategy)    
plter.getOrCreateSubplot("return").addDataSeries("retuens", retAnalyzer.getReturns())   
plter.getOrCreateSubplot("CumReturn").addDataSeries("CumReturn",retAnalyzer.getCumulativeReturns
準備工做作完,就能夠執行回測了,用
myStrategy.run()
執行之後就能夠輸出回測結果,輸出圖形了。限於篇幅,就不放代碼了。詳細代碼見:
如今來看看回測結果。
其中年化收益率那裏應該是三年的策略收益,這樣看兩個的回測結果是基本一致的,但並不徹底一致。緣由呢?
我看了一下每一個交易日的狀況:
聚寬上面的:
我本地文件裏的數據
在本地輸出每一個交易日的狀況:
能夠看到2016-01-05,聚寬的股價數據是8.99,tushare下載的數據是9.07。2016-01-06,聚寬的數據是9.10,tushare是9.179。
我在聚寬的論壇裏發帖問了,被告知多是數據復權方法,滑點設置等差別引發的。另外,pyalgotrade貌似是第一天產生交易信號次日再執行交易。好在差異也不大,就這樣吧。還有一些問題,好比pyalgotrade裏貌似沒有沒有直接計算alpha值,beta值,信息比率等數據的函數,用到了再說吧。
最後再總結一下用pyalgotrade進行量化交易回測的通常步驟:
①用數據生成BarFeed對象,做爲驅動框架的數據來源。
②用Broker對象設置交易成本,滑點等。
③從strategy.BacktestingStrategy創建Strategy對象,並重寫onBars成員函數,其內容爲每次交易事件時都要執行的動做。其中可能會用到technical對象,用於計算一些技術指標。
④實例化strategy對象,創建回測指標對象和繪圖對象,並將它們與strategy綁定。
⑤執行回測。
⑥輸出回測結果,繪圖。
下一步,該真正進行量化交易策略的學習研究了。
 
我發文章的四個地方,歡迎你們在朋友圈等地方分享,歡迎點「在看」。
個人我的博客地址: https://zwdnet.github.io
個人CSDN博客地址: https://blog.csdn.net/zwdnet
個人博客園博客地址: https://www.cnblogs.com/zwdnet/
個人微信我的訂閱號:趙瑜敏的口腔醫學學習園地
 
相關文章
相關標籤/搜索