发布于vn.py社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2022-01-27
记得去年在写2021年计划的时候,提到过Python之父Guido加盟微软,未来Python性能方面的优化值得期待。
然后居然在2021年5月的Python语言峰会上,Guido就做了一场《Making CPython Faster》的分享,并宣布已经投入了名为"Shannon Plan"(“香农计划”)的Python性能优化计划,期望在未来分4个阶段把Python的速度提高5倍。感兴趣的同学推荐阅读【Python猫】公众号的这篇《与 Python 之父聊天:更快的Python!》。
除此外,由Sam Gross发起的nogil项目已经在Python 3.9的基础上成功证明了移除GIL的可行性(支持多核运行的同时在单核性能基准上没有显著降低)。关于nogil项目的一些情况,同样推荐【Python猫】公众号的《Python 官方研讨会:彻底移除 GIL 真的可行么?》。
这样的情况下,即使还没有Python官方JIT(Just-In-Time Complier)的消息,【5倍性能提升】以及【多核CPU支持】这两点改进也十分值得期待了。
对于vn.py项目来说,2022年的重点工作就是全新3.0版本的开发,虽然很多细节内容还在逐渐摸索,但是整体的方向已经基本定下。
向上兼容性的保证
在之前2019年的1.0 -> 2.0的升级中,由于函数接口和数据结构的变化,给许多老用户的升级带来了不小的麻烦。
本次2.0 -> 3.0的升级中,将会尽可能保证向上兼容性。具体来说,对比2.0大版本中收尾的2.9.0:
底层数据结构名称兼容,如:
- TickData
- OrderRequest
数据结构字段和类型兼容,如:
- TickData.last_price,float类型
- OrderRequest.direction,Enum类型(Direction枚举值)
事件引擎和核心引擎的方法函数兼容,如:
- EventEngine.register,注册事件处理函数
- MainEngine.send_order,委托下单
标准插件基类的方法函数兼容,如:
- BaseGateway.on_tick,推送行情数据
- BaseDatabase.load_bar_data,读取K线数据
策略应用模块的策略模板兼容,如:
- CtaStrategy模块下的CtaTemplate
- SpreadTrading模块下的SpreadStrategyTemplate
总体上的目标,就是使用2.9.0开发运行交易策略的用户,可以平滑的过度到3.0上,不用再重写大量已有的代码(毕竟再也不想有类似Python 2 -> 3的迁移经历了)。
升级到Python 3.10
在3.9和3.10之间摇摆了几周,考虑到未来几年的技术迭代需求以及性能速度优势,还是决定选择3.10版本的Python来作为新的官方主力支持版本(之前三年使用的是3.7)。
截止目前(2022年1月26日),许多量化交易中常用的工具库也都已经发布了3.10版本的支持,包括NumPy、Pandas、Plotly、PyZMQ等。
本次主力支持版本升级后,列举两个比较值得期待的改进尝试方向:
多进程共享内存支持(3.8新增)
- multiprocessing.shared_memory
- 执行各种多进程任务时,减少重复数据的内存开销
结构化模式匹配(3.10新增)
- match和case关键字(类似C++的switch/case)
- 策略中实现复杂状态控制时,代码可以更加简洁清晰
类型提示全面覆盖
从3.5版本开始,Python引入了类型提示功能(type hinting),允许对变量、参数、函数返回值添加类型信息,类似下面的语法:
def get_order(self, vt_orderid: str) -> Optional[OrderData]:
"""基于委托号查询委托信息"""
return self.orders.get(vt_orderid, None)
尽管还是无法像静态语言(C++/Java)一样进行编译期检查,但有了类型提示后,结合上VS Code等编辑器的智能补全功能,写Python代码时的工作效率明显更上一层楼。
2.9.0版本已经初步达成了核心组件的类型提示覆盖,在3.0中会进一步把这个范围扩展到所有插件模块,让vn.py的代码可读性变得更加清晰。
最后:2022,Enjoy Trading!!!