利用遺傳演算法庫DEAP優化交易策略

張國平發表於2019-04-02

首先,要感謝VNPY.com論壇 keke分享 海龜策略深入研究-策略回測系列-17 基於遺傳演算法的訊號優化  一文


https://www.vnpy.com/forum/topic/269-hai-gui-ce-lue-shen-ru-yan-jiu-ce-lue-hui-ce-xi-lie-17-ji-yu-yi-chuan-suan-fa-de-xin-hao-you-hua


經過一段時間學習和使用,深感這個是用於交易策略引數優化的優秀方法。這個說一些理解。


  1. 優化的物件就是這樣一個list陣列  [16, 8, 24, 1, 13, 8, 1] ,其實就是交易策略的引數,比如cciWindows,BollDev。類似於DNA。

  2. 首先要生成這樣一個陣列,這裡keke做了一個方法,具體就是隨機生成一個陣列,同時確保每個數在一個範圍內。

    這裡我加了一個陣列,針對K線的時間,這樣就不會出現7分鐘k線這個比較奇怪的情況。

    1. timerange = [2,3,5,10,15,20]
      bartime = random.choice(timerange
      
  3. 就是設定進化選擇,這裡就是呼叫vnpy回測方法,用回測的指標,比如年化收益,sharpe ratio,收益虧損比等。這裡建議加入一個清理的,避免多執行緒問題。我是使用按此統計,而不是按日統計;感覺比較準確     engine.clearBacktestingResult()

  4. 然後就是對於這一大堆不同策略陣列群體進行遺傳進化,包括按照概率任意兩個list陣列交叉包含的數,生成新的list,類似於繁殖。同時也有一定概率

    一個list數字改變;還有就是有一個名人堂(HallofFame)機制,選擇幾個最好的陣列,一直保持在群體裡面,其實這些名人堂存在價值變成了後面的參照組。

    這裡原文是用DEAP原生方法mutUniformInt,在(6,40)直接隨機生成一個數字替代原來的。但是考慮之前建立時候,每個是有個範圍,可能適合抵押給數字的範圍並不適合最後一個,比如k線時間。這裡我做了個自己突變方法替代原來的。

    • tools.mutUniformInt,low = 4,up = 40,indpb=0.6)
      
    • def mutArrayGroup(individual,parameterlist, indpb):
          size = len(individual)
          parameterlist  = parameterlist()
          for i in xrange(size):
              if random.random() < indpb:
                  individual[i] = parameterlist[i]
          return individual,
       toolbox.register("mutate", mutArrayGroup, parameterlist = parameter_generate, indpb=0.6
      

    這樣跑下來就差不多了,如果想要多執行緒請在toolbox初始化後加入下面程式碼

import multiprocessing
pool = multiprocessing.Pool(processes=(multiprocessing.cpu_count()-2))
toolbox.register("map", pool.map)


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

相關文章