12.6 ML策略评估:为什么线上表现会掉
课前导读
本章目标
适合读者:已经知道训练集、测试集、回测和基础机器学习指标,并希望把研究结果放到真实 A 股交易语境中审视的投资者。
本节重点:你将理解为什么模型上线后常常衰减,如何把预测指标、组合指标、交易成本和线上监控连成一套评估框架。
学习难度:advanced
预计用时:约 40 分钟
很多策略在研究报告里像“尖子生”。
一到真实市场,就变成“普通人”。
这不一定说明研究者造假。
更多时候,是离线环境和线上环境不是同一个考场。
离线回测像在安静教室里做题。
线上交易像在下雨、堵车、有人临时改规则的路上开车。
模型评估要做的事,就是提前估计这条路有多颠簸。
知识正文
1. 类比:餐厅试菜和真实晚高峰
想象一位厨师研发新菜。
试菜时,食材新鲜、厨房安静、客人只有三位熟人。
大家都觉得味道很好。
但真正开业后,晚高峰同时来五十桌。
食材批次不同,服务员忙不过来,外卖骑手催单,顾客口味也更复杂。
这道菜的真实表现可能明显下降。
机器学习策略也是一样。
回测里数据整齐、成交假设稳定、成本参数固定。
实盘里市场风格变化、盘口厚度变化、涨跌停限制、交易延迟、资金规模和投资者行为都会参与进来。
所以,评估不能只看“训练时分数”。
要看模型从研究室走到市场街道后,还剩多少有效性。
2. 术语:离线、样本外、线上和衰减
离线评估,是在历史数据上检验模型。
样本外评估,是把模型放到训练期之后、没有参与调参的数据上检验。
线上评估,是模型真正进入模拟盘、小资金或生产环境后的表现监控。
衰减,是指线上表现低于离线预期。
衰减不是例外。
在金融市场里,它更像默认现象。
因为市场本身会学习、变化和反击。
你发现一个因子后,别人也可能发现。
你买入某些股票后,成交价格会被自己的交易影响。
政策、行业景气、投资者情绪和流动性环境也会改变。
因此,一个成熟的 ML 策略评估,不是问“会不会衰减”。
而是问“衰减多少算正常,衰减到哪里必须暂停”。
3. 线上表现下降的五个常见原因
第一,分布漂移。
模型训练时看到的是过去市场。
上线后面对的是新市场。
A 股的市场风格可能在成长、价值、小盘、红利、周期之间轮动。
如果训练期主要是小盘活跃,模型可能偏爱高弹性股票。
当市场转向低波动高股息时,它的信号就会变弱。
第二,交易成本被低估。
回测可能只扣固定手续费。
真实交易还包括冲击成本、滑点、买卖价差、涨跌停无法成交、停牌和资金容量约束。
高换手模型尤其敏感。
每天换仓很多,看似预测准确,实际利润可能被成本吃掉。
第三,样本外选择不够严格。
如果你反复查看测试集,再根据结果改特征和参数,测试集就不再陌生。
它变成了另一个训练集。
上线后自然会掉。
第四,数据质量和时点差异。
历史数据可能经过修正。
线上数据可能有延迟、缺失、异常跳点或公告解析错误。
财报字段、行业分类、指数成分和 ST 状态如果时点不一致,线上信号会和回测信号不同。
第五,市场容量和拥挤度。
一个小资金回测能买到的价格,不代表大资金也能买到。
当很多人使用类似信号时,买点会提前、卖点会拥挤,收益空间会被压缩。
重要提醒
线上表现下降不一定说明模型完全无效。 关键是把下降拆成可解释部分:市场变化、成本、执行、数据、容量,还是原始信号失效。
4. 从预测指标到组合指标
机器学习模型常先输出预测分数。
预测分数可以评估排序能力。
例如,模型认为 A 股票比 B 股票更有吸引力,之后 A 是否真的表现更好。
量化研究里常用 IC 或 Rank IC 描述这种相关性。
你可以把它理解成“模型打分和未来结果是否同方向”。
但投资者最终关心的不是分数本身。
而是组合结果。
组合指标包括年化收益、最大回撤、波动率、夏普比率、胜率、换手率、持仓集中度和容量。
预测指标和组合指标可能不一致。
模型排序略有优势,但换手太高,成本后亏损。
模型胜率不高,但盈亏比好,组合仍可能稳健。
模型回测收益高,但集中押注一个行业,风险其实很大。
所以评估要分层。
先看预测有没有统计上的稳定方向。
再看组合能否在交易约束后保留收益。
最后看上线后是否仍在预期范围内波动。
5. A 股策略评估框架
下面这套流程适合审查一个 A 股 ML 策略。
graph TD
A[离线训练与验证] --> B[严格样本外测试]
B --> C[加入A股交易约束]
C --> D[模拟盘或影子组合]
D --> E[小资金试运行]
E --> F[线上监控与复盘]
F --> G{是否超出风险边界}
G --> H[继续观察]
G --> I[降权或暂停]离线阶段关注数据清洁、切分方式和泄露审计。
样本外阶段关注模型是否只在陌生时间段仍有效。
交易约束阶段要加入 T+1、涨跌停、停牌、手续费、滑点、买卖价差和成交量限制。
模拟盘阶段不一定真实下单,但要用当天真实可见数据生成信号。
小资金阶段关注执行差异。
线上监控阶段关注衰减是否在预期内。
这条链条越完整,模型分数越不容易变成幻觉。
6. 监控指标:上线后应该看什么
线上监控不是每天盯收益曲线紧张。
它更像给策略安装仪表盘。
至少应关注四类指标。
第一类是信号健康。
包括预测分数分布、信号覆盖率、特征缺失率、极端值比例和每日换手。
如果模型分数突然全部挤在一起,可能说明输入数据异常。
如果缺失率突然升高,可能是数据源或字段口径变化。
第二类是交易执行。
包括计划成交量、实际成交量、平均滑点、未成交比例、涨跌停影响和停牌影响。
在 A 股里,信号正确但买不进去或卖不出来,结果也会变差。
第三类是组合风险。
包括行业暴露、市值暴露、个股集中度、最大回撤、波动率和杠杆使用情况。
模型可能无意中押注某个主题。
主题上涨时很风光,切换时回撤会很快。
第四类是预期差。
把线上收益、换手、成本和回撤与回测预期对比。
如果线上成本长期高于回测假设,就要重新估计策略净收益。
如果线上 Rank IC 连续低于历史低位,就要检查信号是否失效。
7. 简化 Python 示例:看成本如何吞掉优势
下面例子只为说明直觉。
它不是实盘策略。
# 每笔交易前的预期收益,单位可以理解为 1 = 1%
expected_alpha = [0.9, 0.7, 0.5, 0.4, 0.3]
turnover = [0.8, 0.9, 1.1, 1.0, 1.2]
cost_per_turnover = 0.4
net_alpha = []
for alpha, change_rate in zip(expected_alpha, turnover):
cost = change_rate * cost_per_turnover
net_alpha.append(alpha - cost)
print(net_alpha)这段代码表达一个简单事实。
模型看起来每天有一点预测优势。
但如果换手很高,交易成本会按换手持续扣除。
当预期收益只有 0.3% 到 0.5%,而真实成本接近或超过这个水平时,策略上线后就很容易“消失”。
很多机器学习模型喜欢频繁改变排序。
这会让组合频繁换仓。
如果评估时只看预测准确率,不看换手和成本,就会高估策略。
8. A 股案例:一个高换手小盘模型
假设某模型在 2019 到 2021 年表现很好。
它偏好短期成交活跃、波动较大、市值较小的股票。
回测显示年化收益很高。
但上线后表现下降。
复盘时发现几个问题。
第一,训练期小盘风格占优,样本外风格切换后信号弱化。
第二,模型每天排序变化大,导致换手过高。
第三,很多目标股票盘口较薄,大资金买入会推高价格。
第四,部分股票涨停时买不进去,跌停时卖不出来。
第五,回测用收盘价成交,但实盘只能在次日或盘中执行。
这时不要急着换更复杂的模型。
更专业的做法是分解误差来源。
如果主要是成本问题,先降低换手和容量假设。
如果主要是风格问题,增加风格暴露监控。
如果主要是数据时点问题,修正数据管道。
如果主要是信号失效,再考虑重新建模。
教师视角
评估不是为了证明模型厉害,而是为了发现模型在哪些条件下会变弱。 知道边界,才有资格谈使用。
9. 可执行练习:设计一张线上监控日报
请为一个“每日收盘后选股、次日调仓”的 ML 策略设计日报。
不需要真实数据。
只需要列出你每天要看的字段。
建议包含以下内容。
| 模块 | 指标 | 你要问的问题 |
|---|---|---|
| 信号 | 分数均值、分位差、覆盖股票数 | 今天模型是否正常输出 |
| 数据 | 缺失率、异常值数量、更新时间 | 输入是否可靠 |
| 交易 | 换手率、未成交比例、滑点 | 成本是否超过预期 |
| 风险 | 行业集中度、市值暴露、个股权重 | 是否变成隐形押注 |
| 表现 | 日收益、累计收益、回撤 | 是否偏离历史范围 |
| 对比 | 线上与回测成本差、线上与模拟盘差 | 差距来自哪里 |
练习的关键不是追求表格好看。
而是让每个指标都能触发一个动作。
例如,缺失率异常就暂停信号。
滑点异常就降低交易量。
回撤触线就降权或复核。
Rank IC 连续恶化就进入策略复盘。
10. 评估中的三条底线
第一,不把样本内收益当作投资承诺。
样本内只是模型学习后的成绩单。
它不能代表未来。
第二,不把一次样本外成功当作永久有效。
市场状态会改变。
策略需要持续监控。
第三,不把复杂模型当作成本豁免证。
再聪明的模型也要经过交易成本、成交限制和风险约束。
忽略这些,线上掉落只是时间问题。
交互实验室
场景推演:线上掉了 40%,你先查什么
假设某 A 股 ML 策略回测年化收益为 20%。
模拟盘三个月后,按同样口径估算只剩 12%。
请不要立刻判断“模型失效”。
按顺序回答下面问题。
- 模拟盘的数据是否严格按当日可见时间生成?
- 实际换手是否高于回测?
- 滑点、买卖价差、涨跌停未成交是否高于假设?
- 组合是否集中到某个行业或市值风格?
- 同期市场风格是否发生变化?
- 预测分数分布是否和回测期明显不同?
- 如果只看低换手子组合,衰减是否变小?
把答案写成三列。
第一列写“可能原因”。
第二列写“需要的数据”。
第三列写“如果成立,采取什么动作”。
这就是量化开发的线上复盘思维。
评估动作卡片
| 观察结果 | 可能解释 | 优先动作 |
|---|---|---|
| 收益下降但成本上升 | 执行差异或容量不足 | 重新估计成本,降低换手 |
| Rank IC 下降但成本正常 | 信号弱化或分布漂移 | 检查市场风格,重新验证 |
| 缺失率突然升高 | 数据管道异常 | 暂停信号并修复数据 |
| 行业集中度升高 | 模型押注主题 | 加入暴露约束或降权 |
| 未成交比例升高 | 涨跌停、停牌或流动性不足 | 调整可交易股票池 |
| 回撤超过预设边界 | 风险状态变化 | 降权、停止新增、复盘 |
你可以把这张表放在研究笔记里。
每次策略表现偏离预期时,先按表排查,而不是马上换模型。
核心复盘
知识清单:
- [ ] ML 策略上线后衰减很常见,评估要提前定义可接受范围。
- [ ] 分布漂移、交易成本、数据时点、容量和拥挤度都会让线上表现下降。
- [ ] 预测指标只能说明模型打分质量,不能替代组合收益和风险指标。
- [ ] A 股评估必须纳入 T+1、涨跌停、停牌、滑点和可成交量限制。
- [ ] 线上监控应覆盖信号健康、数据质量、执行差异、组合风险和预期差。
- [ ] 策略复盘应先拆解原因,再决定修数据、降换手、降权、暂停或重建模型。
- [ ] 复杂模型不能替代严谨的样本外测试和持续监控。
金句总结
模型上线不是毕业典礼,而是开始接受市场每天监考。