为什么回测如此容易"漂亮"?
回测本质是"用历史数据假装跑模型"。任何一个微小的工程错误都可能让结果好得离谱——而人类天然倾向于相信对自己有利的结果(确认偏误)。
一个新手最常的 a-ha 时刻:调通 bug 之后,曲线从 "+200% 年化" 跌到 "-10% 年化"。
七个最常见的陷阱
1. 未来函数 / Look-Ahead Bias
模型用了在该时间点还不存在的信息。
例:用了"前复权"价格但忘了那是事后才公布的。
2. 生存偏差(Survivorship Bias)
回测只包含今天还存在的股票——已经退市/破产的不在样本里。
结果:高估收益率几个百分点。
3. 过拟合(Overfitting)
模型在训练集表现好,只是因为它把噪声当成了信号。验证集立刻崩盘。
4. 数据窥探(Data Snooping)
反复在同一份验证集上调参——验证集失去"未知数据"的属性,变相成为另一个训练集。
5. 滑点 / 手续费遗漏
回测假设以"收盘价"成交——实际操作时有 滑点、手续费、税务摩擦。低频策略可能影响 1%,高频策略可能让正收益变负。
6. 流动性假设过宽
你的策略买的某只小盘股回测里"每天 1,000 股"——但实际订单簿日成交才 2,000 股,你根本买不进或冲击巨大。
7. 报告偏差
你只做出来的、并写出来的模型,是从 100 个尝试中挑出的"最好的那个"——多重假设检验会让"运气"看起来像"实力"。
工程师式上线前检查清单
- 数据集是否包含已退市公司?
- 所有特征是否严格使用 t 时刻之前的信息?
- 训练 / 验证 / 测试是否按严格时间顺序切分?
- 是否模拟了真实滑点和手续费?
- 单笔订单大小是否在当日成交量的 1% 以下?
- 是否做过 Walk-Forward Cross-Validation?
- 是否报告整个研究历程而非单一最佳模型?
- 模型在至少 3 个不同市场环境(牛市、熊市、震荡)下都表现合理?
- 是否用完全独立的最终测试集验证一次(且只验证一次)?
任何一项缺失,回测结果不可信。
"Walk-Forward" 验证为什么必要
传统机器学习的交叉验证随机抽样——在金融时序数据上会严重泄漏未来。
正确做法:
T1 T2 T3 T4 T5
[训练][测试]
[训练][测试]
[训练][测试]
[训练][测试]
每次只用过去训练、未来测试,模拟实盘真实流程。
Sim-to-Real Gap:回测好不代表实盘好
即使前面所有陷阱都避开了,模拟到实盘仍有差距:
- 你的订单本身会影响未来价格(市场冲击)
- 高频策略的延迟、网络抖动、交易所限速回测里都没有
- 实盘心理——看到 -20% 浮亏时你真的能坚持算法吗?
业界经验:实盘表现通常比回测低 30%–50%。如果你的回测年化 20%,实盘可能 10–14%——而这已经是非常好的结果。
重要问题
回测胜率 80% 是好成绩吗?
取决于盈亏比。胜率 80% 但每次盈利 +1%、亏损 -10% 的策略期望值为负。胜率单独看意义有限。
回测好但实盘亏,问题出在哪?
按概率排序:(1) 过拟合 (2) 数据泄漏 (3) 滑点假设过乐观 (4) 市场状态变化 (5) 心理执行问题。前两条最常见。
纸上交易(Paper Trading)能解决问题吗?
部分解决——避免了真实资金风险,但仍不模拟自身订单的市场冲击。至少 3 个月真实纸上交易是上线前的最低要求。
答题
Q1. 生存偏差(Survivorship Bias)的含义是?
A. 你能"活下来"的概率 B. 回测样本只含今天还存在的公司,遗漏已退市/破产者,导致高估收益
C. 与模型生存有关 D. 用户留存
Q2. 处理金融时序数据时,应该用?
A. 随机交叉验证 B. Walk-Forward 验证——按时间顺序,永远用过去训练、未来测试
C. K 折交叉验证 D. 留一法
Q3. 业界经验:实盘表现通常比回测大约低多少?
A. 0% B. 30%–50% C. 持平 D. 实盘永远更高
参考答案
Q1: B Q2: B Q3: B
延伸阅读:Wikipedia: Backtesting · Wikipedia: Overfitting · Wikipedia: Survivorship Bias · Investopedia: Look-Ahead Bias
本内容仅用于教育目的,不构成投资建议。回测结果不代表未来表现,实盘前请充分验证。
拿一份下单前检查表。
我们正在把这些指南做成可搜索的检查工具:查术语、看规则、算风险,先看懂再交易。
