日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Pyalgotrade量化交易回测框架

發布時間:2025/3/11 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pyalgotrade量化交易回测框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

現在就開始干活了。先要測試一下pyalgotrade回測數據對不對。我找了個參照標準:在聚寬上開通了個賬號,按入門教程寫了個策略:2016-2018年每個交易日買入100股平安銀行(000001),回測結果如下:

現在用pyalgotrade來實現一下這個策略。先用tushare下載平安銀行及滬深300指數的2016年數據。

首先從csv文件建立數據源。

from pyalgotrade_tushare import tools, barfeedinstruments = ["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 = Noneself.__instrument = instrumentself.getBroker()self.__cost = 0.0def onEnterOk(self, position):execInfo = position.getEntryOrder().getExecutionInfo()# self.info("買入 %.2f" % (execInfo.getPrice()))def onEnterCanceled(self, position):self.__position = Nonedef onExitOk(self, position):execInfo = position.getExitOrder().getExecutionInfo()self.info("賣出 %.2f" % (execInfo.getPrice()))self.__position = Nonedef onExitCanceled(self, position):# If the exit was canceled, re-submit it.self.__position.exitMarket()def onBars(self, bars):brk = self.getBroker()shares = 100price = bars[self.__instrument].getPrice()if brk.getCash() < price*shares:self.info("現金不足")returnself.__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("按任意鍵繼續")

其中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 plotterplter = plotter.StrategyPlotter(myStrategy) plter.getOrCreateSubplot("return").addDataSeries("retuens", retAnalyzer.getReturns()) plter.getOrCreateSubplot("CumReturn").addDataSeries("CumReturn", retAnalyzer.getCumulativeReturns())

準備工作做完,就可以執行回測了,用

myStrategy.run()

執行以后就可以輸出回測結果,輸出圖形了。限于篇幅,就不放代碼了。詳細代碼見:

https://github.com/zwdnet/MyQuant/blob/master/01/testdata.py

現在來看看回測結果。

其中年化收益率那里應該是三年的策略收益,這樣看兩個的回測結果是基本一致的,但并不完全一致。原因呢?

我看了一下每個交易日的情況:

聚寬上面的:

我本地文件里的數據

?

在本地輸出每個交易日的情況:

可以看到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綁定。

⑤執行回測。

⑥輸出回測結果,繪圖。

下一步,該真正進行量化交易策略的學習研究了。

?

總結

以上是生活随笔為你收集整理的Pyalgotrade量化交易回测框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。