量化投資學習筆記03——封裝回測操作

從前兩篇文章中,我們使用pyalgotrade框架進行了量化策略的回測的基本操作。使用框架確實比較方便,但是仍有很多每次都要進行的重複操作,比如建立數據源,建立策略,綁定策略與分析器,運行回測,取得回測結果,繪圖等。能不能進行進一步的封裝?我想要的是,指定要交易的股票代碼,基準股票代碼,初始資金,手續費率,回測時間等參數,然後執行回測,就能得到各種回測數據,還可以繪圖。
現在就開始幹吧。

class Backtesting():
    def __init__(self):
        pass

先建立構造函數,傳入上面所說的各種初始值。

"""
封裝回測過程
參數:
instrument: 要回測的股票代碼
startYear: 回測開始年份
endYear: 回測結束年份
base: 基準股票代碼,默認爲300etf
cash: 初始資金,默認爲1000000元
feeRate: 手續費費率,默認爲0.0003
"""
"""
封裝回測過程
參數:
 instrument: 要回測的股票代碼
 startYear: 回測開始年份
 endYear: 回測結束年份
 strategy: 回測的策略
 base: 基準股票代碼,默認爲300etf
 cash: 初始資金,默認爲1000000元
 feeRate: 手續費費率,默認爲0.0003
"""
class Backtesting():
 def __init__(self, instrument, startYear, endYear, strategy, base = "510300", cash = 1000000, feeRate = 0.0003):
  self.__instrument = instrument
  self.__startYear = startYear
  self.__endYear = endYear
  self.__strategy = strategy
  self.__base = base
  self.__cash = cash
  self.__feeRate = feeRate
  # 要創建的內部變量
  self.__strategyTest = None
  self.__feed = None
  self.__strategyBase = None
  self.__feedBase = None
  self.__brk = None
  self.__brkBase = None
  self.__return = returns.Returns()
  self.__returnBase = returns.Returns()
  self.__sharpe = sharpe.SharpeRatio()
  self.__drawdown = drawdown.DrawDown()
  self.__trade = trades.Trades()

接着分別實現createBarfeed(self),createBroker(self),createStrategy(self)成員函數,具體實現跟之前的一樣,就不粘上來了。
跟着要建立策略分析器並與策略對象綁定。

# 創建策略並綁定分析器
def createStrategy(self):
    self.__strategyTest =     self.__strategy(self.__feed, self.__instrument, self.__brk)
      self.__strategyTest.attachAnalyzer(self.__return)
    self.__strategyTest.attachAnalyzer(self.__sharpe)
    self.__strategyTest.attachAnalyzer(self.__drawdown)
    self.__strategyTest.attachAnalyzer(self.__trade)
    self.__strategyBase
= self.__strategy(self.__feedBase, self.__base, self.__brk)
    self.__strategyTest.attachAnalyzer(self.__returnBase)

接下來就要把上面的流程串起來,本來我想在一個函數裏面搞定,先創建barfeed和broker,然後創建策略,運行回測,計算指標並返回結果。但是發現有錯誤,運行以後程序就不停地在運行回測那裏反覆,最後回溯超過最大值程序停止。可能是因爲pyalgotrade是事件驅動型的框架吧。只好妥協:封裝的類建立了策略以後返回策略,由類的調用者手動調用run執行回測,然後再手動獲取回測指標。像這樣。

    bt = Backtesting(["000001"], 2016, 2018, MyStrategy)
    strategy = bt.getStrategy()
    strategy[0].run()
    strategy[1].run()
    result = bt.getResult()
    bt.outputResult()


輸出的結果跟之前的程序一樣。接下來再把繪圖的功能加上吧。

圖還是有點問題,我是想把策略收益跟基準收益畫到一起的。另外類裏面也沒有做錯誤處理等。不過基本功能還是實現了。其它的用到再說吧。
代碼:https://github.com/zwdnet/MyQuant/tree/master/03

我發文章的四個地方,歡迎大家在朋友圈等地方分享,歡迎點“在看”。
我的個人博客地址:https://zwdnet.github.io
我的CSDN博客地址:https://blog.csdn.net/zwdnet
我的博客園博客地址: https://www.cnblogs.com/zwdnet/
我的微信個人訂閱號:趙瑜敏的口腔醫學學習園地

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章