发布于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回测】模块的【参数优化】对话框后,配置好要执行优化的参数空间,点击下图红框中的【遗传算法优化】按钮即可启动优化任务:
唯一的区别在于此时打开Windows系统的【任务管理器】查看CPU占用情况,会发现所有的CPU核心都已经跑满(对比之前的单进程遗传算法优化,最高只会占满一个核心):
标准化改造
之前不少用户反映过一个问题:只有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
新增
- 新增TickData的本地时间戳字段local_time(不带时区信息)
- 新增基于asyncio和aiohttp实现的协程异步REST API客户端vnpy_rest项目
- 新增基于asyncio和aiohttp实现的协程异步Websocket API客户端vnpy_websocket项目
- 新增基于多进程模式的遗传算法优化功能
- 新增XTP的API封装中,行情登录函数对于本地网卡地址的参数支持
调整
- 剥离CTA策略模块下的穷举和遗传优化算法到vnpy.trader.optimize模块下
- 遗传算法优化完成后,输出所有回测过的参数对应结果(而不只是最优结果)
- CTA策略引擎加载策略文件时,增加模块重载的操作,使得任何策略文件修改可以立即生效
- CTA策略引擎扫描特定目录下的策略文件时,使用glob函数(替换原有的os.walk),避免对子目录中文件的错误加载
- 将CTA策略模块剥离到vnpy_ctastrategy项目中
- 将CTA回测模块剥离到vnpy_ctabacktester项目中
- 将XTP接口剥离到vnpy_xtp项目中,并升级到2.2.27.4版本
- 将事前风控模块剥离到vnpy_riskmanager项目中
- 将数据管理模块剥离到vnpy_datamanager项目中
修复
- 修复MySQL和PostgreSQL数据库管理器删除K线数据时出错的问题
- 修复基于aiohttp的RestClient和WebsocketClient,事件循环停止后重新启动失败的问题
- 修复CtaBacktester基于Tick级别数据进行参数优化时,启动优化失败的问题
- 修复ToraStockGateway和ToraOptionGateway,调用下单函数时没有返回委托号的问题
- 修复InfluxDB数据管理器,导入数据时时间字段解析错误的问题