2022年,我帮一个私募团队做策略评估,对方拿出了一条“完美”的回测曲线:年化收益42%,最大回撤仅3.8%,夏普比率2.6。净值曲线几乎是45度角向右上方延伸,没有任何大的波折。团队负责人已经准备用这个策略发产品了。我花了三天时间,把他们的历史数据重新清洗了一遍,结果发现了一个致命问题,回测中使用的“买入价”全部是当日收盘价,而实盘中,他们策略触发的条件是“盘中价格突破某一阈值”,这意味着在真实交易中,他们根本不可能用收盘价成交。
当我用他们实际能成交的“盘中触发价+滑点”重新跑了一遍回测,那条完美的曲线立刻变了样:年化收益从42%跌到了9%,最大回撤飙升到18%,夏普比率直接跌破1。这个案例让我彻底明白一个道理:策略回测的本质不是寻找“最优参数”,而是用数据验证假设,并诚实地暴露其局限性。本文将从实战角度,拆解我在上百次回测中踩过的坑,给出一个可复用的“防坑”回测框架。
在我接触过的量化团队中,超过70%的人把回测当作“寻找赚钱策略”的工具。这是最大的认知偏差。回测的正当用途只有一个:在历史数据上检验你的策略逻辑是否自洽,是否存在明显的统计偏差。
2019年,一个做商品期货的朋友告诉我,他找到了一个“无敌”的日内策略:在螺纹钢主力合约上,开盘后30分钟内如果价格跌破前一日结算价的0.5%,就做空,持有到收盘。他回测了2015年到2019年的数据,胜率高达68%,盈亏比2.1。但当我问他回测时是否考虑了“跳空开盘”的情况,他愣住了。事实上,2015年到2019年间,螺纹钢至少出现过4次因为重大政策消息导致的跳空低开超过2%,他的策略在这些“最赚钱”的交易日里,根本不可能以回测设定的价格进场。
这个策略在实盘中亏损的概率,远比回测显示的更大。
因此,我总结的回测第一性原则是:回测结果只能作为“证伪”的证据,不能作为“证实”的背书。一个策略回测表现糟糕,说明它大概率有问题;一个策略回测表现完美,只说明它在历史数据上没有明显漏洞,但绝不代表未来能赚钱。这个认知,是专业回测和业余回测的根本分水岭。
这是回测中最常见、最隐蔽的陷阱。我见过一个策略,参数多达37个,从移动平均线周期到RSI阈值,从布林带宽度到止损比例,每个参数都经过了“精心优化”。回测效果惊人,但样本外测试(即用未参与优化的另一段历史数据检验)时,表现立刻崩盘。这就是典型的过拟合。
过拟合的本质是模型把历史数据中的随机噪声当成了规律来学习。在金融时间序列中,噪音的比例远高于信号。一个参数过多的策略,会自动“记住”过去每一次波动的具体形态,但无法适应未来稍有变化的市场环境。
我的判断逻辑是:参数数量每增加一个,策略的“自由度”就增加一级,过拟合的风险就指数级上升。一个策略如果参数超过5个,且没有经过严格的样本外测试和交叉验证,我基本会直接判定为“不可信”。
如何识别过拟合?有三个简单的方法:

数据来源: 基于2015-2020年沪深300指数数据的模拟回测;过拟合策略为37参数优化模型,稳健策略为3参数简单模型
2018年,一个朋友兴奋地告诉我,他做了一个“买入并持有所有A股”的策略,回测显示年化收益20%。我问了他一个问题:“你的股票池是怎么构建的?”他回答:“用当前还在交易的股票。”问题就在这里。
在A股市场,过去十年里,有大量股票因为业绩差、财务造假、退市等原因消失了。如果只回测“活到今天”的股票,你天然地剔除了那些表现最差、最终被市场淘汰的公司。这个策略回测出来的“买入并持有所有A股”的收益,远远高于真实情况,因为那些退市的股票带走了投资者的本金,却没有出现在回测中。
幸存者偏差是回测中“最隐蔽的杀手”,它会让你的策略看起来比实际好20%到50%。根据我的经验,如果没有处理幸存者偏差,策略的年化收益至少会被高估5到10个百分点。
跨越这个陷阱的唯一方法是:使用包含“已退市公司”的全历史数据。在获取数据时,必须确认数据源是否包含了退市公司、被收购公司、更名公司的完整历史价格和财务数据。如果做不到,至少要在回测报告中明确标注“未处理幸存者偏差”,并保守估计收益的虚高程度。

