WonderTrader实战:C++回测引擎跑茅台SMA 5/20,28次交易盈利仅5次
一个 C++ 写的 A 股回测框架,性能是 Python 的几十倍
WonderTrader 是国内量化圈里一个比较特别的存在——它是用 C++ 写的,不是 Python。在量化框架几乎被 Python 统治的今天,用 C++ 做回测引擎意味着什么?意味着处理海量 tick 级数据时的性能是 Python 框架的几十倍,意味着实盘交易时的延迟是微秒级而不是毫秒级。对于做高频或日内策略的人来说,这个差异是决定性的。
我拿它对茅台跑了 SMA 5/20 双均线策略,结果和 RQAlpha 那篇的结论几乎一样——三年半亏损 15.46%、夏普 -2.03、胜率仅 17.9%、利润因子 0.18。但 WonderTrader 的报告比 RQAlpha 多了月度盈亏统计和更详细的 WtBtAnalyst 指标,对策略的"失败原因"拆解得更加透彻。
起步
从 EasyClaw 官网下载安装。不需要手动编译 C++ 源码、不需要配 Boost 依赖。
打开后左侧找「Skill」→「Skill Creator」。灰显的话去「设置 → 通用」打开「开发者模式」重启。
创建 Skill
在 Skill Creator 里告诉 EasyClaw:
帮我把 GitHub 上的 WonderTrader(https://github.com/wondertrader/wondertrader)做成一个 A 股回测 Skill。我希望输入股票代码和均线参数就能跑双均线策略,输出 WtBtAnalyst 格式的完整分析报告——含核心绩效指标、月度盈亏统计和逐笔交易明细。
EasyClaw 会自动拉代码、编译 C++ 引擎、配置 A 股数据源、封装成 Skill。底层的 C++ 编译、交易规则配置、Excel 报告生成——全部自动完成。
Skill 创建好后:
用 WonderTrader 回测贵州茅台,2023 年初到现在,SMA 快线 5 慢线 20

回测结果:28 次交易只赢了 5 次
核心绩效
| 指标 | 值 | 怎么看 |
|---|---|---|
| 总收益率 | -15.46% | 和 RQAlpha 的 SMA 5/20 一模一样 |
| 年化收益 | -4.58% | 每年稳定亏损 |
| 夏普比率 | -2.03 | 比 RQAlpha 的 -1.29 更差——WtBtAnalyst 对波动率的计算更保守 |
| 索提诺比率 | -2.73 | 只算下行波动的夏普——下行风险尤其严重 |
| 最大回撤 | -16.87% | 和 RQAlpha 一致 |
| 总交易次数 | 28 | 只有 RQAlpha 的一半——信号更少 |
| 胜率 | 17.86% | 28 次交易只赢了 5 次 |
| 利润因子 | 0.179 | 总盈利 / 总亏损 = 0.18——亏的钱是赚的钱的 5.6 倍 |
月度盈亏统计(节选)
WonderTrader 的 WtBtAnalyst 会按月汇总交易表现——这是 RQAlpha 没有的功能:
| 月份 | 净利润 | 次数 | 胜率 | 收益率 |
|---|---|---|---|---|
| 2023/02 | -¥8,558 | 1 | 0% | -0.86% |
| 2023/08 | +¥16,617 | 1 | 100% | +1.66% |
| 2024/10 | -¥34,617 | 1 | 0% | -3.46% |
| 2025/04 | +¥17,717 | 2 | 100% | +1.77% |
| 2026/03 | -¥30,435 | 2 | 0% | -3.04% |
月度数据揭示了一个残酷的事实:亏损月的亏损幅度(-3.46%、-3.04%)远大于盈利月的盈利幅度(+1.66%、+1.77%)。这是利润因子 0.18 的直观体现——你赚的时候只是小赚,亏的时候却是大亏。策略的盈亏结构完全颠倒:一个健康策略应该是"斩断亏损、让利润奔跑",而这个策略是"让亏损奔跑、微利就跑"。
为什么两个框架的结果几乎一样?
RQAlpha 和 WonderTrader 在同一个策略、同一个标的、同一个区间上跑出了几乎一样的结果——总收益都是 -15.46%,最大回撤都是 -16.87%。这说明这个策略的失败不是框架的问题,而是策略本身在这个区间上就是失效的。两个独立引擎得出一致结论,这个结论的可信度很高。
差异在于交易次数:RQAlpha 产生了 57 笔交易,WonderTrader 只有 28 笔。原因可能是两者对"均线交叉信号"的实现细节不同——比如 RQAlpha 可能在金叉当天入场,WonderTrader 可能在金叉次日入场。细节差异导致信号数量的差异,但最终收益结果几乎完全一致——说明 SMA 5/20 在茅台上无论如何调整入场时机,都无法改变亏损的命运。
夏普比率的差异(-1.29 vs -2.03)值得注意——WtBtAnalyst 在计算年化波动率时可能使用了不同的年化因子。这不影响结论的方向(都是负数),但说明不同框架的同一个指标可能无法直接对比——跨框架比较策略时要注意公式差异。
WonderTrader 和 RQAlpha 的区别
| WonderTrader | RQAlpha | |
|---|---|---|
| 语言 | C++(编译型,高性能) | Python(解释型) |
| 性能 | 微秒级延迟,适合高频和 tick 级回测 | 毫秒级,适合日频和分钟级 |
| 报告格式 | Excel 多 Sheet(WtBtAnalyst) | CSV + PNG |
| 月度统计 | 有(逐月盈亏+胜率) | 无 |
| 适合 | 高频/日内/多品种组合 | 中低频/单品种/因子研究 |
如果你做的是日频策略、单品种回测,RQAlpha 和 WonderTrader 的实际体验差别不大。但如果你需要处理全市场 5000 只股票的 tick 级数据、或者需要把策略直接部署到实盘,C++ 的性能优势就体现出来了。
常见报错
| 错误 | 原因 | 解决方法 |
|---|---|---|
| C++ 编译失败 | 缺少 Boost 或其他 C++ 依赖 | Skill 自动处理,如手动安装需确保 Visual Studio Build Tools 可用 |
| Excel 报告中无月度统计 | 回测区间太短,不足一个月 | 至少运行 3 个月以上 |
下一步
- 把策略参数从 5/20 换成 10/30,看交易次数和胜率的变化
- WonderTrader 支持多品种组合回测,可以同时跑茅台+五粮液+泸州老窖的组合策略
资源链接:
- EasyClaw 下载:https://easyclaw.cn/?f=734
- WonderTrader GitHub:https://github.com/wondertrader/wondertrader
你更看重回测框架的性能还是易用性?有没有因为框架性能不够而放弃过某个策略?欢迎聊聊。

浙公网安备 33010602011771号