量化回测的新选择:既要Python的灵活,又要Rust的性能
做量化研究的朋友都清楚,回测框架这东西,选起来挺纠结的。
用Backtrader、Zipline这些Python框架吧,上手快,生态好,但数据量一上去就慢得让人抓狂。跑个十年八年的分钟线回测,再调几次参数,半天就过去了。
自己用C++或Rust撸一个高性能引擎?理论上是爽,但光是把Python那套数据处理、可视化、机器学习的生态接过来就够喝一壶的。写策略还得学门新语言,对大多数研究者来说,成本太高。
AKQuant想解决的,就是这个"既要又要"的问题——把Rust的性能和Python的生态拧在一起。
这个项目是AKShare团队做的。对,就是做数据接口的那群人。
这些年没少被用户吐槽:你们家数据给得挺快,可我回测跑不动啊。
于是他们干脆自己动手,做了个回测引擎出来。
怎么实现的?
其实就是把计算密集的脏活累活扔给Rust,策略逻辑这种需要频繁改动的脑力活留给Python。
Rust这边负责事件循环、订单撮合、资金计算这些重复劳动;Python这边写策略、分析结果、画图,该怎么玩还怎么玩。中间用PyO3这个工具打通,两边传数据的时候尽量少折腾。
实测下来,有些场景能比Backtrader快20倍。尤其跑高频数据或者同时测几百只股票的时候,差距特别明显。
用起来啥感觉?
对普通用户来说,完全不用碰Rust。
策略还是用Python写,数据还是用Pandas喂,结果还是用Matplotlib画。装起来也简单,pip install akquant就完事,跟装其他Python包没区别。唯一的变化是回测跑得更快了——快到你可能会不习惯,以前泡杯咖啡等结果,现在刚起身咖啡还没冲好就出数了。
当然也有短板
毕竟是新项目,社区和文档肯定没法跟Backtrader比。遇到问题Google一圈可能找不到答案,得去GitHub提issue。
另外如果真出bug了,尤其是怀疑底层引擎有问题的时候,调试起来会麻烦点——毕竟涉及Python和Rust两层。
适合谁用?
- 被回测速度憋得难受,又不想换语言重写一套的人
- 想做大规模参数优化,但现用框架扛不住的人
- 对Python生态有依赖,不想割舍NumPy、TA-Lib这些库的人
- 纯粹就是好奇,想看看Rust+Python能玩出什么花的人
AKQuant算不上革命性的产品,但确实是个挺务实的尝试。它没想颠覆谁,就是给那些被性能卡住脖子的人,多一个选择。
随着项目慢慢完善,说不定真能把Python量化生态和高性能计算之间的那道墙,凿开一道门。
快速上手
AKQuant 已发布至 PyPI,目前支持 Windows、macOS 和 Linux 三个平台,一行命令即可完成安装:
下面演示如何基于通达信TDXQuant获取数据,再接入AKQuant进行策略分析。
先用TDXQuant获取历史的K线数据(前复权的日线数据,包含开盘价、最高价、最低价、收盘价、成交量和成交额),转成Pandas DataFrame格式,就可以喂给AKQuant了。
示例一:最简单的策略
这个策略其实没有策略——不停地买与卖。
这里演示最简单的函数式风格,如果你更习惯 Zipline 或 Backtrader 的函数式写法,你应该会感到很熟悉:

运行输出示例:

运行后会输出各项绩效指标。
当然,这个策略收益很低,只是个用法演示。
示例二:简单的阳线买入策略
下面是一个最简单的策略示例:当收盘价大于开盘价(阳线)时买入,反之卖出。
这里同样采用最简单的函数式风格:

运行输出示例:

从结果看,这个策略微微亏本,没什么实战价值,但已经演示了AKQuant交易策略的基本编写规则。
示例三:使用简单均线交易:
这个策略演示,用简单移动平均线,金叉买入,死叉卖出:

交易结果类似下面这样:

示例四:使用自定义因子
AKQuant支持在DataFrame中传入任意数量的自定义数值字段,在策略中通过bar.extra访问,非常适合多因子策略。
下面用类风格来写(与函数式风格完全等价,看个人喜好):

交易结果类似下面这样:

上面几个例子演示了AKQuant的两种编程风格:
类风格适合复杂策略的组织管理,函数式更加简洁直观。
功能上二者完全等价,挑顺手的用就行。
以上程序我放到了网盘,可关注公众号tonyBalckWhite,私信tq,免费获取。
写在最后
AKQuant不是什么颠覆性的产品,它只是回答了一个很实在的问题:
能不能让做量化的人,不用在“快”和“爽”之间二选一?
这些年,Python坐稳了量化研究的主力语言,不是因为它最快,而是因为它最顺——数据有Pandas,画图有Matplotlib,机器学习有sklearn,回测有Backtrader。一套组合拳下来,从想法到验证的路径最短。
但这套组合拳打到大规模数据身上,就开始露怯了。于是不少人被迫做出选择:要么忍受速度,要么离开生态。
AKQuant想撕掉这个选择题。
它把Rust顶在前面扛活,把Python留在手里写策略。你要做的只是在pip install之后,继续用你习惯的方式写代码——然后看着以前要等半天的回测,几十秒跑完。
这不是炫技,是把刀用在刀刃上。
说到这儿,必须提一嘴通达信TDXQuant。
这次演示的所有例子,数据都来自它。做量化的人都知道,回测框架再快,数据喂不进来也是白搭。
TDXQuant把历史K线、前复权、各种因子干干净净地吐出来,转成DataFrame就能直接塞给AKQuant——没有中间商赚差价,没有格式转换的折腾。
这种“数据源+回测引擎”的无缝配合,才是真正顺手的工具链。
AKShare团队做数据接口做了这么多年,最清楚用户要什么——不是最酷的框架,而是最趁手的工具。TDXQuant负责把数据管好,AKQuant负责把回测跑快,各司其职,又严丝合缝。
以后这两个项目一起往前走,一个深挖数据质量,一个死磕回测性能,慢慢就能搭出一套完整的高效工作流。对用户来说,这意味着什么?意味着从数据获取到策略验证的整条路,都有人替你铺好了。
AKQuant还在路上,社区不大,文档不全,跟成熟框架比还有差距。但它开了一个头:证明Python和Rust可以这样捏在一起,证明高性能和易用性不一定是对头,也证明数据和回测本就不该分家。
那道横在Python量化生态和高性能计算之间的墙,也许真能被凿开一道门。
而推开这道门的人,可能就是下一个受够了等待的你。