第二十六讲:回测中的常见陷阱——前视偏差、幸存者偏差、过拟合、数据窥探偏差

做量化交易的朋友,谁没在回测里栽过跟头?

我入行头两年,最兴奋的事就是跑回测。看着资金曲线一路向上,夏普比率高得吓人,心里那个美啊。结果实盘一上,直接被打回原形。后来我才明白,回测里的坑,比实盘还多。

今天咱们就聊聊回测中最常见的四个陷阱。说白了,就是那些让你「看起来很厉害,一上战场就露馅」的坑。

核心观点:回测不是用来证明策略有效的,而是用来发现策略漏洞的。这四个陷阱,你躲不过去,策略就白做了。

一、前视偏差:你看到了未来,却以为那是过去

前视偏差,也叫未来函数。简单说,就是用未来的数据去指导过去的交易。

举个例子。你写了个策略,在每天收盘前判断是否买入。结果你的代码里用了当天的收盘价来做判断。嗯,收盘价还没出来呢,你怎么用?

# 错误示例:前视偏差
def signal(df):
    # 用当天的收盘价判断当天是否买入
    df['signal'] = np.where(df['close'] > df['close'].shift(1), 1, 0)
    # 问题:close是当天收盘价,但信号是在盘中生成的
    return df

我在项目中遇到过最离谱的一次,是同事写了一个「涨停板预测」策略。回测年化收益300%。我一看代码,好家伙,他用的是当天的最高价来判断是否涨停。这不废话吗?涨停了当然最高价是涨停价。

避坑指南:我曾经犯过这个错。后来我养成了一个习惯——所有回测数据,在生成信号时,只使用「当时已经知道」的数据。比如用前一天的收盘价,或者当天的开盘价(如果策略是在开盘后执行)。

怎么检查?很简单。你把回测结果里的交易记录打印出来,看看有没有「当天买入,当天就涨」的情况。如果有,大概率是前视偏差。

二、幸存者偏差:你看到的都是活下来的

幸存者偏差,在股票回测里特别常见。

你想想看,如果你用现在的股票池去回测过去10年的数据,会有什么问题?那些退市的、被ST的、跌成渣的股票,早就被剔除了。你回测用的都是「活到现在的」股票,那收益率能不高吗?

警告:幸存者偏差会让你的回测结果虚高20%-50%。我见过最夸张的一个案例,回测年化收益40%,修正幸存者偏差后只剩12%。

怎么解决?

  • 回测时必须使用「当时存在的」股票池
  • 包含退市、停牌、ST等所有状态
  • 定期再平衡时,只考虑当时可交易的标的

我记得有一次做期货回测,发现某个品种在2015年之前数据特别少。后来一查,那品种是2015年才上市的。如果你用现在的合约列表去回测2010年,那就是典型的幸存者偏差。

三、过拟合:你把噪声当成了信号

过拟合,是量化交易里最隐蔽的陷阱。

说白了,就是你用太多参数去拟合历史数据,结果把随机噪声也当成了规律。这样的策略,在样本外测试时往往一塌糊涂。

# 过拟合的典型表现
# 策略有20个参数,每个参数都经过精心调优
# 回测曲线完美,但实盘就崩

# 一个简单的检查方法
def check_overfitting(params, train_period, test_period):
    train_return = backtest(params, train_period)
    test_return = backtest(params, test_period)
    
    # 如果训练集和测试集收益差距过大,说明过拟合
    if abs(train_return - test_return) > 0.3:
        print("警告:可能存在过拟合")
    return train_return, test_return

我个人习惯,参数越少越好。一个策略如果超过5个参数,我就开始警惕了。你想想看,如果真有那么复杂的规律,市场早就被别人发现了。

避坑指南:我曾经花了一个月调参数,把回测曲线调得完美无缺。结果实盘一周就亏了10%。后来我学乖了——用交叉验证,把数据分成多段,每段单独测试。如果策略只在某一段表现好,那就是过拟合。

四、数据窥探偏差:你看得太多,反而看不清

数据窥探偏差,也叫多重比较偏差。意思是,你反复测试同一个数据集,总会找到一些「看起来显著」的规律。

举个例子。你测试了100个不同的参数组合,其中5个在回测中表现很好。这5个是真的有效,还是纯属巧合?统计学告诉我们,在95%的置信水平下,100次测试中大约有5次会「偶然」显著。

关键点:数据窥探偏差的核心问题是——你测试的次数越多,找到「假规律」的概率就越大。

怎么避免?

  • 提前确定测试次数,不要无限制地试
  • 使用独立的样本外数据进行验证
  • 对多次测试进行多重比较校正(比如Bonferroni校正)

我记得有一次做跨品种套利回测,测试了50多对品种组合。结果发现有两对的相关性特别高,回测收益很好。后来仔细一看,那两对品种在样本外数据上完全失效。这就是典型的数据窥探偏差——我看了太多组合,总有几个「碰巧」表现好。

知识体系总览

下面这张图,是我自己总结的回测陷阱分类。每次做回测前,我都会对照检查一遍。

回测四大陷阱知识体系 回测陷阱 前视偏差 用未来数据指导过去 幸存者偏差 只看到活下来的样本 过拟合 把噪声当信号 数据窥探偏差 多次测试找假规律 解决方案 ✅ 使用当时已知数据 ✅ 包含所有历史样本 ✅ 限制参数数量 ✅ 独立样本外验证 核心原则:回测是找漏洞,不是证明策略

总结一下

这四个陷阱,说白了就是同一个问题的不同表现——你太想让回测结果好看了。

前视偏差让你「看到未来」,幸存者偏差让你「只看活人」,过拟合让你「记住噪声」,数据窥探让你「找到巧合」。每一个都能让你的回测曲线美如画,但实盘曲线惨如狗。

最后提醒:我见过太多人,回测做了三个月,实盘亏了三天。别让回测成为你的「皇帝的新衣」。老老实实检查这四个陷阱,比什么都强。

嗯,今天就聊到这儿。记住,回测不是终点,是起点。真正的考验,永远在实盘。


公众号:蓝海数据掘金营,微信deep3321