数据来源: 基于A股2010-2020年全样本数据,买入持有策略为等权重买入并持有所有股票
回到本文开头那个案例。那个私募团队使用的“收盘价成交”假设,在真实交易中是不成立的。原因很简单:收盘价是集合竞价的结果,你无法确保你的订单恰好以那个价格成交。尤其是当策略涉及较大资金量或者交易流动性较差的股票时,你的买入行为本身就会推高价格,卖出行为则会压低价格。
我做过一个统计:在A股中小市值股票(市值低于50亿)上,一个中等规模的订单(比如100万元)引发的滑点,平均在0.3%到0.8%之间。这还不算流动性枯竭时根本无法成交的风险。如果加上双边万三的佣金、千分之一的印花税,一次完整的交易成本可能超过1.5%。对于一个年化收益20%的策略,如果交易频率是每周一次,那么一年的交易成本就会吃掉超过75%的收益。
我的建议是:在回测中,必须设置保守的滑点和成本模型。对于流动性好的股票(如沪深300成分股),设置单边万三到万五的滑点;对于中小市值股票,设置万八到千二的滑点。手续费按照实际交易品种的标准设置(A股包括佣金、印花税、过户费)。只有经过这些“摩擦力”过滤后依然表现稳健的策略,才值得投入实盘。

数据来源: 基于2018-2022年沪深300成分股,50日均线突破策略,周频交易频率
2019年到2020年,A股市场经历了一轮明显的结构性牛市,尤其是消费、医药、科技板块表现突出。如果你在这个时期回测一个“买入并持有核心资产”的策略,结果会非常漂亮。但如果你把回测时间拉长到2015年到2022年,同样的策略表现会大幅下降,因为中间经历了2015年的股灾、2018年的单边下跌、以及2021年以后的结构性调整。
回测的时间范围选择,直接决定了策略的“可信度”。一个策略如果在多个完整的市场周期(包括牛市、熊市、震荡市)中都能保持稳定表现,其可信度远高于只在单一市场环境下有效的策略。
我的判断标准是:回测周期至少覆盖一个完整的市场周期,通常为5到7年。如果策略是长线持仓型的,需要覆盖10年以上的数据。同时,必须单独检验策略在极端市场环境下的表现:比如2015年股灾期间、2020年疫情暴跌期间、以及2022年的熊市。一个策略如果在这些极端环境下都出现了超过30%的回撤,那么它不适合风险承受能力一般的投资者。
很多初学者拿到回测报告,只看三个指标:年化收益、胜率、最大回撤。这是远远不够的。我有一套自己的判断逻辑,可以帮你快速识别一个策略的“真实水平”。
夏普比率衡量的是“每单位风险带来的超额收益”。但它的缺陷是:它假设收益是正态分布的,而金融市场的收益分布通常是“肥尾”的,即极端亏损出现的概率远高于正态分布假设。这意味着,一个策略可能有很高的夏普比率,但一旦遇到极端行情,可能一次亏损就抹掉之前所有的收益。
因此,我同时关注“卡玛比率”(Calmar Ratio),即年化收益除以最大回撤。卡玛比率直接告诉你:为了获得这份收益,你最多承受了多大的回撤。一个优秀的策略,卡玛比率通常应该在2以上。比如,年化收益20%,最大回撤10%,卡玛比率为2。如果卡玛比率低于1,说明策略的风险收益比不太理想。
一个策略胜率高达80%,但平均每次亏损是平均每次盈利的5倍,长期来看它依然是亏损的;反之,一个策略胜率只有30%,但盈亏比达到5:1,它可能是非常优秀的策略。
我的判断公式是:期望收益 = 胜率 × 平均盈利 – (1-胜率) × 平均亏损。只有当期望收益为正时,策略才值得考虑。同时,我会关注“盈亏比”是否稳定。如果盈亏比在回测区间内波动很大,说明策略的盈利能力不稳定,可能存在过拟合风险。
很多回测报告只展示最大回撤的数值,比如“最大回撤15%”。但15%的回撤,如果能在3个月内恢复,和需要3年才能恢复,风险是完全不同的。前者是“波动”,后者是“套牢”。
我建议在回测报告中加入“最大回撤恢复时间”这个指标。一个稳健的策略,最大回撤恢复时间通常不超过整个回测周期的20%。比如,如果你回测了5年,那么最大回撤恢复时间最好在1年以内。如果超过这个标准,说明策略的容错性较差,一旦遇到大的回撤,可能需要很长时间才能回到净值高点。

