Skip to content

回测基础概念

什么是回测

回测(Backtesting)是指利用历史市场数据,按照预设的交易策略规则模拟买卖操作,然后统计这段历史区间内的收益表现,以此来评估策略是否具有可行性的过程。

简单来说,回测回答的是一个核心问题:如果我过去按照这个策略交易,结果会怎样?

回测的本质是一套"时间机器"——你无法回到过去真正交易,但可以通过数据和程序来"假装"在过去交易了一次,看看结果如何。它是量化投资中验证策略想法的第一步,也是最基础、最重要的工具。

一个典型的回测流程可以概括为:

  1. 准备历史数据:获取股票的价格、成交量、财务指标等历史数据
  2. 定义策略规则:明确买入条件、卖出条件、仓位管理规则
  3. 模拟交易执行:程序按照规则在历史时间轴上逐日(或逐笔)执行模拟交易
  4. 计算绩效指标:统计收益率、最大回撤、夏普比率等指标
  5. 分析结果:判断策略是否值得进一步研究

下面用一个最简单的例子说明。假设你有一个策略:"当5日均线向上穿越20日均线时买入,向下穿越时卖出"。你想知道这个策略在2020年到2024年之间表现如何。你不需要真的等到2024年才知道结果——通过回测,你可以立刻用这段历史数据模拟出来。

python
# 回测的简化伪代码
for each trading_day in historical_data:
    if 均线金叉(5日, 20日):
        买入()
    elif 均线死叉(5日, 20日):
        卖出()
    记录持仓和净值()
计算绩效指标()

回测的前提假设

回测能够成立,依赖于若干重要的前提假设。理解这些假设,才能正确解读回测结果。

假设一:历史数据准确完整

回测的输入是历史数据。如果数据本身有错误(比如复权错误、缺失交易日、停牌未标记),那么回测结果就不可信。数据的准确性是回测可信度的根基。

在实际操作中,需要特别注意以下几点:

  • 前复权与后复权:由于股票会经历分红、送股等除权事件,如果不做复权处理,K线图上会出现"虚假"的跳空缺口。前复权以最新价格为基准向前调整,后复权以最早价格为基准向后调整。回测通常使用前复权数据,因为前复权价格可以直接反映持有期间的真实收益。
  • 停牌处理:停牌期间无法交易,回测中需要正确标记停牌日,避免在停牌日发出交易信号。
  • 涨跌停限制:A股有±10%(创业板和科创板±20%)的涨跌停限制。如果某只股票涨停,实际可能无法买入;跌停时可能无法卖出。回测中应该模拟这一约束。

假设二:策略规则是明确且可量化的

回测要求策略规则能够被精确定义为可执行的逻辑。模糊的主观判断(如"感觉大盘要涨")无法回测。策略的入场条件、出场条件、仓位大小、止损规则都必须有明确的数学表达。

假设三:交易可以按预期价格执行

这是最容易被忽视的假设。回测中通常假设你能以收盘价(或开盘价、次日开盘价等)成交,但现实中:

  • 你看到信号时可能已经错过了目标价格
  • 大单交易会冲击市场价格
  • 涨跌停时根本无法成交

假设四:市场流动性充足

回测通常假设你想买就能买到、想卖就能卖出。但对于小盘股或低流动性股票,这个假设可能不成立。当你的资金量较大时,单笔交易可能占当日成交量的很大比例,导致实际成交价格远偏离预期。

回测的局限性

理解回测的局限性,是避免被回测结果误导的关键。

局限性一:历史不代表未来

这是回测最根本的局限性。一个策略在过去5年表现优秀,不代表未来5年同样优秀。市场环境会变化:

  • 牛市有效的策略在熊市可能亏损严重
  • 某些行业轮动规律可能因政策变化而失效
  • 当越来越多投资者发现同一规律时,套利空间会被压缩

回测只能告诉你"过去发生了什么",不能保证"未来也会如此"。

局限性二:过度拟合(Overfitting)

这是回测中最常见、最危险的陷阱。当你针对某一段历史数据反复调整策略参数,直到回测结果看起来完美无缺时,你可能只是在"拟合噪声"而不是发现真正的规律。

过度拟合的典型表现:

  • 在回测期表现极好,但在未参与回测的验证期表现很差
  • 策略参数非常敏感,稍微修改参数结果就大幅变化
  • 对某一段特定历史行情有特殊的处理逻辑

防范过度拟合的方法:

  • 样本外测试(Out-of-Sample Testing):将数据分为训练集和测试集,只在训练集上优化参数,在测试集上验证效果
  • 交叉验证:将历史数据分成多段,轮流作为训练集和测试集
  • 参数鲁棒性检查:如果策略在参数的合理范围内都表现不错,说明策略是稳健的;如果只在某个精确参数值上表现好,就很可能是过拟合
  • 保持策略逻辑简单:越复杂的策略越容易过拟合。一个逻辑清晰、参数少的策略往往更可靠

局限性三:前视偏差(Look-Ahead Bias)

前视偏差是指在回测中使用了当时实际上不可能获得的信息。比如:

  • 使用了当日收盘价来决定当日买入(实际上你在盘中不可能知道收盘价)
  • 使用了尚未发布的财务数据
  • 使用了未来的分红信息来调整持仓

