为什么你需要一个回测框架#
很多量化初学者都有一个共同的误区:在 Excel 里算了几行收益率,就觉得自己发现了”圣杯策略”。等到真金白银投进去,才发现策略在实盘中表现一塌糊涂。
问题出在哪?缺乏系统化的回测验证。
回测不仅仅是”算一下历史收益”这么简单。一个合格的量化回测系统,至少需要解决以下几个问题:
- 数据清洗与对齐(停牌、复权、除权除息怎么处理?)
- 交易成本模拟(滑点、手续费、印花税的影响有多大?)
- 信号生成与执行的时序关系(你有没有无意中用了未来数据?)
- 风险指标的多维度评估(夏普比率高就一定好吗?)

主流回测框架横评#
目前 Python 生态中有几个主流的回测框架,各有优劣:
Backtrader#
Backtrader 是 Python 量化的老牌框架,功能全面但学习曲线陡峭。它支持多资产、多时间框架,内置了丰富的分析器(Analyzer)和指标库。缺点是文档散乱,社区活跃度近年来有所下降。
一个简单的双均线策略在 Backtrader 中大概需要 50-80 行代码。如果你愿意花时间啃文档,它是功能最完整的选择之一。
VectorBT#
VectorBT 是近年崛起的新星。它采用向量化回测的方式,速度比事件驱动型框架快 10-100 倍。特别适合做大规模参数扫描和策略优化。
import vectorbt as vbt
import pandas as pd
# 向量化回测的核心思路:一次计算,覆盖所有参数组合
price = pd.DataFrame(...)
fast_ma = vbt.MA.run(price, window=range(5, 50))
slow_ma = vbt.MA.run(price, window=range(50, 200))
entries = fast_ma.ma_crossed_above(slow_ma)
exits = fast_ma.ma_crossed_below(slow_ma)
pf = vbt.Portfolio.from_signals(price, entries, exits)pythonBacktesting.py#
如果你想要一个轻量级、API 直观的框架,Backtesting.py 值得一试。它的交互式 HTML 报告非常漂亮,适合快速原型验证。
Zipline-Reloaded#
Zipline 原是 Quantopian 的底层引擎,虽然 Quantopian 已关闭,但社区维护的 Zipline-Reloaded 仍然可用。它的 Pipeline API 设计优雅,适合做因子研究。
| 框架 | 速度 | 易用性 | 功能完整度 | 适合场景 |
|---|---|---|---|---|
| Backtrader | 中 | 中 | 高 | 复杂策略开发 |
| VectorBT | 极高 | 中 | 高 | 参数优化、因子研究 |
| Backtesting.py | 中 | 极高 | 中 | 快速原型 |
| Zipline | 中 | 中 | 高 | 因子研究 |
回测中最容易踩的五个坑#
1. 未来函数(Look-ahead Bias)#
这是最致命的错误。举个例子:你在 t 日收盘后生成信号,却用了 t 日的收盘价来成交——这在现实中是不可能的(你无法在收盘前知道收盘价)。
正确做法:用 t 日信号,t+1 日开盘价成交。
2. 生存者偏差#
你用的股票池只包含现在还活着的股票,那些退市的、ST 的都不在池子里——这会让你的回测收益虚高。务必使用”点-in-time”数据。
3. 过度拟合#
参数优化时,很容易陷入”在历史数据上做到完美”的陷阱。一个好的习惯是:将数据分为样本内(训练集)和样本外(验证集),只用样本内做优化,用样本外验证。
4. 忽略交易成本#
A 股的单边印花税是 0.05%(2024 年后),加上佣金和过户费,一个完整的买卖来回成本大约在 0.12%-0.15%。如果你的策略年化超额只有 5%,高频交易的成本会吞噬大部分收益。
5. 只看收益不看风险#
夏普比率 > 2 就万事大吉了吗?不一定。你还需要看最大回撤、Calmar 比率、盈亏比、胜率、连续亏损次数等指标。一个夏普 3.0 但最大回撤 60% 的策略,几乎不可能被实盘执行。

搭建你自己的回测系统#
推荐的技术栈组合:
- 数据层:AKShare / Tushare / JoinQuant 数据 → 本地 SQLite/Parquet 存储
- 回测引擎:VectorBT 做向量化回测 + Backtesting.py 做事件驱动验证
- 分析层:Pandas + NumPy 做统计分析,Plotly 做可视化
- 报告输出:Jupyter Notebook 或 Streamlit 做交互式看板
一个完整的回测流程应该是这样的:
- 数据准备:获取标的价格、财务数据、行情数据,做好复权和清洗
- 信号生成:定义买入和卖出条件,确保没有未来函数
- 仓位管理:设定单只股票最大仓位、总仓位限制、止损止盈规则
- 执行回测:跑历史数据,记录每一笔交易的细节
- 结果分析:计算收益曲线、风险指标、归因分析
- 稳健性检验:参数敏感性分析、不同时间段测试、随机打乱检验
写在最后#
回测框架不是越复杂越好,关键是你理解每一行代码在做什么。很多量化新人一上来就用别人的开源框架,改几个参数就跑,出了问题也不知道原因在哪。
我的建议是:先用 Backtesting.py 手写一个最简单的双均线策略,把每一笔交易的”为什么买、为什么卖”打印出来。等你能解释每笔交易的逻辑之后,再逐步引入更复杂的特性。
量化交易的本质不是代码,而是对市场的认知被代码化。框架只是工具,真正值钱的是你的交易逻辑。