VNPY 批量優化引數,並輸出到excel
VNPY中,優化引數也經常要批量去做,一個是一組不同策略批量對一個品種優化,還有一個策略對應不同憑證,下面是原始碼,放在example\CtaBacktesting資料夾下面,主要是參考了原來的優化程式碼。
還有就是輸出時候,由於優化的時候,結果可能很多,預設輸出30個到excel。
還有就是輸出時候,由於優化的時候,結果可能很多,預設輸出30個到excel。
點選(此處)摺疊或開啟
-
# encoding: UTF-8
-
-
import pandas as pd
-
from vnpy.trader.app.ctaStrategy.ctaBacktesting import BacktestingEngine, MINUTE_DB_NAME, OptimizationSetting
-
from vnpy.trader.app.ctaStrategy.strategy.strategyBollChannel import BollChannelStrategy
-
-
-
class BatchOptimization(object):
-
def __init__(self):
-
""
-
def calculateBacktesting(self,symbollist,strategylist, sort = 'totalNetPnl'):
-
#填入品種佇列和策略佇列,返回結果resultlist, 為了輸出方便檢索,加入品種名稱,策略名稱和策略引數
-
resultlist = []
-
for symbol in symbollist:
-
for strategy in strategylist:
-
result = self.runBacktesting(symbol,strategy,sort)
-
#加入品種名稱,策略名稱和策略引數
-
if isinstance(result,dict):
-
#如果返回的是dict,直接加入
-
result["Symbolname"] = str(symbol["vtSymbol"])
-
result["strategyname"] = str(strategy[0])
-
result["strategysetting"] = str(strategy[1])
-
resultlist.append(result)
-
else:
-
# 發現優化回來的是一個包含元組的佇列,元組有三個組成,第一個排策略引數,第二個回測目標的值,第三策略引數全部執行結果。
-
# 這裡我們要的就是第三個,先插入這個dict,在dict插入symbolname,和strategysetting
-
for resultraw in result:
-
resultlist.append(resultraw[2])
-
resultlist[-1]["Symbolname"] = str(symbol["vtSymbol"])
-
resultlist[-1]["strategysetting"] = str(resultraw[0])
-
return resultlist
-
-
-
def runBacktesting(self, symbol, strategy, sort):
-
#寫入測試品種和引數, 返回回測資料集包含回測結果
-
-
# 在引擎中建立策略物件
-
# 建立回測引擎
-
engine = BacktestingEngine()
-
# 設定引擎的回測模式為K線
-
engine.setBacktestingMode(engine.BAR_MODE)
-
# 設定回測用的資料起始日期
-
engine.setStartDate(symbol["StartDate"])
-
engine.setSlippage(symbol["Slippage"]) # 1跳
-
engine.setRate(symbol["Rate"]) # 佣金大小
-
engine.setSize(symbol["Size"]) # 合約大小
-
engine.setPriceTick(symbol["Slippage"]) # 最小价格變動
-
engine.setCapital(symbol["Capital"])
-
-
# 設定使用的歷史資料庫
-
engine.setDatabase(MINUTE_DB_NAME, symbol["vtSymbol"])
-
-
#呼叫優化方法,可以整合優化測試
-
setting = OptimizationSetting() # 新建一個優化任務設定物件
-
setting.setOptimizeTarget(sort) # 設定優化排序的目標是策略淨盈利
-
print strategy[1]
-
for settingKey in strategy[1]:
-
if isinstance(strategy[1][settingKey], tuple):
-
setting.addParameter(settingKey,strategy[1][settingKey][0],strategy[1][settingKey][1],strategy[1][settingKey][2])
-
else:
-
setting.addParameter(settingKey,strategy[1][settingKey])
-
#
-
optimizationresult = engine.runParallelOptimization(strategy[0], setting)
-
-
engine.output(u'輸出統計資料')
-
# 如果是使用優化模式,這裡返回的是策略回測的dict的list,如果普通回測就是單個dict
-
# 如果大於30 ,就返回三十之內,否則全部
-
if len(optimizationresult) > 30:
-
return optimizationresult[:30]
-
else:
-
return optimizationresult
-
-
def toExcel(self, resultlist, path = "C:\data\datframe.xlsx"):
-
#按照輸入統計資料佇列和路徑,輸出excel,這裡不提供新增模式,如果想,可以改
-
#dft.to_csv(path,index=False,header=True, mode = 'a')
-
summayKey = resultlist[0].keys()
-
# summayValue = result.values()
-
-
dft = pd.DataFrame(columns=summayKey)
-
for result_ in resultlist:
-
new = pd.DataFrame(result_, index=["0"])
-
dft = dft.append(new,ignore_index=True)
-
dft.to_excel(path,index=False,header=True)
-
print "回測統計結果輸出到" + path
-
-
if __name__ == "__main__":
-
#建立品種佇列,這裡可以用json匯入,為了方便使用直接寫了。
-
symbollist = [{
-
"vtSymbol": 'm1809',
-
"StartDate": "20180101",
-
"Slippage": 1,
-
"Size": 10,
-
"Rate": 2 / 10000,
-
"Capital": 10000
-
},
-
{
-
"vtSymbol": 'rb1810',
-
"StartDate": "20180101",
-
"Slippage": 1,
-
"Size": 10,
-
"Rate": 2 / 10000,
-
"Capital": 10000
-
}
-
]
-
-
# 這裡是同一個策略,不同引數的情況,當然可以有多個策略和多個引數組合
-
Strategylist2 = []
-
# 策略list,如果是元組,那麼就是三個,按照第一個初始,第二個結束,第三個步進
-
settinglist =[
-
{'bollWindow': (10,20,2)}]
-
# 合併一個元組
-
if settinglist != []:
-
for para1 in settinglist:
-
Strategylist2.append((BollChannelStrategy, para1))
-
-
NT = BatchOptimization()
-
resultlist = NT.calculateBacktesting(symbollist,Strategylist2,sort = 'totalNetPnl')
-
#定義路徑
-
path = "C:\Project\OptimizationResult.xlsx"
- NT.toExcel(resultlist,path)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2156701/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Python】讀取excel並輸出到txtPythonExcel
- VNPY引數優化功能v1版本中的一個更新引數批量生成方法優化
- VNPY 批量策略回測和統計結果的excel輸出Excel
- 利用粒子群優化演算法(PSO)來優化vnpy的量化策略引數優化演算法
- python多程式簡介,和VNPY多程式引數優化程式碼分析Python優化
- 一個小技巧,VNPY策略引數優化時候顯示完成數量和總數量優化
- 利用VNPY回測引擎分析實盤交易,並用excel和pdf輸出分析結果Excel
- ActiveMQ 引數優化MQ優化
- Myisam & InnoDB 優化引數優化
- MySQL引數配置優化MySql優化
- Dataworks批量刷數優化方案探討優化
- 記一次 Java 匯出大批量 Excel 優化JavaExcel優化
- hive匯出到csv hive匯出到excelHiveExcel
- 解析域名,獲取域名ip並輸出到終端
- java 匯出到EXCELJavaExcel
- Mysql優化系列(1)--Innodb重要引數優化MySql優化
- MySQL 效能優化之快取引數優化MySql優化快取
- Sklearn GridSearchCV 引數優化優化
- Java:匯出Excel大批量資料的優化過程JavaExcel優化
- 【SQL優化器】初始化引數SQL優化
- 匯出到Excel的操作Excel
- swoole優化核心引數調整優化
- Nginx實戰(六) 引數優化Nginx優化
- Linux 核心引數優化(for oracle)Linux優化Oracle
- Elasticsearch效能優化引數註解Elasticsearch優化
- spark job執行引數優化Spark優化
- OpenCV中的SVM引數優化OpenCV優化
- Mysql 效能優化--基礎引數MySql優化
- 【SQL 效能優化】引數設定SQL優化
- Oracle可變引數的優化Oracle優化
- weblogic幾個優化引數Web優化
- SQL Server SQL效能優化之引數化SQLServer優化
- Oracle 並行相關的初始化引數Oracle並行
- 一鍵批量查詢極兔快遞並設定快遞引數
- c#方法引數_輸出引數C#
- 在VNPY2的進行CTA批量回測,支援Json和Excel格式匯入策略JSONExcel
- MySQL 資料庫效能優化之快取引數優化MySql資料庫優化快取
- 將資料匯出到ExcelExcel