数据来源: 基于2015-2022年A股市场,趋势跟踪策略(A)vs 高波动动量策略(B)的回测结果
基于多年的实战经验,我总结了一套“防坑”回测框架,可以帮你系统性地规避上述陷阱。这套框架的核心是:用工程化的思维对待回测,把每一个可能引入偏差的环节都标准化、透明化。
这是最耗时、最容易被忽视的环节,但也是最关键的。我的做法是:
很多策略失败的原因,不是逻辑本身有问题,而是编码实现有误。比如,一个简单的“均线金叉买入”策略,如果代码中使用的“金叉”判断标准是“前一日收盘价上穿均线”,而实盘中你的交易信号是“盘中实时价格上穿”,两者就会产生偏差。
我的建议是:在编码时,必须明确“信号生成”和“交易执行”两个环节的分离。信号生成可以使用任何数据(包括未来数据,但未来数据必须明确标注),但交易执行只能使用“已知”数据。比如,在计算“当日收盘价均线”时,不能使用当日收盘价,因为收盘价在交易时段内是未知的。
在设置滑点、手续费、交易成本等参数时,我的原则是“保守估计”。具体来说:
同时,需要进行“极端测试”:将滑点设置为保守值的2倍,看策略是否还能盈利。如果不行,说明策略的盈利空间非常有限,实盘中很容易被“摩擦力”吞没。
这是判断策略是否可信的“金标准”。我的做法是:

数据来源: 基于2010-2022年A股全市场数据,策略A为37参数优化模型,策略B为5参数趋势模型,策略C为3参数均值回归模型
回测报告不应该只是展示“最好看”的结果。我建议输出一份完整的报告,包括:
在决策时,我的原则是:如果一个策略的样本外表现比样本内低30%以上,直接放弃;如果低10%到30%,需要进一步优化或缩小参数范围;如果低10%以内,且经过Walk-Forward分析验证,可以考虑小资金试盘。
没有完美的策略,只有适合你的策略。在回测的基础上,你需要根据自身情况做出取舍。
这是最关键的决策因素。如果你无法承受20%以上的回撤,那么一个年化收益25%、最大回撤30%的策略就不适合你。反之,如果你能接受较大的回撤以换取更高的收益,那么一个年化收益10%、最大回撤5%的策略可能过于保守。我的建议是:先确定你的“最大回撤容忍度”,再根据这个标准筛选策略。
资金规模直接影响策略的可行性。如果资金量很小(比如几万元),你无法分散投资,也无法使用一些需要大资金量才能执行的策略(比如套利策略)。如果资金量很大(比如几千万),你需要考虑流动性问题,比如一个策略如果每次交易都需要买入数千万的股票,它对小盘股的影响会非常大。我的建议是:资金量越小,越适合做高波动、高收益的策略;资金量越大,越需要关注流动性、分散化以及低波动策略。
有些策略需要每天盯盘,实时监控信号;有些策略是低频的,比如每月调仓一次。你需要根据自己的时间精力选择合适的策略。如果你有全职工作,无法频繁交易,那么一个需要每日盯盘的日内策略就不适合你。我的建议是:优先选择与你时间精力匹配的策略,而不是看起来收益最高的策略。一个你无法严格执行的策略,收益率再高也没有意义。
高频交易(比如日内交易)对设备、数据、交易速度的要求极高,不适合个人投资者。低频交易(比如周频、月频)更注重策略的逻辑和稳定性,适合个人投资者。我的建议是:个人投资者优先选择低频策略,因为交易成本更低、更稳定、更容易执行。在我的经验中,周频或月频的策略,加上合理的风控,长期来看表现往往优于高频策略。

