兄弟,回测夏普高得吓人,实盘一跑直接拉胯——这事儿太常见了,每次看到都替人肉疼。
别只怪滑点。滑点确实是元凶之一,但远不是全部。今天把这几个"隐形杀手"全拆开,你对照着自查一遍,基本就能定位问题。
真正的坑,藏在回测的"理想假设"里
回测和实盘之间的鸿沟,不是"市场变了",而是回测里有一堆你没意识到的默认不合理设置。这些问题不是故意的,是写代码时的默认假设太理想了。
回测默认可成交,实盘要过五关斩六将。
排查项 1:用收盘价成交(你根本买不到)
回测里最常见的不合理设置:策略在收盘前算出信号,然后以今天的收盘价成交。
问题在于——你看到收盘价的时候,这价格已经是今天的最后一笔了,根本买不到了。回测里默认你成交在当天的收盘价,相当于让你用"未来数据"做交易。
修正方法:信号延迟一天,用次日的开盘价或收盘价成交。光这一个修正,收益可能就缩水20%–40%。
排查项 2:忽略交易成本(手续费和滑点)
回测默认滑点为零,而实盘每笔交易都在被额外成本侵蚀。
滑点分两种:
延迟滑点:信号发出到订单成交这段时间,价格已经变了。
冲击成本:你的订单本身会推动价格向不利方向移动。大额订单会"吃穿"订单簿,成交均价远高于你看到的那个价。
修正方法:每笔交易加上固定滑点模型,主流币加0.02%,山寨币加0.05%-0.1%。高频策略必须盘口数据建模,否则回测结果毫无参考性。
排查项 3:过拟合(把噪声当成规律)
你花了三天时间把参数从(20,60)调到(17,43),回测收益从15%涨到28%——恭喜,你不是发现了更好的规律,是在历史数据上做了过拟合。
过拟合的本质是用过于复杂的模型去解释一个充满随机性的世界。回测夏普2.0的AI生成策略,实盘夏普直接掉到0.8以下,原因就是模型记住了历史噪声,没学到可泛化的规律。
修正方法:做样本外测试。用一部分数据训练,另一部分数据验证。如果训练集上好看但测试集上崩了,说明你的策略只是刚好契合了某段特定历史。
排查项 4:幸存者偏差(你回测的标的是"活下来的")
你用今天的成分股做回测,但5年前的成分股和今天不一样。那些被踢出去的、退市的烂票,在你的回测里根本没出现过——但在那个时间点,它们是可以被选中的。
这就相当于你带着高考答案回去看考卷,觉得自己什么都会,但真考试时你手里只有题目。
修正方法:用回测期开始时的全市场股票池,而不是用今天的列表回溯历史。
排查项 5:DeFi特有的坑——MEV和Mempool
如果你跑的是链上策略,还有一个更狠的问题:MEV。
回测假设你的交易按预期成交,但实际上你的每一笔DEX交易都可能被"夹"——前端跑机器人先买后卖,你的成交价被拉高,差价被他们吃掉。仅Ethereum上,MEV提取者就取走了18万ETH。
回测里没这回事,实盘里每一笔都在被薅。
自查清单:回测夏普高、实盘崩,逐个排查
| 排查项目 | 回测里的假设 | 实盘里的现实 | 怎么修正 |
|---|---|---|---|
| 成交价格 | 信号发出后以当前价成交 | 价格在延迟期间已变动 | 用下一根K线开盘价成交 |
| 滑点 | 零滑点 | 延迟滑点+冲击成本 | 每笔加固定滑点参数 |
| 手续费 | 忽略或固定费率 | 动态,高频交易成本巨大 | 用真实费率模型 |
| 过拟合 | 参数调得好看 | 实盘规律不复现 | 样本外测试+交叉验证 |
| 幸存者偏差 | 用当前成分股回测历史 | 过去可选的标的不一样 | 用历史当时的全市场池 |
| MEV(链上) | 无 | 被夹、被抢跑 | 用隐私RPC或CoW协议 |
FAQ
Q:滑点加多少合适?A:主流币每笔加0.02%,山寨币加0.05%-0.1%。如果你的策略交易频率特别高(每天几十笔),滑点和手续费可能直接吃掉所有利润。
Q:我的策略是日线级别,这些坑影响大吗?A:比高频策略小,但仍然存在。收盘价问题、幸存者偏差、过拟合都会影响日线策略。用下一根K线开盘价修正后,收益缩水20%-40%对日线策略同样适用。
下一步动作
打开你的回测代码,按上面的清单逐项排查:
成交价用的是不是"延迟一天"的版本?
每笔交易有没有加滑点和手续费?
参数是不是反复调过(过拟合风险)?
回测用的标的是不是历史当时的全市场池?
把这四项改完,重新跑一遍回测。如果夏普还能维持在1.2以上,再考虑实盘——不然就是给交易所和MEV机器人送钱。



