首页/回测/如何回测

如何回测交易策略——分步指南

回测交易策略时,先精确定义入场、出场和仓位规则,获取并清洗历史数据,在每根 K 线上只用当时可得的信息模拟交易,计入佣金和滑点,再进行样本外验证。把最后 20–30% 的数据留作保留测试集,并将结果与买入并持有进行比较。

正确地回测一个策略比看上去要难。这不只是把一些历史数据丢进脚本里跑一遍——它需要认真对待数据质量、成交的真实性和统计验证。本指南将带你走完整个流程,从定义规则到解读结果。

第 1 步:精确定义策略规则

在接触任何数据之前,先用毫不含糊的语言写出策略规则。像“股票看起来超卖时买入”这样模糊的规则是无法回测的。你需要:

  • 入场条件:具体是哪些指标数值、价格关系或事件触发买入或做空信号
  • 出场条件:什么会让仓位平掉——反向信号、固定止盈目标、止损,或时间限制
  • 仓位规模:每笔交易分配多少资金(权益百分比、固定美元金额、凯利公式)
  • 标的范围:策略适用于哪些资产
  • 执行时机:开盘、收盘,或在特定价格挂限价单

规则定义得越精确,实现过程中可能引入偏差的模糊空间就越小。

第 2 步:获取并清洗数据

历史数据的质量是可靠回测的基础。常见问题包括:

  • 公司行为:拆股和分红会扭曲原始价格序列。计算收益率时始终使用复权收盘价。但要小心——复权价格是追溯重新计算的,如果处理不当,可能会引入不易察觉的前视偏差(look-ahead bias)。
  • 幸存者偏差:免费数据源通常只包含当前仍在交易的股票。已退市、被合并或破产的公司被排除在外,让过去看起来好得不真实。要避免这一点,应使用包含历史成分股及退市数据的数据集。
  • 数据缺口与异常值:检查缺失的 K 线、成交量为零的交易日,以及很可能是数据错误的极端价格尖峰。一个损坏的数据点就可能产生一笔虚假交易,并主导整个结果。

第 3 步:在没有前视偏差的前提下实现策略

前视偏差——用未来的信息做过去的决策——是回测中最常见、危害也最大的错误。黄金法则:在第 t 根 K 线上,你的策略只能使用在第 t 根 K 线及之前可获得的信息。

实用检查:如果你在第 t 根 K 线上计算 20 日 SMA,它应该使用第 t-19 到第 t 根 K 线——而不是 t 之后的任何一根。如果你在信号出现后于第 t 根 K 线收盘时入场,可以使用第 t 根 K 线的收盘价,但前提是你确实能以这个价格成交。实际操作中,在第 t+1 根 K 线开盘时入场更为稳妥。

第 4 步:真实地模拟交易成本

在扣除成本前看起来盈利的策略,扣除成本后往往变得无利可图。需要纳入:

  • 佣金:即使是“零佣金”平台也有成本——对流动性好的美股,以每边 0.01–0.05% 作为基准
  • 买卖价差:你以卖价(ask)买入、以买价(bid)卖出;价差是每次往返交易都必然发生的成本
  • 滑点:从信号生成到成交之间,市场会朝不利于你的方向移动;根据资产流动性,按每笔交易 0.05–0.20% 建模
  • 做空的借券成本:卖空需要借入股票,这会产生按年计算的费用(难借的股票每年成本可达 10–50%)

第 5 步:进行样本外验证

绝不要在同一份数据上既优化参数又评估表现。标准做法是:把历史数据分成两段。前 70–80% 用于开发和参数优化。最后 20–30% 留作严格的保留测试集(hold-out)——在策略最终定型之前不要碰它。样本外表现才是你对真实结果的诚实估计。

如需更稳健的验证,请使用滚动前推分析:让优化窗口随时间向前滚动,为每个时期生成样本外结果。这检验的是优化过程本身是否一致,而不只是某组幸运的参数是否碰巧有效。

第 6 步:正确解读结果

拿到回测结果后,要以批判的眼光评估它们:

  • 与买入并持有比较:如果标的资产本身收益为 15%,那么年化收益 10% 的策略就很差
  • 查看逐年表现:整体夏普比率很高,可能掩盖了一个只在某个特定时期有效的策略
  • 审视最严重的回撤期:从心理上讲,你能扛过那段时期继续持有吗?
  • 测试参数稳健性:策略在相近的参数(±10%)下是否依然有效,还是表现对精确数值极其敏感?

回测工具

回测工具链很重要。使用 pandas、backtrader 或 vectorbt 的 Python 是最灵活的选择,能让你完全掌控——但需要编程能力。TradingView 的 Pine Script 提供带内置策略测试器的可视化界面。QuantConnect 提供机构级的基础设施和丰富的数据。

如果想不写代码快速做原型,QuantPrompt 让你用自然语言描述策略,并立即获得完整的回测报告。这在策略开发的早期阶段尤其有用——在投入时间做完整实现之前,你可以快速测试许多想法。

常见问题

参考资料