前视偏差会让回测结果虚高,因为它给了你"未卜先知"的能力。在构建回测框架时,必须严格确保每个交易日只能使用该日及之前的数据。

python
# 错误示例:前视偏差
for i in range(len(data)):
    if data['close'].iloc[i] > data['close'].iloc[i + 1]:  # 使用了明天的数据!
        buy()

# 正确示例:避免前视偏差
for i in range(1, len(data)):
    if data['close'].iloc[i - 1] > data['close'].iloc[i - 2]:  # 只使用已知数据
        buy_at(data['open'].iloc[i])  # 次日开盘价执行

局限性四:幸存者偏差(Survivorship Bias)

如果你只使用目前仍在上市的股票进行回测,就会忽略那些已经退市的股票。这会导致回测结果偏乐观,因为你自动"过滤"掉了最差的投资结果。

举个例子:如果你回测2010年到2024年"买入所有A股"的策略,但数据中不包含已退市的股票,那么回测会忽略掉那些退市股票带来的亏损,从而高估策略的实际表现。

高质量的回测应该使用包含退市股票的全量历史数据。

回测与纸面交易、实盘的差异

回测、纸面交易(Paper Trading)和实盘交易是策略验证的三个阶段,它们之间存在重要差异。

回测(Backtesting)

  • 时间维度:可以在几分钟内完成数年历史数据的模拟
  • 数据环境:使用历史数据,完全可控
  • 心理因素:无(只是运行程序)
  • 执行保证:假设交易能按规则执行
  • 适用场景:快速筛选策略想法,判断策略是否值得进一步验证

纸面交易(Paper Trading)

  • 时间维度:实时进行,与市场同步
  • 数据环境:使用实时市场数据
  • 心理因素:有一定影响(虽然是模拟资金,但实时决策仍有压力)
  • 执行保证:接近真实,但仍假设能成交
  • 适用场景:在实盘之前验证策略的实时表现,检验信号延迟、执行效率等问题

实盘交易(Live Trading)

  • 时间维度:实时进行,真金白银
  • 数据环境:真实市场,包含各种意外情况
  • 心理因素:影响显著(恐惧、贪婪、犹豫等情绪)
  • 执行保证:完全真实,可能滑点、无法成交
  • 适用场景:真正的策略执行和盈利

三者之间的关系是递进式的:

回测(快速验证) → 纸面交易(实时验证) → 小资金实盘 → 正式实盘

每一个阶段都在前一个阶段的基础上增加真实性。跳过任何阶段都可能导致不必要的亏损。

常见的差异来源

回测结果和实盘结果之间通常存在显著差距,主要原因包括:

  1. 滑点(Slippage):回测假设以特定价格成交,实际交易中成交价格可能偏离预期。滑点的来源包括买卖价差(Bid-Ask Spread)和市场冲击。在A股市场,小盘股的滑点可能达到0.5%甚至更高。

  2. 交易成本:回测中如果不考虑交易成本,会显著高估收益。A股的交易成本包括:

    • 券商佣金(通常万2.5左右,最低5元)
    • 印花税(卖出时千分之0.5)
    • 过户费(十万分之一,买卖双向收取)
  3. 资金约束:回测中通常假设资金无限,但实际上资金有限,无法同时执行所有信号。仓位管理和资金分配在实盘中非常重要。

  4. 情绪影响:连续亏损时,实盘交易者可能会手动干预策略(提前止损、暂停交易等),而回测会严格按规则执行。

常见回测陷阱总结

陷阱描述防范方法
过度拟合针对历史数据反复调参,拟合了噪声而非规律样本外测试、参数鲁棒性检查
前视偏差使用了未来才可知的信息严格的数据时间边界检查
幸存者偏差只回测现存股票,忽略退市股使用包含退市股的全量数据
忽略交易成本不计入佣金、印花税、滑点模拟完整的交易成本
忽略流动性假设任意数量的买卖都能成交加入成交量约束
忽略涨跌停假设涨停也能买入、跌停也能卖出加入涨跌停限制检查
忽略停牌在停牌期间发出交易信号标记停牌日,跳过停牌交易
过于乐观的假设以收盘价成交、即时成交等使用次日开盘价等保守假设

回测的正确态度

回测是一个有价值的工具,但它不是水晶球。正确的态度应该是:

  1. 回测是筛选工具,不是保证书:回测帮你快速排除不可行的策略,但通过回测不代表策略一定盈利。
  2. 关注策略逻辑而非历史收益:一个策略的底层逻辑是否有经济学意义,比它在某段历史数据上的收益率更重要。
  3. 保守估计,给自己留安全边际:在回测中加入足够的交易成本、使用保守的成交假设,如果这样策略还能盈利,才更值得信赖。
  4. 持续监控和迭代:即使在实盘运行后,也需要持续监控策略表现,与回测预期对比,及时发现策略失效的信号。

理解了回测的基础概念和局限性之后,下一章我们将动手构建一个简单但完整的回测框架,把理论付诸实践。

仅供学习交流,不构成任何投资建议