数据来源: 基于2018-2022年沪深300指数数据,均线突破策略在不同交易频率下的回测结果
回测不是目的,而是手段。它最大的价值不是让你“找到”一个赚钱的策略,而是让你“排除”那些不赚钱的策略,并在这个过程中,不断深化你对市场的理解。
从2015年我第一次接触回测,到2024年,我至少做了一千次以上的回测。其中,真正让我赚到钱的策略不超过5个。但每一次失败的回测,都让我更清楚自己不知道什么,更敬畏市场这个对手。回测的本质,不是用数据去验证你的策略,而是用数据去验证你的认知。当你的认知足够清晰、足够诚实,你自然能设计出经得起市场检验的策略。
下一步,我建议你从今天开始,选择你熟悉的一个市场、一个品种,跑一次完整的回测流程。从数据清洗开始,到策略编码,再到滑点设置、样本外测试,最后输出一份完整的报告。在这个过程中,你会遇到无数的问题和困惑,但正是这些问题,才是你真正的成长所在。如果你在回测中遇到了任何问题,带着你的回测报告,去寻找答案。记住,回测的终点,不是一纸报告,而是你对自己认知的重新审视。
我用历史数据跑了一个策略,夏普率3.5,最大回撤才5%,但一上实盘就亏。我怀疑是过拟合,但不知道具体怎么判断和修正。有没有能直接落地的检查方法?
过拟合的本质是策略记住了历史噪音,而非市场规律。我踩过最大的坑是:用100个参数迭代了500次,找到一个“完美”曲线,结果样本外测试直接腰斩。判断过拟合有三个硬指标:第一,参数微调1%导致收益波动超过20%,说明模型过于敏感;
第二,把数据按时间切分成三段(训练、验证、测试),如果训练与测试的夏普比率差超过1.0,基本可以判定过拟合;第三,用蒙特卡洛模拟生成1000条随机价格路径,跑你的策略,如果收益分布显著偏离零均值,说明策略其实在赌随机性。
我的实战修正方法:第一,强制使用“滚动窗口”验证,比如用2018-2020数据训练,2021样本外,然后滚动到2019-2021训练、2022测试,重复5次。第二,减少参数到3个以内,并让每个参数有明确的金融逻辑,比如“20日均线”而不是“连优化后的19.8日均线”。
第三,引入“惩罚项”:每增加一个参数,要求样本外夏普比率至少提升0.2才能保留。这套规则帮我筛掉了90%的假策略。
我回测某行业轮动策略,年化收益25%,但实际跑下来发现很多股票后来退市了。是不是因为数据库只包含现存股票?幸存者偏差具体怎么影响结果,如何获得完整数据?
幸存者偏差能让一个垃圾策略看起来像股神。我亲测过:用A股仅含当前存续股票的数据跑“买入低价股”策略,年化30%;换成包含退市股的全历史数据后,年化直接跌到-5%。因为那些退市的低价股大多破产了,它们被剔除后,回测自然只看到活下来的好股票。
具体影响数据:我用某平台回测2015-2020年小市值策略,有幸存者偏差时最大回撤18%,无偏差时最大回撤45%。偏差的核心原因是数据库默认只保留当前上市股票,忽略已退市、被吸收合并的标的。规避方法:第一,寻找明确标注“全历史复权”且包含退市标记的数据源,例如CSMAR或Wind的退市管理模块;
第二,手动下载退市公司列表,用Python合并到回测池中;第三,在回测框架中强制加入“剔除条件”:每日调仓时,若股票当日成交量低于全市场平均的10%,标记为流动性风险并排除。这能模拟真实买入可执行性。
我回测时默认手续费万分之三,滑点设置为0,结果实盘总是比回测差3%-5%。到底应该设置多少滑点才算真实?不同资金规模有区别吗?
滑点和手续费是回测与现实最大的摩擦成本。我做过一个对比实验:同样一个高频反转策略,回测年化50%,加入0.1%单边滑点后年化降到18%,再加万分之三手续费后只剩6%。滑点设置的核心原则是“市场冲击成本”,而非固定值。
我的设置规则:第一,按资金规模分级,10万以下资金,滑点设为0.05%(买卖各0.05%),因为小单容易成交;100万-1000万,滑点设为0.15%,因为大单会吃穿盘口;1000万以上,建议0.3%并加入限价单模拟。第二,按流动性调整,对于日均成交额小于5000万的股票,滑点翻倍;
对于大盘蓝筹,滑点可减半。第三,手续费必须包含印花税(目前单边0.1%)和券商佣金(最低万分之2.5),以及可能的过户费。我建议保守设置总交易成本为0.3%(单边),这样如果你的回测收益还能为正,实盘才有希望。
我做了严格的样本外测试,也加了滑点和手续费,回测夏普2.0,但实盘三个月亏了15%。除了过拟合,还有什么我忽略了的致命因素?
回测信号在实盘中无法同步执行是最常被忽视的“隐形杀手”。我亲身经历:一个5分钟级别的突破策略,回测时信号出现后以收盘价成交,但实盘中因为网络延迟和交易队列,信号出现后平均2分钟后才成交,导致入场价偏离0.5%,直接吃掉全部利润。
具体原因有三个:第一,回测假设“即时成交”,但实盘有簿记排队、价格波动和滑点放大效应。第二,回测用的数据是事后调整过的,但实盘收到的数据是实时且可能包含错误报价。第三,市场环境变化,比如2018年A股去杠杆后,小盘股流动性骤降,原来的策略失效。
我的解决方案:第一,在回测中强制加入“延迟成交”模拟,比如信号出现后推迟1分钟再按下一个有效价格成交。第二,用实盘模拟账户(Paper Trading)跑至少3个月,与回测对比,如果偏差超过15%,必须重新审视策略逻辑。
第三,定期做“因子衰减测试”,如果策略依赖的因子在近半年表现明显弱于回测期,说明该因子可能已被市场套利,需要重新挖掘。实盘亏损75%来自执行偏差,而不是策略本身。


读者评论
回测的陷阱分析得很透彻,特别是‘收盘价成交’和实际成交价之间的差异,很多新手容易忽略这一点,导致策略回测结果严重失真。
幸存者偏差确实是隐蔽的杀手,我见过不少回测报告只包含现存的股票,结果收益看起来很高,但实际投资时却可能踩到退市股,这个提醒很有价值。
过拟合的案例很典型,37个参数搞出来的策略看起来完美,但样本外测试立刻崩盘。文章给出的极端值测试和walk-forward分析是实用的判断方法。
滑点和交易成本对高频策略的影响巨大,文中的计算显示周频交易下年化收益从22.5%降到8.5%,这提醒我们在回测时必须设置保守的摩擦成本。
卡玛比率比夏普比率更直观地反映了风险收益比,结合最大回撤恢复时间来判断策略的稳健性,这个思路值得借鉴,很多回测报告只堆收益率却忽略了回撤深度。