VNPY 批量优化参数,并输出到excel
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,VNPY中,优化参数也经常要批量去做,一个是一组不同策略批量对一个品种优化,还有一个策略对应不同凭证,下面是源代码,放在example\CtaBacktesting文件夹下面,主要是参考了原来的优化代
千家信息网最后更新 2025年12月02日VNPY 批量优化参数,并输出到excelVNPY中,优化参数也经常要批量去做,一个是一组不同策略批量对一个品种优化,还有一个策略对应不同凭证,下面是源代码,放在example\CtaBacktesting文件夹下面,主要是参考了原来的优化代码。
还有就是输出时候,由于优化的时候,结果可能很多,默认输出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)
还有就是输出时候,由于优化的时候,结果可能很多,默认输出30个到excel。
策略
参数
输出
品种
数据
结果
队列
三个
名称
就是
不同
引擎
模式
统计
多个
大小
对象
时候
目标
统计数据
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
手机网站软件开发公司
网络安全计算机考试
大手互联网科技
软件开发可以做硬件吗
软件开发公司怎么走得稳
计算机网络技术导论总结
软件开发商专家评审
hive查找第一行数据库
服务器系统2012怎么样
线下数据库备份到本地
泄露服务器员工赔钱
荆州市超特网络技术有限公司
梦享网络技术有限
蓝装网络技术有限公司
网络技术专科毕业是不是本科
服务器的超时是什么意思
许昌软件开发工作室
java软件开发赚钱吗
闵行区文件存储服务器
数据融合 网络安全
美国股市网络安全概念股龙头
软件开发公司怎么走得稳
整机还原后数据库
dnf手游压爆服务器下载
13亿qq老密数据库
4k家庭服务器广东
天下奇闻视频软件开发
网络安全的国赛有哪些
闽政通链接不了服务器
和平精英软件开发