VNPY

創(chuàng)新互聯(lián)建站是專業(yè)的雨湖網(wǎng)站建設(shè)公司,雨湖接單;提供
網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行雨湖網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!中,優(yōu)化參數(shù)也經(jīng)常要批量去做,一個(gè)是一組不同策略批量對(duì)一個(gè)品種優(yōu)化,還有一個(gè)策略對(duì)應(yīng)不同憑證,下面是源代碼,放在example\CtaBacktesting文件夾下面,主要是參考了原來的優(yōu)化代碼。
還有就是輸出時(shí)候,由于優(yōu)化的時(shí)候,結(jié)果可能很多,默認(rèn)輸出30個(gè)到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'):
#填入品種隊(duì)列和策略隊(duì)列,返回結(jié)果resultlist, 為了輸出方便檢索,加入品種名稱,策略名稱和策略參數(shù)
resultlist = []
for symbol in symbollist:
for strategy in strategylist:
result = self.runBacktesting(symbol,strategy,sort)
#加入品種名稱,策略名稱和策略參數(shù)
if isinstance(result,dict):
#如果返回的是dict,直接加入
result["Symbolname"] = str(symbol["vtSymbol"])
result["strategyname"] = str(strategy[0])
result["strategysetting"] = str(strategy[1])
resultlist.append(result)
else:
# 發(fā)現(xiàn)優(yōu)化回來的是一個(gè)包含元組的隊(duì)列,元組有三個(gè)組成,第一個(gè)排策略參數(shù),第二個(gè)回測(cè)目標(biāo)的值,第三策略參數(shù)全部運(yùn)行結(jié)果。
# 這里我們要的就是第三個(gè),先插入這個(gè)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):
#寫入測(cè)試品種和參數(shù), 返回回測(cè)數(shù)據(jù)集包含回測(cè)結(jié)果
# 在引擎中創(chuàng)建策略對(duì)象
# 創(chuàng)建回測(cè)引擎
engine = BacktestingEngine()
# 設(shè)置引擎的回測(cè)模式為K線
engine.setBacktestingMode(engine.BAR_MODE)
# 設(shè)置回測(cè)用的數(shù)據(jù)起始日期
engine.setStartDate(symbol["StartDate"])
engine.setSlippage(symbol["Slippage"]) # 1跳
engine.setRate(symbol["Rate"]) # 傭金大小
engine.setSize(symbol["Size"]) # 合約大小
engine.setPriceTick(symbol["Slippage"]) # 最小價(jià)格變動(dòng)
engine.setCapital(symbol["Capital"])
# 設(shè)置使用的歷史數(shù)據(jù)庫
engine.setDatabase(MINUTE_DB_NAME, symbol["vtSymbol"])
#調(diào)用優(yōu)化方法,可以集成優(yōu)化測(cè)試
setting = OptimizationSetting() # 新建一個(gè)優(yōu)化任務(wù)設(shè)置對(duì)象
setting.setOptimizeTarget(sort) # 設(shè)置優(yōu)化排序的目標(biāo)是策略凈盈利
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'輸出統(tǒng)計(jì)數(shù)據(jù)')
# 如果是使用優(yōu)化模式,這里返回的是策略回測(cè)的dict的list,如果普通回測(cè)就是單個(gè)dict
# 如果大于30 ,就返回三十之內(nèi),否則全部
if len(optimizationresult) > 30:
return optimizationresult[:30]
else:
return optimizationresult
def toExcel(self, resultlist, path = "C:\data\datframe.xlsx"):
#按照輸入統(tǒng)計(jì)數(shù)據(jù)隊(duì)列和路徑,輸出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 "回測(cè)統(tǒng)計(jì)結(jié)果輸出到" + path
if __name__ == "__main__":
#創(chuàng)建品種隊(duì)列,這里可以用json導(dǎo)入,為了方便使用直接寫了。
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
}
]
# 這里是同一個(gè)策略,不同參數(shù)的情況,當(dāng)然可以有多個(gè)策略和多個(gè)參數(shù)組合
Strategylist2 = []
# 策略list,如果是元組,那么就是三個(gè),按照第一個(gè)初始,第二個(gè)結(jié)束,第三個(gè)步進(jìn)
settinglist =[
{'bollWindow': (10,20,2)}]
# 合并一個(gè)元組
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)
名稱欄目:VNPY批量?jī)?yōu)化參數(shù),并輸出到excel-創(chuàng)新互聯(lián)
本文路徑:http://chinadenli.net/article16/hhogg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站導(dǎo)航、網(wǎng)站設(shè)計(jì)、網(wǎng)站排名、定制網(wǎng)站、企業(yè)建站
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源:
創(chuàng)新互聯(lián)