VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 4703
声望: 287

发布于vn.py社区公众号【vnpy-community】
 
原文作者:用Python的交易员 | 发布时间:2021-06-22
 
《30天掌握Python数据分析课程》更新到第40集,最新的5集重点讲解了如何基于pandas实现时间序列数据的各种操作处理,解决策略研究中对于多合约和多类型数据的排序对齐问题。详细课程大纲请戳我~~~
 

本周一发布了vn.py的2.4.0版本,本次更新的内容主要是实现了多进程模式的遗传算法优化,在保留遗传算法对于参数优化时智能任务调度的同时,大幅提高计算性能,降低整体的优化耗时。

和之前一样,对于使用VN Studio的用户,启动VN Station后,直接点击界面右下角的【更新】按钮就能完成自动更新升级,对于没有安装的用户,请下载VN Studio-2.4.0,体验一键安装的量化交易Python发行版,下载链接:

https://download.vnpy.com/vnstudio-2.4.0.exe

 

多进程模式的遗传算法优化

 

一点背景

在之前版本的vn.py中,针对策略参数优化的需求提供了两套算法工具,分别是暴力穷举优化(Brutal Force)和遗传算法优化(Genetic Algorithm)。

其中暴力穷举优化在运行的过程中,由于每轮执行的计算任务互相之间不存在任何状态依赖,可以非常方便的使用multiprocessing库扩展到多进程模式执行,从而充分利用CPU所有核心的算力来加速

而遗传算法优化在运行的过程中,每轮执行的计算任务中会存在相当比例的重复部分(源于优秀参数的交叉生成),因此采用了lru_cache的缓存机制来实现加速。同时lru_cache的结果缓存只能在单进程中生效,扩展到multiprocessing的多进程模式后,因为缓存失效反而会导致最终的速度变慢

改进方案

社区里有极少数vn.py的资深用户,自行改造实现了基于Redis内存数据库缓存的重量级多进程遗传算法优化功能。但由于Redis本身安装较为麻烦,且内存开销很大,使得这个方案对于普通用户来说几乎没有可行性

在2.4.0的更新中,我们采用multiprocessing库的Manager数据服务进程作为缓存方案,将vn.py内置的遗传算法优化功能升级到了多进程版本,实现数十倍优化速度提升的同时,还无需依赖任何外部工具,对于新手小白来说都是【开箱即用】

实际操作

对于vn.py的用户来说,在实际操作上和之前的版本完全一致。打开【CTA回测】模块的【参数优化】对话框后,配置好要执行优化的参数空间,点击下图红框中的【遗传算法优化】按钮即可启动优化任务:

description

唯一的区别在于此时打开Windows系统的【任务管理器】查看CPU占用情况,会发现所有的CPU核心都已经跑满(对比之前的单进程遗传算法优化,最高只会占满一个核心):

description

标准化改造

之前不少用户反映过一个问题:只有CTA策略(cta_strategy)模块内置了优化功能,而价差交易(spread_trading)和组合策略(portfolio_strategy)都需要用户自行实现(比如在Jupyter Notebook里写一个for循环来执行优化)。

所以本次更新中,我们将暴力穷举和遗传算法两套优化工具统一进行了标准化改造,从CTA策略模块中剥离,放置到了vnpy.trader.optimize模块下,后续会基于它们来实现其他策略模块的参数优化功能。

 

基于aiohttp重构RestClient和WebsocketClient

 

RestClient和WebsocketClient是目前vn.py框架中针对各类REST API和Websocket API统一开发的标准化客户端工具,在之前的版本中采用【同步调用 + 多线程】的模式来实现高性能通讯。

但由于GIL全局锁的存在,线程多了难免会出现性能下降的情况,尤其对于需要加载多个接口运行套利类策略的用户说更加敏感。因此在2.4.0版本中新增了基于aiohttp实现的【异步调用 + 协程】模式客户端,只需一个线程(运行事件循环)即可实现所有相关接口的异步事件驱动

