回测框架别乱选:五个工具,一个信号,到底谁最靠谱
前两天有个做量化的朋友问我:“我应该用哪个回测框架?”
他列了一串名字:NautilusTrader、Qlib、RQAlpha、vectorbt、Backtrader。
我说你先别选。我问了他一个问题:你到底想验证什么?
他愣了三秒。
这就是大多数人的起点——先找工具,再想问题。而正确的顺序恰恰相反。
一、框架选错,回测就是在验证你的误解
很多人一开始会问:哪个框架最好?
这个问题太粗了。因为"最好"取决于你要验证的问题。
如果你只是想知道一个全市场信号有没有预测力,你最需要的是快速处理大量股票、日期和参数。这时候矩阵化研究框架更有价值。
如果你想知道在 A 股真实交易规则下能不能成交,你最需要的是 T+1、涨跌停、整手、手续费、印花税和撮合规则。这时候事件驱动回测框架更有价值。
如果你要把同一套策略代码从回测推到实盘,你最需要的是交易系统级架构。这时候 NautilusTrader 这种重型引擎才有意义。
框架选错,回测不是验证策略,而是在验证你的误解。
那五个框架到底是什么关系?
简单说,它们根本不在同一个抽象层级上。
vectorbt 是信号实验室。Qlib 是因子研究平台。RQAlpha 是交易规则模拟器。Backtrader 是老牌通用回测器。NautilusTrader 是生产级交易引擎。
你拿生产级引擎去筛信号,就像用手术刀切菜——不是不能用,但你切完菜,刀也钝了。
最好的工具不是功能最多的那个,而是离问题最近的那个。
二、vectorbt:快是快,但 A 股规则要你自己补
vectorbt 的定位非常直白:Thinks in matrices. Backtests at scale.
它基于 pandas、NumPy 和 Numba,把交易信号当成矩阵处理。对于已经有 DataFrame 的研究者,这是极大的效率优势。
你有一个收盘价矩阵。你有一个信号矩阵。你可以快速得到收益曲线、回撤、Sharpe、交易记录、参数扫描结果和多股票组合表现。
在 Notebook 里跑一下pf.stats()和pf.plot(),体验非常好。
但问题是——它不是 A 股规则模拟器。
T+1、涨跌停、停牌、ST、退市、整手、印花税单边、冲击成本,这些都需要你自己准备约束矩阵或自定义订单逻辑。
你得自己生成can_buy[date, stock]、can_sell[date, stock]、lot_size[date, stock],然后再把这些约束传进订单生成层。
换句话说,vectorbt 给你一辆跑车,但交通规则得你自己画。
它最适合做第一层粗筛:这个信号有没有大致统计优势?参数是否敏感?分年表现是否稳定?成本稍微加一点收益是不是就消失了?
但如果一个策略只在 vectorbt 里好看,还不能说明它能通过 A 股真实规则复核。
另外,vectorbt 的许可证是 Apache 2.0 with Commons Clause。它不是普通的 Apache-2.0。如果要商用封装或把它作为付费服务核心,需要单独审查许可。
速度快不代表结果真,A 股回测不补规则就是纸上谈兵。
三、Qlib:微软出品,全 A 股信号研究的第一站
Qlib 是微软开源的 AI-oriented quantitative investment platform。
注意,它不是单纯的下单回测器。它覆盖数据处理、模型训练、回测、风险分析、组合优化和执行模拟。
它最适合的输入不是"下一根 K 线买不买",而是一个全市场预测分数表。
Qlib 官方策略文档给出的 prediction score 是 pandas DataFrame,索引是(datetime, instrument),包含score列。这个结构和全 A 股信号天然匹配。
有了这个分数,Qlib 可以做 TopK、Dropout、组合回测、benchmark 对比、成本后收益、风险分析和报告输出。
它对 A 股约束也不是空白。Qlib 的源码里有trade_unit、limit_buy、limit_sell、open_cost、close_cost、min_cost、impact_cost、volume_threshold等机制。源码注释还写明trade_unit=100可用于中国 A 股市场。
这意味着 Qlib 比 vectorbt 更适合直接承载全 A 股组合研究。
但 Qlib 也有明确的问题:数据。
Qlib 官方数据集因为更严格的数据安全政策暂时关闭了。官方提醒,Yahoo 数据可能不完美,严肃研究建议用户准备自己的高质量数据。
所以,Qlib 的正确用法不是"相信它自带的数据"。
正确用法是:把你的 A 股数据整理成 Qlib 格式,把你的信号整理成 prediction score 格式,用 Qlib 做 TopK、分组、OOS、walk-forward、成本后收益和风险分析,对通过筛选的策略再进入 RQAlpha 复核。
Qlib 的价值不是替你判断数据真伪,而是把信号研究流程标准化。
四、RQAlpha:更接近 A 股交易规则的复核器
RQAlpha 是米筐开源的量化框架。
它和 Qlib 的区别很重要:Qlib 更像研究平台,RQAlpha 更像交易规则模拟器。
RQAlpha 的sys_simulationMod 支持不同撮合方式。日回测可用 current_bar 或 vwap;分钟回测可用 current_bar、next_bar、vwap;tick 回测还支持 last、best own、best counterparty、counterparty offer。它还支持涨跌停撮合限制、成交量限制、无成交量 bar 限制和滑点模型。
RQAlpha 的sys_transaction_costMod 负责股票、期货等不同市场和品种的交易税费计算。
更关键的是,RQAlpha 的 changelog 明确提到market_tplus字段,用来标识合约对平仓时间的限制,例如 A 股 T+1。changelog 也记录了 A 股 T+1 逻辑重构、涨跌停滑点边界、Signal 模式下涨跌停订单拒绝等变化。
这说明 RQAlpha 对中国市场交易约束的关注,比 vectorbt、Backtrader、NautilusTrader 更直接。
需要注意的是,RQAlpha 仅限非商业使用,商业使用需要联系米筐。数据方面需要 RQDatac 权限或手动下载 bundle。
所以,RQAlpha 很适合做第二层复核:Qlib 发现一个信号可能有效,RQAlpha 检查它在 A 股规则、撮合、成本、涨跌停和 T+1 下是否仍然有效。
研究看统计,落地看规则。Qlib 和 RQAlpha 是一对好搭档。
五、NautilusTrader:不是回测小工具,而是交易引擎
NautilusTrader 是一个开源、Rust-native、生产级交易引擎。
它的官方 README 把它描述为面向多资产、多市场交易系统的引擎,并强调 deterministic event-driven architecture。简单说,它关心的不只是"算一条收益曲线",而是"同一套策略逻辑如何在研究、仿真、实盘之间保持一致"。
它的核心结构更像交易系统内核:venue、instrument、portfolio、order、execution、message bus、cache、strategy、actor 都是框架的一部分。
这个设计很强,但也很重。
如果你只是拿一个 pandas DataFrame 和一个信号列,想快速检查信号是否有效,NautilusTrader 会显得绕。你要先定义 instrument、venue、数据结构、catalog、strategy config 和 execution config。
它的数据侧也不是"给一个 CSV 就自动跑完"的轻量模式。官方强调需要用 DataLoader 读取外部格式,再用 DataWrangler 转成 Nautilus 的数据对象,或者写入ParquetDataCatalog后供BacktestNode使用。
GitHub 数据显示它有 24000 多颗星,最新版本已经到了 v1.228.0,每周都在更新。但它没有原生 QMT/miniQMT/A 股数据接口。
适合它的场景是:你未来要接实盘,你需要多市场多资产多 venue,你在意回测和实盘执行语义一致,你愿意为工程严谨性付出学习成本。
不适合它的场景是:你只是想快速检验全 A 股信号,你的数据还是 CSV/Parquet/宽表矩阵,你暂时不做实盘。
用 NautilusTrader 做信号初筛,就像开战斗机去菜市场——杀鸡用了牛刀,刀也累了。
六、Backtrader:老牌框架,能用但不一定是首选
Backtrader 是很多 Python 量化研究者熟悉的老牌框架。
它的概念直观:写 Strategy,喂 DataFeed,跑 Cerebro,看结果。支持 CSV、online sources、pandas 数据源,多数据源,多策略,commission schemes,slippage,volume filling,cash adjustment 和 matplotlib plotting。
GitHub 上有 22000 多颗星,但最近一次 push 是 2024 年 8 月。相比其他四个框架,维护活跃度偏弱。
它的缺点是:对全市场矩阵化信号不够自然,对 A 股规则不够原生,对生产级研究到实盘一致性不够强,代码风格偏老,现代数据工程集成成本较高。
Backtrader 不是不能用。对已有 Backtrader 代码资产的人,或者想做传统事件驱动策略复核的人,它依然值得考虑。
但对"全 A 股所有股票信号有效性检查"这个具体任务,它不是第一推荐。
老牌不代表过时,但维护节奏慢的框架,踩坑时可能找不到人问。
七、A 股四个关键约束,谁更省心?
有四个约束非常关键:T+1、涨跌停、最小交易单位、成本。这四个约束决定了一个回测是不是 A 股回测。
T+1
A 股股票通常今天买入,下一交易日才能卖出。
RQAlpha 最明确,changelog 里有market_tplus,并记录了 A 股 T+1 逻辑重构。Qlib 日频组合回测天然按交易步推进,但分钟级严格 T+1 需要确认执行器和持仓可卖逻辑。vectorbt、Backtrader、NautilusTrader 都需要用户自定义。
涨跌停
涨停不一定买得到。跌停不一定卖得出。
RQAlpha 有 price_limit 和涨跌停撮合限制。Qlib 有limit_buy、limit_sell。vectorbt 需要can_buy、can_sell矩阵。Backtrader 和 NautilusTrader 需要自定义撮合逻辑。
最小交易单位
普通 A 股买入通常按 100 股整手申报。
Qlib 的trade_unit机制最直接,源码注释说明 100 可用于中国 A 股市场。RQAlpha 有 min order quantity 和 order step size。vectorbt 有size_granularity,但它只是数量粒度,不等于完整 A 股交易制度。
成本
A 股成本不是一个fees=0.0003就完事。
成本至少包括:买入佣金、卖出佣金、过户费、卖出印花税、滑点、冲击成本、最低佣金。财政部、税务总局公告显示,自 2023 年 8 月 28 日起,证券交易印花税实施减半征收,实务上 A 股股票卖出方单边印花税从 0.1% 调整为 0.05%。
框架层面,RQAlpha 的 transaction cost mod 最贴近中国市场。Qlib 有open_cost、close_cost、min_cost、impact_cost。vectorbt 有fees、fixed_fees、slippage,但买卖不同费率和印花税变化需要自定义。Backtrader 有 commission schemes,但 A 股细节需自定义。NautilusTrader 订单和费用模型可扩展,但需要工程实现。
没有规则约束的回测,只是数字游戏。
八、回到更大的图景
回测框架的本质是什么?
它不是让你画出漂亮的收益曲线。它是让你在花钱之前,先用历史数据回答一个问题:这个信号是真的有效,还是只是噪声?
五个框架各有定位。vectorbt 快,Qlib 准,RQAlpha 真,Backtrader 稳,NautilusTrader 深。
选哪个不重要。重要的是你知道自己在验证什么。
先想清楚要验证什么,再选工具。否则工具再强,也算出错误的答案。
延伸阅读 / 参考来源:
• NautilusTrader GitHub (24K+ stars): https://github.com/nautechsystems/nautilus_trader
• Qlib GitHub (44K+ stars): https://github.com/microsoft/qlib
• RQAlpha GitHub (6.4K+ stars): https://github.com/ricequant/rqalpha
• vectorbt GitHub (7.9K+ stars): https://github.com/polakowo/vectorbt
• Backtrader GitHub (22K+ stars): https://github.com/mementum/backtrader
• 财政部、税务总局证券交易印花税减半公告: https://shanghai.chinatax.gov.cn/zcfw/zcfgk/yhs/202308/t468451.html