halo 的技术博客

返回

量化交易中,回测是连接策略想法和实盘交易的桥梁。一个设计良好的回测框架能在很大程度上决定策略研发的效率和质量。本文将系统性地拆解如何从零搭建一个可靠的量化回测系统。

为什么不能用现成的回测框架#

市面上优秀的回测框架不少——Backtrader、Zipline、VeighNa、RiceQuant 的 RQAlpha——它们各有优势。但当你需要高度定制化的因子处理逻辑、非标准的数据清洗流程,或者想对底层执行细节有完全控制权时,自建框架就成为必要选择。

更重要的是,搭建回测框架的过程本身就是对交易逻辑的深度思考。你会被迫回答这些关键问题:滑点如何建模?手续费结构是否合理?涨跌停时订单如何处理?这些问题在现成框架中被封装成参数,很容易被忽略。

核心架构:六大模块#

1. 数据引擎#

数据引擎是回测系统的基石。它至少需要支持:

  • 多品种日线/分钟线数据:A 股至少覆盖 5000+ 标的,分钟线数据量轻松突破 TB 级
  • 复权处理:前复权和后复权各有适用场景,前复权适合策略回测,后复权适合组合净值计算
  • 数据校验:缺失值、异常值、停牌日的处理逻辑必须在数据层统一解决

建议使用 Parquet 或 Feather 格式存储,读取速度比 CSV 快 10 倍以上。配合 DuckDB 或 Polars,可以在不把全部数据加载到内存的前提下完成大规模筛选。

回测数据架构示意图

2. 策略接口#

策略接口定义了策略开发者的交互方式。一个好的策略基类应该暴露以下钩子:

class BaseStrategy:
    def on_bar(self, bar_data):
        """每个 Bar 触发一次"""
        pass

    def on_order(self, order):
        """订单状态变更回调"""
        pass

    def on_trade(self, trade):
        """成交回调"""
        pass
python

策略内部可以访问行情数据、持仓信息、账户状态,并发出订单指令。关键设计原则是策略与执行分离——策略只负责生成信号,不关心订单如何成交。

3. 订单管理与撮合引擎#

这是回测中最容易出 Bug 的模块。撮合引擎需要处理的情况包括:

  • 涨跌停限制:10%、20%(科创板/创业板)、30%(北交所)
  • T+1 制度:当日买入次日才能卖出
  • 部分成交:流动性不足时只成交部分数量
  • 滑点模型:固定滑点 vs. 成交量加权滑点 vs. 市场冲击模型

一个常见的坑是:回测中使用了”收盘价成交”的假设,实盘却根本无法在收盘价买入。建议至少引入 1-2 tick 的买卖价差作为最低滑点成本。

订单撮合流程图

4. 组合管理与风控#

组合管理模块负责维护持仓、计算净值、处理分红送股等公司行为。风控模块则实时监控:

  • 个股权重上限:单票不超过 10%
  • 行业集中度:单一行业不超过 30%
  • 最大回撤熔断:回撤超过阈值时暂停交易
  • 流动性约束:日成交额低于一定阈值的股票不予交易

这些约束在回测中执行,能有效避免”纸上富贵”——一些看似收益率惊人的策略,往往是因为买入了无法实际成交的小盘股。

5. 性能分析#

回测完成后,需要系统性地评估策略表现:

指标含义关注点
年化收益率平均每年的回报> 15% 较优
夏普比率风险调整后收益> 1.0 可接受
最大回撤峰值到谷底的最大跌幅< 25% 较优
卡尔玛比率年化收益/最大回撤> 0.5 可接受
胜率盈利交易占比不单独看
盈亏比平均盈利/平均亏损> 1.5 较优

6. 参数优化与过拟合防范#

这是自建框架最容易出问题的环节。当你对策略进行参数优化时,很容易陷入过拟合。几个实践经验:

  • 样本外测试:至少保留 30% 的时间段不参与优化
  • 交叉验证:将历史数据分成多段,轮流做训练集和测试集
  • 参数敏感性分析:观察参数微调后策略表现的稳定性。如果参数变 1% 结果天差地别,大概率是过拟合
  • 简单性原则:参数越少越好。一个 2 参数的策略比一个 20 参数的策略更可能在未来有效

技术选型建议#

Python 生态在量化领域占据绝对主导。推荐技术栈:

  • 数据处理:Polars(比 Pandas 快 5-10 倍)或 DuckDB
  • 数值计算:NumPy + Numba(JIT 编译加速回测循环)
  • 可视化:Plotly(交互式)或 Matplotlib(出版级图表)
  • 数据存储:Parquet + MinIO/S3
  • 任务调度:Airflow 或 Prefect

对于回测速度有极致要求的场景,可以考虑用 Rust 或 Cython 重写核心循环。一台普通的 M2 MacBook Air 足以支撑日频策略的快速迭代。

总结#

自建回测框架不是炫技,而是为了获得对交易逻辑的深度掌控。从数据引擎到撮合引擎,从风控到性能分析,每一个模块都值得认真设计。好的回测系统不是一次性建成的——它会在不断的策略研发中迭代演进,最终成为你最可靠的量化基础设施。

量化回测框架搭建:从零构建一个可靠的策略验证系统
https://blog.halo26812.eu.org/blog/backtest-framework-build
Author halo
Published at 2026年6月16日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