整体的组件替换如下:

  • 事件驱动:线程池ThreadPool -> 协程asyncio
  • RestClient客户端:requests -> aiohttp
  • WebsocketClient客户端:websocket-client -> aiohttp

考虑到潜在的兼容性问题,两个新的客户端放到了全新的vnpy_rest和vnpy_websocket项目中,接下来会在剥离各个相关的交易接口时逐步替换。同时老的客户端依旧位于vnpy.api.rest和vnpy.api.websocket下,可以继续使用。

 

其他更新

 

XTP交易接口

剥离到vnpy_xtp项目中,升级到2.2.27版本的API,新增了:

  • Ubuntu上的一键自动安装功能
  • 行情接口对于本地网卡地址的支持。

 

CHANGELOG

 

新增

  1. 新增TickData的本地时间戳字段local_time(不带时区信息)
  2. 新增基于asyncio和aiohttp实现的协程异步REST API客户端vnpy_rest项目
  3. 新增基于asyncio和aiohttp实现的协程异步Websocket API客户端vnpy_websocket项目
  4. 新增基于多进程模式的遗传算法优化功能
  5. 新增XTP的API封装中,行情登录函数对于本地网卡地址的参数支持

调整

  1. 剥离CTA策略模块下的穷举和遗传优化算法到vnpy.trader.optimize模块下
  2. 遗传算法优化完成后,输出所有回测过的参数对应结果(而不只是最优结果)
  3. CTA策略引擎加载策略文件时,增加模块重载的操作,使得任何策略文件修改可以立即生效
  4. CTA策略引擎扫描特定目录下的策略文件时,使用glob函数(替换原有的os.walk),避免对子目录中文件的错误加载
  5. 将CTA策略模块剥离到vnpy_ctastrategy项目中
  6. 将CTA回测模块剥离到vnpy_ctabacktester项目中
  7. 将XTP接口剥离到vnpy_xtp项目中,并升级到2.2.27.4版本
  8. 将事前风控模块剥离到vnpy_riskmanager项目中
  9. 将数据管理模块剥离到vnpy_datamanager项目中

修复

  1. 修复MySQL和PostgreSQL数据库管理器删除K线数据时出错的问题
  2. 修复基于aiohttp的RestClient和WebsocketClient,事件循环停止后重新启动失败的问题
  3. 修复CtaBacktester基于Tick级别数据进行参数优化时,启动优化失败的问题
  4. 修复ToraStockGateway和ToraOptionGateway,调用下单函数时没有返回委托号的问题
  5. 修复InfluxDB数据管理器,导入数据时时间字段解析错误的问题
Member
avatar
加入于:
帖子: 55
声望: 0

“本次更新中,我们将暴力穷举和遗传算法两套优化工具统一进行了标准化改造,从CTA策略模块中剥离,放置到了vnpy.trader.optimize模块下,后续会基于它们来实现其他策略模块的参数优化功能。”

所以现在的多进程遗传算法优化暂时还不能用于portfolio模块对吧?

Member
avatar
加入于:
帖子: 4703
声望: 287

是的

Member
avatar
加入于:
帖子: 55
声望: 0

xiaohe wrote:

是的

xiaohe老师,你好,2.4.0的vnpy.trader.optimize模块,我已经用来跑了一遍多进程遗传算法,发现和老版本的遗传算法相比,跨代计算的时候,没有log输出,我看了几遍代码,也找不到可以魔改的下手位置。希望下一个版本的多进程遗传算法,可以在跨代计算的时候,输出一下现在跑到第几代了。谢谢。

Member
avatar
加入于:
帖子: 4703
声望: 287

这个日志输出之前的版本也没有的吧

Member
avatar
加入于:
帖子: 55
声望: 0

description
这个是之前陈总讲的cta进阶课程里面的截图,在CMD中,会有一行第几代的输出

Member
avatar
加入于:
帖子: 4703
声望: 287

多进程模式的遗传算法优化底层没有这个输出的

