一、回测陷阱概述:为什么回测会骗人?

做量化的人,谁没被回测骗过?

我刚入行那会儿,写了个套利策略,回测曲线漂亮得像教科书里的范例。年化30%,最大回撤不到3%,夏普比率3.5。我当时觉得,这不得财务自由了?结果实盘跑了三个月,亏了15%。

嗯,这就是典型的回测陷阱。

回测本身不会骗人,骗人的是我们对回测的理解。说白了,回测只是用历史数据模拟了一遍交易。历史会重演,但不会简单重复。你想想看,如果回测结果完美到不真实,那它大概率就是假的。

我见过太多人,拿着回测报告就敢上杠杆。结果呢?市场分分钟教你做人。

核心观点:回测不是预测,它只是帮你排除明显不靠谱的策略。一个策略能通过回测,不代表它能赚钱;但一个策略通不过回测,它大概率会亏钱。

1.1 常见陷阱分类

我把回测陷阱分成四大类。每一类我都踩过坑,今天一次性说清楚。

陷阱类别 典型问题 危害程度
数据陷阱 幸存者偏差、前视偏差、数据清洗不当 极高
执行陷阱 滑点估计不足、流动性忽略、交易成本低估
统计陷阱 过拟合、多重比较、数据窥探 极高
认知陷阱 确认偏误、后见之明、过度自信 中等

我个人习惯,每次回测前先对着这个表自查一遍。少踩一个坑,实盘就多一分胜算。

1.2 数据陷阱:最隐蔽的杀手

数据陷阱里,最要命的是幸存者偏差。

什么意思?就是你的回测数据里,只包含了活到现在的股票。那些退市的、暴跌的、被ST的,早就被剔除了。你用这些「幸存者」做回测,结果当然好看。

我在项目中遇到过一件事。有个同事做多因子选股,回测年化收益25%。我让他把退市股票加回去,结果收益直接掉到8%。他当时脸都绿了。

还有一个是前视偏差。就是你用未来的信息去回测过去。比如你用今天的财报数据去回测昨天的交易,这不就是作弊吗?

避坑指南:我曾经犯过这个错。写代码时不小心用了shift(-1),把未来数据挪到了过去。回测曲线漂亮得不像话,实盘直接崩。后来我养成了一个习惯:每次回测前,手动检查数据的时间戳对齐。

1.3 执行陷阱:理想很丰满,现实很骨感

回测里你按收盘价成交,实盘里你只能按对手盘的价格成交。这中间的差距,就是滑点。

套利策略对滑点尤其敏感。你想想看,套利赚的就是几个bp的价差。滑点一吃,利润就没了。

我建议,回测时至少按双边千分之二算交易成本。别嫌多,实盘只会更高。

流动性也是个坑。回测里你一键买入100万股,实盘里你挂单能把价格推高3%。尤其是小市值股票,流动性差得离谱。

个人经验:我做套利策略时,会专门加一个流动性过滤器。日均成交额低于5000万的股票,直接剔除。虽然会错过一些机会,但至少不会在关键时刻卖不出去。

1.4 统计陷阱:过拟合是最大的敌人

过拟合,说白了就是你让策略去「背诵」历史数据,而不是去「理解」市场规律。

怎么判断过拟合?有个简单的方法:把回测数据分成两段,前70%做训练,后30%做验证。如果训练集表现很好,验证集表现很差,那就是过拟合。

我见过最夸张的一个案例。有人写了50个参数,在1000只股票上做优化。结果呢?回测夏普比率5.0,实盘夏普比率-0.5。这就是典型的「数据挖掘」。

多重比较陷阱也很常见。你试了100个策略,总有一个能通过统计检验。但这只是运气,不是能力。

# 一个简单的过拟合检测代码
def detect_overfitting(train_returns, test_returns):
    train_sharpe = np.mean(train_returns) / np.std(train_returns) * np.sqrt(252)
    test_sharpe = np.mean(test_returns) / np.std(test_returns) * np.sqrt(252)
    
    # 如果训练集和验证集差异过大,说明过拟合
    if abs(train_sharpe - test_sharpe) > 1.0:
        print("警告:可能存在过拟合")
        return False
    return True

1.5 认知陷阱:我们天生就不适合做交易

确认偏误,就是只找支持自己观点的证据。你做了一个策略,就拼命找数据证明它好。那些不好的信号,你自动忽略了。

后见之明更常见。看到行情走出来了,觉得「我早就知道会这样」。其实你根本不知道,只是事后解释起来很轻松。

我有个习惯:每次回测完,先找三个理由证明这个策略是错的。如果找不到,说明我还没想清楚。

核心建议:回测报告写完后,放三天再看。三天后,你会发现很多之前没注意到的问题。这是我用真金白银换来的教训。

1.6 知识体系总览

下面这张图,是我整理的回测陷阱知识体系。每次做策略前,我都会过一遍。

回测陷阱 数据陷阱 执行陷阱 统计陷阱 认知陷阱 幸存者偏差 前视偏差 数据清洗不当 滑点估计不足 流动性忽略 交易成本低估 过拟合 多重比较 数据窥探 确认偏误 后见之明 过度自信 核心原则:回测不是预测,是排除

1.7 如何规避这些陷阱?

说了这么多陷阱,总得给点解决方案。我总结了三条铁律:

  1. 数据要干净:用全量数据,包含退市股票。时间戳要对齐,不要用未来信息。
  2. 成本要真实:滑点按实际流动性估算,交易成本往高了算。别怕回测结果难看,难看才是真实的。
  3. 验证要严格:样本外测试、交叉验证、蒙特卡洛模拟,能用的都用上。一个策略如果经不起折腾,那它就不值得上实盘。

最后说一句:回测最大的价值,不是让你相信策略能赚钱,而是让你知道策略在什么情况下会亏钱。搞清楚这一点,你才算真正入门了。

专注资料整理