halo 的技术博客

返回

为什么你需要一个回测框架#

很多量化初学者都有一个共同的误区:在 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)
python

Backtesting.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 做交互式看板

一个完整的回测流程应该是这样的:

  1. 数据准备:获取标的价格、财务数据、行情数据,做好复权和清洗
  2. 信号生成:定义买入和卖出条件,确保没有未来函数
  3. 仓位管理:设定单只股票最大仓位、总仓位限制、止损止盈规则
  4. 执行回测:跑历史数据,记录每一笔交易的细节
  5. 结果分析:计算收益曲线、风险指标、归因分析
  6. 稳健性检验:参数敏感性分析、不同时间段测试、随机打乱检验

写在最后#

回测框架不是越复杂越好,关键是你理解每一行代码在做什么。很多量化新人一上来就用别人的开源框架,改几个参数就跑,出了问题也不知道原因在哪。

我的建议是:先用 Backtesting.py 手写一个最简单的双均线策略,把每一笔交易的”为什么买、为什么卖”打印出来。等你能解释每笔交易的逻辑之后,再逐步引入更复杂的特性。

量化交易的本质不是代码,而是对市场的认知被代码化。框架只是工具,真正值钱的是你的交易逻辑。

量化回测框架实战:从零搭建你的策略验证系统
https://blog.halo26812.eu.org/blog/backtesting-framework-guide
Author halo
Published at 2026年6月18日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