Member
avatar
加入于:
帖子: 3
声望: 0

同一个策略,同一份数据,用这个版本的vnpy跑出来的结果和之前版本相差极大

Member
avatar
加入于:
帖子: 4
声望: 0

最新版本安装后打开回测模块所有自带的策略都不显示啊,它现在在vnpy_ctastrategy中,我要做什么配置才能让它显示出来吗

Member
加入于:
帖子: 13
声望: 0

剥离vnpy_ctastrategy项目
剥离vnpy_ctabacktester项目
剥离vnpy_riskmanager项目
剥离vnpy_datamanager项目

请教下为什么要做子项目的剥离呢

Member
avatar
加入于:
帖子: 4703
声望: 287

hhc1177 wrote:

剥离vnpy_ctastrategy项目
剥离vnpy_ctabacktester项目
剥离vnpy_riskmanager项目
剥离vnpy_datamanager项目

请教下为什么要做子项目的剥离呢

description

Member
avatar
加入于:
帖子: 10
声望: 0

发低烧的沐浴露 wrote:

同一个策略,同一份数据,用这个版本的vnpy跑出来的结果和之前版本相差极大

哪个更理想呢?有具体的吗?

Member
avatar
加入于:
帖子: 11
声望: 3

三两 wrote:

最新版本安装后打开回测模块所有自带的策略都不显示啊,它现在在vnpy_ctastrategy中,我要做什么配置才能让它显示出来吗

把site-packages----》vnpy_ctabacktester文件夹下的engine.py文件中的第84行代码改成这句:path1 = app_path.joinpath("vnpy_ctastrategy", "strategies"),原代码把“vnpy_ctastrategy”不小心写成了“cta_strategy”。

Member
avatar
加入于:
帖子: 3
声望: 1

不知为何,使用遗传算法进行参数优化,有时候能够很快完成,迭代次数都是一样的情况下,有时候却一直没有响应结果。

Member
avatar
加入于:
帖子: 4703
声望: 287

可以用run.py或者在cmd用命令行python -m vnstation 打开VN Trader然后复现你的操作,看看底层是否有报错

Member
avatar
加入于:
帖子: 3
声望: 1

xiaohe wrote:

可以用run.py或者在cmd用命令行python -m vnstation 打开VN Trader然后复现你的操作,看看底层是否有报错

description

description

Member
avatar
加入于:
帖子: 4703
声望: 287

下面那张图看不清楚,好像有attributeerror报错,复制报错信息在网上搜索一下解决方法应该就行了

Member
avatar
加入于:
帖子: 1
声望: 0

ytsky125 wrote:

三两 wrote:

最新版本安装后打开回测模块所有自带的策略都不显示啊,它现在在vnpy_ctastrategy中,我要做什么配置才能让它显示出来吗

把site-packages----》vnpy_ctabacktester文件夹下的engine.py文件中的第84行代码改成这句:path1 = app_path.joinpath("vnpy_ctastrategy", "strategies"),原代码把“vnpy_ctastrategy”不小心写成了“cta_strategy”。

那2.4版本附带的那些策略例子,还能直接用吗?代码是不是得改了?

description

Member
avatar
加入于:
帖子: 4703
声望: 287

lf_1083 wrote:

ytsky125 wrote:

三两 wrote:

最新版本安装后打开回测模块所有自带的策略都不显示啊,它现在在vnpy_ctastrategy中,我要做什么配置才能让它显示出来吗

把site-packages----》vnpy_ctabacktester文件夹下的engine.py文件中的第84行代码改成这句:path1 = app_path.joinpath("vnpy_ctastrategy", "strategies"),原代码把“vnpy_ctastrategy”不小心写成了“cta_strategy”。

那2.4版本附带的那些策略例子,还能直接用吗?代码是不是得改了?

description
vnpy_ctastrategy 1.0.3已经改了

Member
avatar
加入于:
帖子: 4703
声望: 287

是的,是根据CPU核心数量跑的。
请用htop看吧。

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】