介绍
VnpyRS是以提升性能为目的,部分代码用Rust语言重新实现的vnpy,实现了vnpy的回测与参数调优功能。
它有三种工作模式:
- 脚本运行模式
- 图形界面运行模式
- vnpy插件模式(将极速K线图表嵌入vnpy为其提供服务)
具体快多少?
- K线图表快几个数量级,你没听错,说快100倍可能都太保守,K线超过一定数量后vnpy会完全卡死,而VnpyRS依然流畅,VnpyRS的K线图表绘制采用wgpu技术(类似vulkan),充分利用显卡的并行运算性能
- 数据库读取速度最快是vnpy的6倍以上(Sqlite),目前支持Sqlite、MySQL、PostgreSQL、MongoDB
- 策略代码执行快7%-87%,具体见下表: (测试环境:Win11,Python3.11.3,CPU:12th Gen Intel(R) Core(TM) i7-12700H 2.30 GHz,内存:32G。 测试时均用GUI且置于前台,测多次取次小值。 另:不同的Python版本性能优化程度不同,其中Python通用版是最慢的,做性能测试时不应考虑该版本)
策略名称 | vnpy耗时 | VnpyRS耗时 | 加速百分比 |
---|---|---|---|
AtrRsiStrategy | 11.7 | 8.62 | 36% |
BollChannelStrategy | 1.82 | 1.09 | 67% |
DoubleMaStrategy | 5.04 | 4.45 | 13% |
DualThrustStrategy | 6.38 | 3.42 | 87% |
KingKeltnerStrategy | 2.86 | 1.92 | 49% |
MultiSignalStrategy | 12.1 | 11.3 | 7% |
MultiTimeframeStrategy | 2.47 | 1.55 | 59% |
TurtleSignalStrategy | 19.8 | 11.8 | 68% |
由来
vnpy是一个非常不错的开源量化交易框架,除了CTP接口(或类似CTP的接口)部分是用C++、Python混合写的以外,其他部分全是用Python写的。众所周知,Python生态强大,编码灵活,但是有个缺点,就是慢,如果是慢在IO密集的地方,影响不明显,但如果慢在计算密集的地方,比如策略回测,那影响就很明显了。2024年,我实验性的用Rust重写了vnpy的回测模块,惊喜的发现,运行速度提升了近20倍。 显然,将回测模块移植到Rust上这件事的价值是巨大的。但还有个问题,由于它100%是用Rust编写的,包括策略也是用Rust编写的,那用户就无法使用Python的各种库了。况且,Rust是出了名的难入门的语言。上述的两点会降低它的实用性。
因此,在2025年我重新设定了目标,该项目必须完全兼容Python生态,理想情况下100%兼容已经为vnpy编写的策略,同时要提升性能。 由于用户代码是用Python编写的,那么性能提升就不会像用纯Rust编写时那样夸张了,但省下的时间依然不少。如果用examples文件夹里面的案例测试,在不改一行策略代码的情况下,在10核32G的电脑上,配合Python3.11,综合速度提升了一倍。(具体提升多少涉及硬件配置、Python版本和具体策略)
开发路线图
不会完全移植vnpy。一个原因是vnpy用到了很多动态语言的特性,以实现插件化,这部分在静态语言上实现很困难,或者需要大量的unsafe代码。另一个原因是没必要,涉及网络的模块,绝大部分时间花在网络的等待上,即使通过Rust、C++重写,体验也不会明显变好。
未来可能会支持用Rust、C、C++写策略,这样的话回测性能提升10倍也是有可能的,但需要谨慎的思考如何设计接口。
更新日志
0.1.1:支持sqlite和mysql数据库(2025-1-10)
0.1.2:修复BarData和TickData中的datetime与vnpy里的有差异的问题(2025-1-12)
0.2.0:vnpy自带的所有策略均通过了测试;支持GUI模式;支持K线图表及K线图表嵌入vnpy的模式;支持不带身份校验的MongoDB;修复若干重要bug(2025-3-25)
0.2.1:支持PostgreSQL数据库;修复导出csv时会出错的问题(2025-5-8)