年初學習量化投資,一開始想自己從頭寫,還是受了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),回測結果如下:
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))其中onBar是必須重寫的,即每次資料更新要執行的操作, 然后設定手續費,滑點等設定,
# x = input("按任意鍵繼續")
# 設定手續費 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)準備作業做完,就可以執行回測了,用 myStrategy.run() 執行以后就可以輸出回測結果,輸出圖形了,限于篇幅,就不放代碼了,詳細代碼見: https://github.com/zwdnet/MyQuant/blob/master/01/testdata.py 現在來看看回測結果,
plter.getOrCreateSubplot("return").addDataSeries("retuens", retAnalyzer.getReturns())
plter.getOrCreateSubplot("CumReturn").addDataSeries("CumReturn",retAnalyzer.getCumulativeReturns
其中年化收益率那里應該是三年的策略收益,這樣看兩個的回測結果是基本一致的,但并不完全一致,原因呢?
我看了一下每個交易日的情況:
聚寬上面的:
我本地檔案里的資料
在本地輸出每個交易日的情況:
可以看到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/
我的微信個人訂閱號:趙瑜敏的口腔醫學學習園地
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/100352.html
標籤:其他
上一篇:正向代理與反向代理【總結】
下一篇:機器學習優化演算法
