回测报告往往能给出一条平滑的收益曲线、不错的夏普比率和看起来可控的最大回撤。问题是,这些结果可能只是研究者反复调整参数、因子、样本区间和交易规则之后,从大量候选方案中挑出来的最好版本。它在历史数据上表现突出,并不等于它捕捉到了能够延续到未来的规律。
当策略进入实盘,市场数据不再参与参数寻优,交易价格也不再按照回测中的理想条件出现,模型就会暴露出真正的结构:它究竟掌握了某种可重复的交易逻辑,还是只记住了历史噪音。
回测过拟合的本质:为何历史表现无法转化为实盘收益
回测过拟合,是指模型经过多轮参数调整、因子组合、交易规则修改或样本筛选后,在历史数据上的表现明显优于未来或样本外表现。
问题不在于策略使用了参数。任何策略都需要参数,例如回看窗口、持仓周期、开仓阈值、止损比例、仓位上限和调仓频率。真正需要警惕的是:研究者是否反复使用同一段历史数据来决定这些参数,并且只保留表现最好的结果。
从统计学习的偏差—方差分解来看,预测误差通常可以理解为偏差、方差和不可约误差的共同结果。模型过于简单时,可能无法捕捉真正存在的信号;但随着因子、规则和参数不断增加,模型对样本的记忆能力也会增强。复杂度继续上升后,方差开始占据主导,模型便会逐渐适应历史数据中的偶然波动。
这时通常会出现几种组合现象:
- 样本内误差继续下降;
- 样本内夏普比率继续上升;
- 样本外误差开始扩大;
- 样本外收益对参数变化变得异常敏感;
- 策略只在某一段历史行情中有效,换一个时间窗口就明显恶化;
- 交易逻辑无法用简洁、稳定的经济机制解释。
过拟合最麻烦的地方,在于它不会主动让回测报告变难看。相反,它常常会让报告更漂亮:收益曲线更平滑,最大回撤更低,胜率更高,参数也像是经过了充分优化。只有当数据不再参与优化,模型失去对历史噪音的适应能力,问题才会暴露。
有效自由度比参数数量更重要
量化模型的复杂度,并不只由代码里写了多少个参数决定。研究者在数据上进行的每一次选择,都可能增加模型的有效自由度。
下面这些操作看起来只是研究过程中的小调整,统计上却可能构成新的试验:
- 新增一个因子,或删除一个表现较差的因子;
- 修改开仓阈值、止损比例和止盈比例;
- 改变持仓周期和调仓频率;
- 只保留表现较好的年份、行业或股票池;
- 根据回测结果决定是否加入过滤条件;
- 在多个数据源、复权方式或价格口径中选择结果最有利的版本;
- 根据收益曲线手动调整交易时段;
- 策略失败后修改规则,再把修改后的版本当作新的独立验证;
- 看到某类行情贡献较大后,反向加入针对该行情的过滤条件。
表面上,这些操作仍然可以被称为同一个策略的微调。实际上,它们已经构成了多次假设检验。最终报告中的最佳结果,不再只是某个策略的表现,而是很多候选结果中最有利的一次。
如果研究者尝试了足够多的因子、参数和规则组合,历史数据迟早可能给出一组看起来很漂亮的结果。这个结果未必完全没有信号,但其中很可能混入了大量只属于该样本的偶然成分。
如何判断样本内外发生了过度衰减
判断过拟合不能只看一个指标。样本内外夏普比率的变化可以提供线索,但它必须和其他证据一起解释:
- 不同时间段的收益是否具有一致性;
- 参数热力图是否存在孤立高峰;
- 增加手续费和滑点后,收益是否仍然存在;
- 策略是否高度依赖某几个标的或某一类行情;
- 更换股票池、数据起止日期后,逻辑是否仍然成立;
- 样本外交易数量是否突然大幅减少;
- 收益是否主要来自少数几笔极端交易;
- 规则稍微改变后,策略是否立刻失去盈利能力。
样本内外的衰减率可以作为工程监控指标。例如,可以用下面的形式描述夏普比率的变化:
衰减率 = 1 − 样本外夏普比率 / 样本内夏普比率
它适合用来触发进一步检查,但不能被当作所有市场、所有频率下都适用的硬性门槛。低频策略、高频策略、趋势策略和横截面策略面对的噪音结构并不相同。一个数字只能告诉你结果发生了变化,不能单独解释变化的原因。
回测最容易拟合的,不是稳定的超额收益,而是噪音在参数空间里的高维投影。
先区分模型失效与执行失效
实盘表现不佳,并不一定意味着策略逻辑已经失效。至少要把问题拆成几层:
1. 数据层:实盘使用的数据是否与回测数据一致,发布时间和修订口径是否一致;
2. 信号层:信号是否按照回测中的时间点生成,是否发生了未来数据穿越;
3. 组合层:仓位、换手、股票池和风险限制是否与回测一致;
4. 执行层:订单是否成交,成交价格是否偏离假设,是否受到涨跌停和流动性限制;
5. 市场层:当前行情是否已经脱离历史样本的统计环境。
如果没有分层定位,最常见的反应就是重新调参数。执行层的问题被误认为信号问题,市场状态变化又被误认为参数问题,最终模型在不断修补中变得更加复杂,也更加容易过拟合。
多重假设检验与数据窥探偏差的定量度量
量化研究中最容易被忽略的一件事,是研究者通常只记得最后留下来的策略,却忘记了它之前测试过多少失败方案。
假设一个研究流程先后尝试了不同的因子、参数、持仓周期和过滤条件。每一次尝试都有可能得到一个看起来不错的结果。随着试验数量增加,最终出现高夏普比率并不一定意味着信号更强,也可能只是候选结果越来越多后,偶然筛选出了一个特别适合历史样本的组合。
这就是多重假设检验和数据窥探偏差的核心。
试验次数会改变结果的统计含义
如果有很多候选策略,研究者通常会选择样本内表现最好的一个。被选中的策略天然带有选择偏差:它不仅包含可能存在的真实信号,也包含多次试验中偶然得到的有利噪音。
未被选中的策略会被删除,最终报告里只剩下冠军。于是,报告中的高夏普比率看起来像是策略本身的属性,实际上也可能是筛选过程的产物。
这意味着,样本内夏普比率不能脱离试验历史单独解释。一个只测试过少量方案后得到的中等夏普,和经过长期反复搜索、不断修改规则后得到的高夏普,并不具有相同的统计含义。
研究日志至少应保留以下信息:
- 每一次参数组合;
- 每一次因子增删;
- 每一次交易规则修改;
- 使用的样本区间;
- 数据版本和价格口径;
- 是否调整过交易成本;
- 样本内和样本外表现;
- 失败策略是否被删除,以及删除原因;
- 研究者是在结果出现前还是出现后决定评价标准。
没有这些记录,研究者很难知道最终模型究竟经过了多少次机会筛选。
回测过拟合概率
回测过拟合概率通常记为概率指标,用于描述这样一种情况:在多组候选策略中,样本内排名靠前的策略,到了样本外是否容易落入较差的排名区域。
一种常见的计算思路是:
1. 收集多组候选策略的样本内表现;
2. 对每组候选策略进行样本外测试;
3. 比较样本内排名和样本外排名;
4. 观察样本内优胜者在样本外落入较差排名区域的频率。
这个指标不能脱离数据结构直接套用。它会受到候选策略之间相关性、样本切分方式、交易成本处理和样本外区间长度的影响。
如果所有候选策略只是同一个因子的轻微参数变体,它们并不是真正独立的试验。把这些高度相关的结果简单相加,可能会夸大有效试验数量。相反,如果研究过程中曾经尝试过很多方案,却只记录了最后留下来的少数版本,评估又会过于乐观。
衰减夏普比率与选择偏差
衰减夏普比率试图回答另一个问题:观察到的夏普比率,是否已经高到足以抵消多重试验带来的选择偏差。
简化表达可以写成:
校正后的夏普统计量 =(观察到的夏普比率 − 多重比较基准)/ 夏普比率的估计误差
这里的多重比较基准,并不是一张可以适用于所有策略的固定表格。它会受到以下因素影响:
- 候选试验的数量;
- 候选策略之间的相关性;
- 收益分布是否存在偏度和厚尾;
- 交易频率;
- 样本长度;
- 夏普比率的估计方式;
- 是否使用相同样本进行筛选和评估;
- 研究者是否在看到结果后改变了评价标准。
因此,把某个固定夏普门槛直接套到所有策略上,是另一种形式的伪精确。低频趋势策略和高频做市策略即使得到相同的夏普数值,也不代表它们具有相同的统计可靠性。收益的自相关、交易成本、样本数量和极端收益结构都可能不同。
更稳妥的做法,是在研究开始时就定义试验登记规则,而不是看到结果后再决定哪些试验算数:
1. 登记候选因子、参数范围和样本区间;
2. 每次试验生成唯一编号,不覆盖旧结果;
3. 保存所有候选策略,而不是只保存表现最好的策略;
4. 记录候选策略之间的相似性和相关性;
5. 将试验数量纳入统计评估;
6. 使用完全独立的样本做最后验证;
7. 如果样本外表现不佳,不通过重新定义样本外区间来挽救结果。
试验次数不是一个可以随意断言的数字
关于多重试验,有一种常见但危险的说法:只要尝试足够多次,就必然会出现固定数量的策略命中历史噪音。
这个判断的方向并非完全错误,但“必然出现多少组”却不是可以直接推出的事实。命中数量取决于试验之间的相关性、参数空间、收益分布和筛选规则。
更准确的说法是:重复试验会提高选择到历史偶然模式的概率,因此最终结果必须结合全部试验记录和独立样本外验证解释。试验越多,越不能只展示冠军;研究者越早在结果出现之前确定评价规则,后续结论就越可信。
没有试验日志的高夏普,首先是一个选择结果,其次才可能是一个交易信号。
超越传统交叉验证:组合式剔除法的实战应用
机器学习中的标准交叉验证,通常默认样本大体独立同分布。金融时间序列很少满足这个前提。
收益可能存在自相关,特征可能使用滚动窗口,标签可能覆盖未来一段时间,交易持仓也可能跨越训练集和测试集边界。如果直接随机切分,训练集和测试集之间就可能共享信息。模型看似没有读取未来价格,实际上却接触到了与未来结果高度重叠的样本结构。
标签重叠是最容易被忽视的泄漏
假设一个样本的标签是未来数个交易日收益,另一个相邻样本的标签也覆盖其中一部分日期。两个样本就不是完全独立的。
如果随机切分后,一个样本进入训练集,另一个进入测试集,模型实际上已经接触到了与测试结果重叠的信息。此时得到的样本外表现可能明显偏乐观。
时间顺序切分可以减少部分问题,但不一定完全解决标签重叠。训练集最后一个样本的标签仍然可能延伸到测试集开始之后。只要这段重叠没有处理,验证结果就可能受到污染。
特征时间、标签时间和成交时间必须分开
很多穿越问题并不是代码直接引用了未来收盘价,而是不同时间口径没有被严格区分。
常见问题包括:
- 使用收盘后才能知道的数据计算当日收盘前信号;
- 用全样本均值和标准差进行标准化;
- 使用后来修订或回填的财务数据;
- 采用包含未来区间的排名和分位数;
- 用最终股票池替代当时真实可交易的股票池;
- 后视处理停牌、退市和指数成分变化;
- 将当天收盘计算出的信号,错误地按当天收盘价成交;
- 使用发布日之后才可获得的财务字段;
- 在组合构建阶段使用了当日结束后才确定的权重信息。
这些错误不一定会产生离谱的收益曲线。很多时候,它们只会让回测结果稍微平滑一些,但这种偏差会在整个样本中持续累积。
每个字段都应该明确三个时间:
- 数据对应的观察时间;
- 数据对研究者可见的发布时间;
- 策略能够据此下单的最早时间。
没有这三个时间,所谓的无未来函数检查通常并不完整。
剔除带与禁运期
组合式剔除交叉验证通常结合三种机制处理时间序列泄漏。
剔除带是指在训练集和测试集相邻位置删除一段数据,避免训练标签延伸到测试区间,或者测试标签与训练数据重叠。剔除长度应根据标签持有期、特征回看窗口和收益自相关结构确定,而不是机械地使用固定天数。
禁运期是指在测试区间结束后,再保留一段时间不让相关数据进入下一轮训练。它主要用于处理测试期信息通过滞后特征、延迟标签或组合构造间接泄漏的问题。
组合切分则是把时间序列划分为若干连续区段,再组合不同区段作为测试集,形成多条训练—测试路径。这样得到的不是一个单独的样本外数字,而是一组样本外绩效分布。
| 方法 | 对标签重叠的处理 | 样本外路径 | 主要风险 |
|---|---|---|---|
| 随机交叉验证 | 通常不处理 | 多条 | 打乱时间顺序,泄漏风险较高 |
| 时间顺序切分 | 部分处理 | 多条或少量 | 仍需处理标签边界和滞后特征 |
| 滚动前推验证 | 依时间推进 | 通常较少 | 结果依赖训练窗口和测试窗口设计 |
| 组合式剔除交叉验证 | 结合剔除和禁运 | 多条组合路径 | 计算量较高,设计要求更严格 |
训练集、验证集和测试集采用怎样的比例,不能自动消除泄漏。即使按照时间顺序分成三段,只要训练集末端标签延伸到验证集,验证结果仍然可能被污染。
如何组织一次组合式验证
实际实施时,可以按照下面的顺序安排:
1. 按时间将样本划分为若干连续区段;
2. 明确每个标签的开始时间和结束时间;
3. 标记每个特征真正可用的时间;
4. 为每一种训练集—测试集组合设置剔除带;
5. 在测试区间之后设置禁运期;
6. 只使用当时真实可获得的数据训练模型;
7. 对每条路径分别计算收益、回撤、换手和交易数量;
8. 观察绩效分布,而不是只报告最好的路径;
9. 检查不同时间段和不同市场状态下的失败模式;
10. 记录每条路径是否遇到无法交易、数据缺失或股票池变化。
路径越多,并不等于结论越可靠。如果所有路径仍然共享同一段特殊行情,或者特征本身已经发生穿越,增加切分次数只是在重复测量同一个偏差。
组合式验证真正有价值的地方,是迫使研究者面对策略在不同时间顺序下的表现,而不是给出一个看起来更复杂的验证名称。
参数敏感性分析:寻找策略的“平缓高原”
参数稳定性是识别过拟合的另一道防线。
真正具有一定泛化能力的策略,通常不会只在一个极其精确的参数组合下有效。相邻参数区域可能存在一片表现相近的平缓高原。相反,如果策略只有在某一个精确的回看窗口和持仓周期下表现突出,参数稍微改变就明显恶化,那么这个最优点就值得重点怀疑。
参数敏感性分析至少要回答三个问题:
1. 参数改变后,收益和风险是否平滑变化;
2. 不同市场阶段中,最优参数是否大致稳定;
3. 最优点附近是否存在足够宽的可接受区域。
可以定义一个辅助指标来比较不同参数区域:
稳定性辅助指标 = 1 − 绩效波动 / 绩效均值
这里的绩效波动可以来自不同子区间、不同参数组合或不同验证路径,绩效均值则是对应区域的平均表现。这个指标只能作为辅助观察工具,并不是跨策略通用的标准分数。
当均值接近零或为负时,简单的比值会失去解释力。即使均值为正,指标也可能受到绩效口径、样本长度和异常值的影响。因此,不能只看一个稳定性数字是否超过某个门槛,还要同时查看参数热力图、分段收益、交易数量和成本压力测试结果。
如何识别参数孤立高峰
参数扫描不应只围绕全局最优点报告一个结果。更合理的做法,是在事先确定的合理范围内进行网格分析,并观察整个绩效曲面。
例如,同时扫描回看窗口和持仓周期时,至少要检查:
- 最优点周围是否存在多个表现接近的组合;
- 参数改变后,交易次数是否突然下降;
- 高收益是否只来自少数几笔极端交易;
- 某一参数区域是否只在单一市场阶段有效;
- 加入成本和滑点后,高原是否仍然存在;
- 样本外热力图是否与样本内热力图具有相近形状;
- 最优参数是否随着时间推移不断向极端方向移动。
孤立高峰通常表现为一小块异常突出的区域,周围绩效快速下坠。平缓高原则表现为较宽的可接受区域,参数轻微变化不会改变策略的基本性质。
但参数扫描本身也会制造更多试验。如果研究者在同一份数据上不断扩大扫描范围,直到找到最漂亮的热力图,那么所谓的稳定性分析也会变成新的数据窥探。参数范围、步长和评价指标应在分析前确定,并且保留完整扫描结果。
一个明确标注的假设示例
下面只是为了说明分析方法的假设示例,不代表某个真实策略或真实回测结果。
假设某动量策略在研究者预先设定的参数网格中,最优组合是回看窗口为二十个交易日、持仓周期为五个交易日。研究者进一步观察附近区域:
- 回看窗口在十五至二十五个交易日之间;
- 持仓周期在三个至七个交易日之间;
- 每个组合都使用相同的样本、成本和成交规则;
- 所有参数组合的结果都被保留,而不是只展示最优点。
如果相邻组合的风险调整后收益大致接近,且不同时间段的表现没有完全相反,那么这个区域可以被视为相对平缓。它仍然不能证明策略未来一定有效,但至少说明模型不完全依赖一个极其精确的历史坐标。
相反,如果只有回看窗口为二十、持仓周期为五的组合盈利,参数稍微变化后收益便消失,或者交易数量骤然下降,那么这个最优点更像是局部高峰。此时需要重新检查:
- 是否有少数交易决定了全部结果;
- 参数是否只是间接编码了某段历史行情;
- 交易成本是否被低估;
- 是否在看到热力图后扩大或缩小了扫描范围;
- 其他失败参数是否被从研究记录中删除。
参数分析的目标,不是寻找最漂亮的点,而是寻找一片在不同时间段、不同成本假设和不同参数扰动下,仍能维持基本逻辑的区域。
过拟合的视觉特征,往往是绩效曲面上的孤立高峰,而不是一片能够承受扰动的平缓高原。
实盘失效的隐形杀手:幸存者偏差、冲击成本与流动性限制
即使统计验证做得比较严格,回测仍然可能因为执行假设过于理想而失效。
这类问题与传统意义上的过拟合不同。模型可能确实捕捉到了一些历史规律,但回测使用了实盘无法获得的价格、股票池或成交条件。上线后,信号没有完全消失,利润却被交易摩擦一点点吃掉。
幸存者偏差
如果回测数据库只保留今天仍然存在的股票,就会产生幸存者偏差。退市、长期停牌、并购退出或被移出股票池的标的被排除后,历史样本会看起来比真实可投资集合更健康。
这种偏差对小市值、低流动性和高波动策略尤其严重。某些股票在历史上确实属于可交易标的,但后来退市或长期停牌。如果数据库只保留当前证券,模型就会在不知不觉中避开这些失败样本。
处理方式包括:
- 使用带有历史成分变化的股票池;
- 保留退市股票和退市前的完整价格记录;
- 按当时可获得的信息重建指数和行业分类;
- 记录停牌、终止上市和证券代码变更;
- 不使用今天的股票池回填过去;
- 对每个交易日明确当时可交易的证券集合;
- 区分当时存在的证券与后来才进入数据库的证券。
不能用一个简单的退市比例替代数据检查。退市、暂停上市、长期停牌和证券合并并不是同一件事,统计范围不同,结论也会不同。真正重要的是,回测数据库是否保留了当时投资者能够看到的完整机会集合和失败结果。
涨跌停与停牌
回测中最常见的理想化假设之一,是信号出现后可以按照收盘价成交。但在涨停、跌停、临时停牌或流动性枯竭时,这个假设可能完全不成立。
需要明确区分三个价格:
- 产生信号的价格;
- 策略假设的成交价格;
- 实际可能获得的成交价格。
如果信号使用收盘数据计算,却又按同一个收盘价成交,就可能引入时间上的不可能。更保守的做法是按照下一个交易时点可获得的价格成交,并明确隔夜跳空和无法成交的情况。
对于涨跌停股票,回测还应记录:
- 信号出现时是否已经封板;
- 下一交易日是否存在可成交价格;
- 委托是全部成交、部分成交还是完全未成交;
- 订单在队列中的位置是否可以合理估计;
- 无法成交时,策略何时取消或重新提交订单;
- 未成交订单是否继续占用组合中的目标仓位。
停牌股票不能简单按照缺失价格处理。停牌期间无法自由调仓,复牌后价格可能已经发生大幅跳变。回测需要冻结持仓、记录资金占用,并根据实际交易规则处理复牌后的成交限制。
冲击成本与滑点
订单规模相对于市场成交量越大,实际成交价格偏离信号价格的程度通常越高。可以用下面的形式描述冲击成本的思考框架:
冲击成本 = 系数 ×(订单规模 / 平均成交量)的幂 × 波动率
这个表达式适合帮助研究者理解订单规模、流动性和波动率之间的关系,不应被当作任何市场都适用的精确报价器。冲击成本还会受到以下因素影响:
- 订单提交时段;
- 买卖方向;
- 盘口深度;
- 订单拆分方式;
- 市场波动状态;
- 个股流动性;
- 是否存在涨跌停限制;
- 使用市价单还是限价单;
- 订单是否需要排队;
- 市场是否在信号集中出现时同时拥挤。
回测至少应进行多组成本压力测试,例如基础、保守和极端情景。重点不是找到一个看起来最准确的成本数字,而是观察策略在成本上升时是否迅速失去盈利能力。
如果成本稍微上升,收益曲线就从盈利变成亏损,那么策略的经济优势可能只是撮合假设的产物。对于高频策略,还要关注盘口排队、撤单和成交优先级。日线回测无法证明一个依赖盘口微小价差的策略可以在实盘中执行。
费用、融资与资金占用
费用模型必须与交易市场、账户类型、交易品种和适用期间一致。不同市场、不同品种、不同券商账户的收费规则可能存在差异,最低收费、交易方向、账户规模和成交方式也会影响最终成本。
不能把手续费简单设置成一个固定比例,然后用年化收益减去这项费用就结束。高换手策略需要同时考虑:
- 佣金和交易规费;
- 买卖方向不同带来的费用差异;
- 最低收费;
- 资金占用;
- 融资利息;
- 融券利率和可借券数量;
- 借券到期与强制归还;
- 保证金比例变化;
- 追加保证金;
- 强平条件;
- 分红、配股和其他公司行动对借券的影响。
融资融券成本还会受到持仓时间、资金利用率和可借券状态影响。一个在不考虑资金占用时有正收益的策略,加入融资成本后可能不再成立。
分红、除权与复权
长期策略必须明确使用哪种价格序列,以及这个价格序列在不同环节承担什么作用。
如果使用未复权价格,分红和拆股可能被误判为价格跳变;如果使用后复权价格,又可能在信号构造中引入当时并不可知的未来信息。价格调整方式应与信号生成、成交模拟和收益计算分别定义,不能把一个复权序列无条件用于所有环节。
需要检查:
- 分红除权信息在当时何时可获得;
- 信号是否使用了后来修订的公司行动数据;
- 调整后的价格是否被错误地当作真实成交价格;
- 现金分红是否进入账户现金;
- 配股、增发和拆分如何处理;
- 复权是否改变了历史换手率和触发条件;
- 价格调整是否影响了止损、止盈和波动率计算。
复权错误有时会把一个本来依赖价格跳变的策略变成虚假的趋势策略,也可能让交易成本计算失真。
数据延迟与数据错误
数据质量问题往往比算法问题更难定位。典型错误包括:
- 复权因子缺失或重复调整;
- 退市股票最后报价异常;
- 停牌期间被错误填充价格;
- 财务数据使用了发布日期之后才修订的版本;
- 指数成分股采用当前名单回填历史;
- 分钟数据存在时间戳错位;
- 交易日历与实际交易所日历不一致;
- 行情、成交量和公司行动来自不同版本的数据源;
- 数据供应商更新后覆盖了原始版本;
- 不同市场的时区和收盘时间没有统一。
生产环境应建立数据质量校验模块,对价格连续性、成交量异常、证券状态和公司行动进行交叉检查。回测使用的数据版本也应固定并留档。否则,即使策略代码没有变化,数据更新也可能让结果悄悄改变。
执行层的偏差通常不是单一致命错误,而是多个小问题叠加:一点滑点、一点成交失败、一点复权误差、一点股票池偏差,再加上手续费和资金占用,最终可能让回测中的优势完全消失。
模型边界与工程化防线
没有一种验证方法能够保证未来盈利。组合式剔除交叉验证、选择偏差校正、参数敏感性分析和成本压力测试,都只能减少某类错误,不能消除市场变化本身。
组合式验证的边界
组合式剔除交叉验证可以降低时间序列中的标签泄漏和切分偏差,但不能预测结构性变化。如果市场参与者、交易规则、流动性环境或宏观制度发生变化,历史样本的统计分布可能不再代表未来。
多条样本外路径如果都来自同一个历史阶段,也不能证明模型已经经历了真正不同的市场环境。因此,验证结果必须结合趋势、震荡、高波动、低波动和流动性收缩等状态分别观察。
选择偏差校正的边界
选择偏差校正依赖对试验数量、收益分布和试验相关性的估计。现实中的候选策略很少真正独立:不同参数组合可能共享同一个因子,不同因子又可能暴露于同一个风险来源。
如果把高度相关的试验当成独立试验,校正可能失真;如果遗漏研究过程中已经淘汰的方案,校正又会过于乐观。它的价值在于迫使研究者面对选择偏差,而不是提供一个可以机械通过的数字门槛。
参数稳定性的边界
历史上的平缓高原,不代表未来也存在同样的高原。手续费规则、涨跌幅限制、市场参与者结构和交易拥挤程度发生变化后,原来的参数区域可能整体失效。
因此,参数稳定性应该进行滚动评估。每隔一段时间重新观察热力图,比较样本内、样本外和实盘参数区域是否发生漂移。参数不断向更极端方向移动,本身就是需要关注的信号。
从研究到上线的完整流程
策略上线前,可以把防线组织成以下顺序:
1. 固定研究问题、样本范围和可使用的数据;
2. 建立完整试验日志,保留失败结果;
3. 检查标签时间、特征时间和成交时间是否严格一致;
4. 使用适合金融时间序列的剔除、禁运和滚动验证;
5. 计算样本外收益、回撤、换手和交易数量分布;
6. 对参数进行扰动,寻找能够承受变化的区域;
7. 使用多组成本和成交假设进行压力测试;
8. 检查幸存者偏差、停牌、退市和股票池历史变化;
9. 进行小规模仿真或灰度交易,比较信号、订单和成交差异;
10. 设置上线后的衰减监控和暂停条件。
灰度阶段不应只盯着收益率。更值得监控的是:
- 实际成交率与回测假设的差异;
- 实际滑点与成本模型的差异;
- 交易信号数量是否异常下降;
- 持仓是否集中到少数流动性较差的标的;
- 不同市场状态下的收益分布;
- 实盘参数是否偏离历史稳定区域;
- 回撤来自模型逻辑,还是来自数据和执行故障;
- 实盘交易数量是否与回测中的交易机会大致一致。
当实盘表现变差时,不要立即重新优化参数。先判断问题属于哪一层:数据、信号、组合、执行,还是市场状态。如果每次回撤都通过修改参数解决,策略很快会进入新的过拟合循环。
回测不是预测工具。更准确地说,回测是一种有条件的统计检验工具。它可以检验策略逻辑在特定历史数据、特定成本假设和特定执行规则下是否曾经成立,但不能直接证明未来会继续盈利。
真正可靠的研究流程,不是找到一条最漂亮的收益曲线,而是能够回答几个不那么令人兴奋、却更重要的问题:一共尝试过多少方案,哪些方案被淘汰,数据在当时是否真的可获得,订单是否真的能够成交,参数改变后逻辑是否仍然存在,样本外失败时究竟是哪一层出了问题。
模型的边界不是信仰问题,而是工程问题。只有完整保留每一次试验、每一个数据版本、每一项交易成本和每一次失败原因,研究者才有机会区分真正的信号、历史噪音和执行幻觉。否则,实盘中的失效只会被解释成市场突然变化,而下一轮回测又会在同一段历史上重复犯错。
相关阅读: 交易员决策疲劳应对策略:减少日内无效交易的系统化方案 、 全职交易员的社交孤立:享受孤独还是走向心理失衡?.
