VNPY 批量優化引數,並輸出到excel

張國平發表於2018-06-26
VNPY中,優化引數也經常要批量去做,一個是一組不同策略批量對一個品種優化,還有一個策略對應不同憑證,下面是原始碼,放在example\CtaBacktesting資料夾下面,主要是參考了原來的優化程式碼。

還有就是輸出時候,由於優化的時候,結果可能很多,預設輸出30個到excel。


點選(此處)摺疊或開啟

  1. # encoding: UTF-8

  2. import pandas as pd
  3. from vnpy.trader.app.ctaStrategy.ctaBacktesting import BacktestingEngine, MINUTE_DB_NAME, OptimizationSetting
  4. from vnpy.trader.app.ctaStrategy.strategy.strategyBollChannel import BollChannelStrategy


  5. class BatchOptimization(object):
  6.     def __init__(self):
  7.         ""
  8.     def calculateBacktesting(self,symbollist,strategylist, sort = 'totalNetPnl'):
  9.         #填入品種佇列和策略佇列,返回結果resultlist, 為了輸出方便檢索,加入品種名稱,策略名稱和策略引數
  10.         resultlist = []
  11.         for symbol in symbollist:
  12.             for strategy in strategylist:
  13.                 result = self.runBacktesting(symbol,strategy,sort)
  14.                 #加入品種名稱,策略名稱和策略引數
  15.                 if isinstance(result,dict):
  16.                     #如果返回的是dict,直接加入
  17.                     result["Symbolname"] = str(symbol["vtSymbol"])
  18.                     result["strategyname"] = str(strategy[0])
  19.                     result["strategysetting"] = str(strategy[1])
  20.                     resultlist.append(result)
  21.                 else:
  22.                     # 發現優化回來的是一個包含元組的佇列,元組有三個組成,第一個排策略引數,第二個回測目標的值,第三策略引數全部執行結果。
  23.                     # 這裡我們要的就是第三個,先插入這個dict,在dict插入symbolname,和strategysetting
  24.                     for resultraw in result:
  25.                         resultlist.append(resultraw[2])
  26.                         resultlist[-1]["Symbolname"] = str(symbol["vtSymbol"])
  27.                         resultlist[-1]["strategysetting"] = str(resultraw[0])
  28.         return resultlist


  29.     def runBacktesting(self, symbol, strategy, sort):
  30.         #寫入測試品種和引數, 返回回測資料集包含回測結果

  31.         # 在引擎中建立策略物件
  32.         # 建立回測引擎
  33.         engine = BacktestingEngine()
  34.         # 設定引擎的回測模式為K線
  35.         engine.setBacktestingMode(engine.BAR_MODE)
  36.         # 設定回測用的資料起始日期
  37.         engine.setStartDate(symbol["StartDate"])
  38.         engine.setSlippage(symbol["Slippage"]) # 1跳
  39.         engine.setRate(symbol["Rate"]) # 佣金大小
  40.         engine.setSize(symbol["Size"]) # 合約大小
  41.         engine.setPriceTick(symbol["Slippage"]) # 最小价格變動
  42.         engine.setCapital(symbol["Capital"])

  43.         # 設定使用的歷史資料庫
  44.         engine.setDatabase(MINUTE_DB_NAME, symbol["vtSymbol"])

  45.         #呼叫優化方法,可以整合優化測試
  46.         setting = OptimizationSetting() # 新建一個優化任務設定物件
  47.         setting.setOptimizeTarget(sort) # 設定優化排序的目標是策略淨盈利
  48.         print strategy[1]
  49.         for settingKey in strategy[1]:
  50.             if isinstance(strategy[1][settingKey], tuple):
  51.                 setting.addParameter(settingKey,strategy[1][settingKey][0],strategy[1][settingKey][1],strategy[1][settingKey][2])
  52.             else:
  53.                 setting.addParameter(settingKey,strategy[1][settingKey])
  54.         #
  55.         optimizationresult = engine.runParallelOptimization(strategy[0], setting)

  56.         engine.output(u'輸出統計資料')
  57.         # 如果是使用優化模式,這裡返回的是策略回測的dict的list,如果普通回測就是單個dict
  58.         # 如果大於30 ,就返回三十之內,否則全部
  59.         if len(optimizationresult) > 30:
  60.             return optimizationresult[:30]
  61.         else:
  62.             return optimizationresult

  63.     def toExcel(self, resultlist, path = "C:\data\datframe.xlsx"):
  64.         #按照輸入統計資料佇列和路徑,輸出excel,這裡不提供新增模式,如果想,可以改
  65.         #dft.to_csv(path,index=False,header=True, mode = 'a')
  66.         summayKey = resultlist[0].keys()
  67.         # summayValue = result.values()

  68.         dft = pd.DataFrame(columns=summayKey)
  69.         for result_ in resultlist:
  70.             new = pd.DataFrame(result_, index=["0"])
  71.             dft = dft.append(new,ignore_index=True)
  72.         dft.to_excel(path,index=False,header=True)
  73.         print "回測統計結果輸出到" + path

  74. if __name__ == "__main__":
  75.     #建立品種佇列,這裡可以用json匯入,為了方便使用直接寫了。
  76.     symbollist = [{
  77.         "vtSymbol": 'm1809',
  78.         "StartDate": "20180101",
  79.         "Slippage": 1,
  80.         "Size": 10,
  81.         "Rate": 2 / 10000,
  82.         "Capital": 10000
  83.             },
  84.         {
  85.             "vtSymbol": 'rb1810',
  86.             "StartDate": "20180101",
  87.             "Slippage": 1,
  88.             "Size": 10,
  89.             "Rate": 2 / 10000,
  90.             "Capital": 10000
  91.         }
  92.     ]

  93.     # 這裡是同一個策略,不同引數的情況,當然可以有多個策略和多個引數組合
  94.     Strategylist2 = []
  95.     # 策略list,如果是元組,那麼就是三個,按照第一個初始,第二個結束,第三個步進
  96.     settinglist =[
  97.         {'bollWindow': (10,20,2)}]
  98.     # 合併一個元組
  99.     if settinglist != []:
  100.         for para1 in settinglist:
  101.             Strategylist2.append((BollChannelStrategy, para1))

  102.     NT = BatchOptimization()
  103.     resultlist = NT.calculateBacktesting(symbollist,Strategylist2,sort = 'totalNetPnl')
  104.     #定義路徑
  105.     path = "C:\Project\OptimizationResult.xlsx"
  106.     NT.toExcel(resultlist,path)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2156701/,如需轉載,請註明出處,否則將追究法律責任。

相關文章