一個小技巧,VNPY策略引數優化時候顯示完成數量和總數量
在做VNPY 策略引數優化的時候, 優化數量多的時候要好幾天,有時候也不知道完成數量,只能乾等。就稍微改了下程式碼,加入log顯示完成數量和總數量,心裡面有個底。
程式碼是在VNPY 1.9.2裡面的因為我還在1.9.2的版本泥潭裡,2.0之後直接用應該也可以的,只要稍微改下變數名稱。
實質內容,就是python多程式共享變數訪問更新,python提供幾個不同的多程式變數共享的方法,比如使用可變物件queue。這裡其實只用定義一個int型別的counter,每個程式跑完後,counter加一,並在log中記錄。
這裡用了一個multiprocessing.Manager類,Manager可以對定義共享變數,和鎖管理
把下面程式碼加入到class BacktestingEngine的runParallelOptimization方法中
#---------------------------------------------------------------------- def runParallelOptimization(self, strategyClass, optimizationSetting): """並行優化引數""" # 獲取優化設定 settingList = optimizationSetting.generateSetting() targetName = optimizationSetting.optimizeTarget # 檢查引數設定問題 if not settingList or not targetName: self.output(u'優化設定有問題,請檢查') # 多程式優化,啟動一個對應CPU核心數量的程式池 pool = multiprocessing.Pool(multiprocessing.cpu_count()-1, maxtasksperchild = 10) l = [] length0 = len(settingList) # 獲得引數優化帶執行條 manger = multiprocessing.Manager() # 定義一個多程式管理物件 counter = manger.Value('i',0) # 定義一個共享變數記錄完成條目,int型別的 lock = manger.Lock() # 頂一個訪問鎖,如果counter被一個程式修改時候,加鎖, for setting in settingList: # 把剛剛頂一個的作為引數傳入每個程式,實現變數共享 l.append(pool.apply_async(optimize, (strategyClass, setting, targetName, self.mode, self.startDate, self.initDays, self.endDate, self.slippage, self.rate, self.size, self.priceTick, self.dbName, self.symbol,counter,lock,length0))) pool.close() pool.join() # 顯示結果 resultList = [res.get() for res in l] resultList.sort(reverse=True, key=lambda result:result[1]) return resultList
然後在optimize中,定義counter加1
#---------------------------------------------------------------------- def optimize(strategyClass, setting, targetName, mode, startDate, initDays, endDate, slippage, rate, size, priceTick, dbName, symbol,counter,lock,length0): """多程式優化時跑在每個程式中執行的函式""" ...... engine.runBacktesting() # 當優化完成時候,counter加1 with lock: counter.value += 1 # 為了使用engine的log顯示,更改calculateDailyResult,傳入counter.value, length0 engine.calculateDailyResult(counter.value, length0) .....
為了在log中顯示,不得不修改下calculateDailyResult,其實這樣改原始碼不太合適,反正1.9.2已經被我搞得亂了,僅作參考,不合適的更新方法。
#---------------------------------------------------------------------- def calculateDailyResult(self,count = 0,length0 = 0): """計算按日統計的交易結果""" self.output(u'計算按日統計結果') # 顯示完成數 if count != 0: self.output(u'執行完成個數 %s / %s' % (count,length0)) ......
實現效果如下圖,可以預估之後還有多少要完成。
當然有心可以加一個共享變數,記錄下已經 每次更新間隔時間,乘上未完成個數,估算出還有多少時間才完成。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2718790/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- VNPY 批量優化引數,並輸出到excel優化Excel
- 利用粒子群優化演算法(PSO)來優化vnpy的量化策略引數優化演算法
- VNPY引數優化功能v1版本中的一個更新引數批量生成方法優化
- 請教一個傳遞引數的時候中文顯示亂碼的問題。
- Laravel 數量統計優化Laravel優化
- CNN超引數優化和視覺化技巧詳解CNN優化視覺化
- 一個輕量級的引數校驗框架框架
- css選擇器位置和數量技巧CSS
- python多程式簡介,和VNPY多程式引數優化程式碼分析Python優化
- 小程式內引數和掃碼引數統一
- 數量性狀遺傳引數的提出
- weblogic幾個優化引數Web優化
- pandas引數設定小技巧
- ActiveMQ 引數優化MQ優化
- PHP 函式可變數量的引數列表PHP函式變數
- 卷積神經網路的引數量和計算量卷積神經網路
- SQL Server中對比表數量,索引數量及procedure數量SQLServer索引
- 友好的顯示小數ORACLEOracle
- 大數量的DML時對索引處理的技巧索引
- 電腦顯示器引數詳解 看完秒懂! 顯示器引數怎麼看?
- mysql備份時候兩個很有用的引數MySql
- C++ 靜態變數什麼時候完成初始化C++變數
- 顯示資料庫所有引數資料庫
- Myisam & InnoDB 優化引數優化
- MySQL引數配置優化MySql優化
- 伺服器訪問數量多的時候怎麼辦伺服器
- kettle 引數——變數引數和常量引數變數
- 手把手教你完成數字動態變化顯示效果
- Dynamics CRM 列表資料超過5000條時如何顯示實際的數量
- ORACLE COL SET 設定顯示引數Oracle
- 設定在即時通訊中音影片的引數質量
- [推薦]無限分級數量查詢優化優化
- Sklearn GridSearchCV 引數優化優化
- linux 下的訊號量引數Linux
- 如何計算PHP函式中傳遞的引數數量PHP函式
- Laravel 路由中不固定數量引數,是如何實現的?Laravel路由
- VMWare中的CPU數量與核心數量意義
- 引數和變數變數