601318 卖出策略得分骤降 21.8 分:市场结构变化还是数据降级失真?得分制与胜率制的矛盾
本文最后更新于 2026年8月31日 凌晨
601318 的卖出策略得分,一天内降了 21.8 分。
我的第一反应是市场要变天。但把行情数据拉出来逐项排查,市场结构没有任何异常。真正的原因在两天前的一次「无感升级」:我把策略打分依赖的分类模型从 Qwen3.6-35B-A3B 换成了 Qwen3.5-35B-A3B-Ornith,输出分布漂移,得分跟着失真。
这轮排查让我想通了一件事:得分制与胜率制冲突时,先信谁,后信谁,应该有一条硬规则。
现象:分数掉得不像市场波动
这套系统每天收盘后跑一遍 601318 的 daily pipeline:特征工程 → 分类模型 → 卖出策略得分。分数在 0-100 之间,用于控制卖出档位的触发阈值。
某天早上打开监控,得分少了 21.8 分。过去三个月,单日波动最大才 4 分。
我没有急着调参数。调参是最差的反应——先搞清楚是市场变了,还是评估链路坏了。
第一步:排除市场结构变化
我把 601318 的行情数据单独拉出来,和前 60 个交易日对比:
- 价格:没有突破关键分位
- 成交量:正常
- 波动率:正常
- 行业 beta:正常
- 保险板块和大盘:没有结构性事件
市场结构没问题。那问题在数据链路。
第二步:找到数据降级源
排查顺序:输入数据 → 特征工程 → 模型 → 得分映射。
输入文件没有变。特征工程的代码 diff 为空。得分映射逻辑没动。
再往前查推理环境。两天前我把模型从 Qwen3.6-35B-A3B(Q4_K_M)换成了 Qwen3.5-35B-A3B-Ornith(Q4_K_M),实测速度从 103 t/s 提到 104 t/s,几乎无感知。当时我判断:这只是小版本升级,行为应该等价。
账单就在这里。新模型的输出分布整体更保守——对 601318 的关键卖出标签,置信度整体下移。策略得分对置信度敏感,这一降就丢了 21.8 分。
这就是数据降级失真:输入没变,模型名义上「升级」了,但评估结果坏了。
第三步:用胜率制仲裁
市场结构没变,数据链路有噪声。那真实交易结果呢?
我回看了过去 60 个交易日的卖出策略实际执行记录,按日统计胜率。结论:胜率波动很小,既没有恶化,也没有改善。
这个信号非常关键。它说明两件事:
- 601318 的市场状态没有发生结构变化——真实的交易质量稳定。
- 得分骤降 21.8 分,不是策略变差了,是评估链路自己失真了。
得分制是瞬时的、前瞻的、对输入分布高度敏感的;胜率制是滞后的、保守的、统计稳定的。两者矛盾时,我现在的规则是:
得分与胜率背离,先信胜率,后信得分,第一步永远是查数据管道。
得分制与胜率制的矛盾
顺着这次事故,我把两者的使用边界理了一遍。
得分制的优势是速度快,能提前反映策略质量变化。代价是它对评估链路里的任何一点噪声都极其敏感。一次模型热更、一个特征源里的数据缺口、一个量化档位的差异,都能造成十分位的虚假跳变。
胜率制的优势是统计稳健,能过滤掉单次噪声。代价是滞后——市场真变差了,胜率要十几个交易日后才反映出来,预警作用有限。
所以不能只用其中一种。我建了一个「残差监控」:得分与滚动胜率的偏差,超过 2 倍标准差就冻结策略信号,先查数据,再决定要不要调参数。
这次 21.8 分的骤降,如果当时没有胜率制兜底,我会以为是市场结构变化,然后把卖出阈值调松,犯一个方向性错误。
踩过的坑
三个坑,按代价排序。
坑一:模型升级只看速度,不看分布。
103 t/s → 104 t/s 看起来很美好,像纯性能提升。实际上模型行为变了。升级前应该跑一组固定样本,对比置信度分布,而不是只看速度和困惑度。
坑二:显存太大,反而放松了对软件风险的警惕。
我的推理机器是两张魔改版 RTX 2080 Ti,单卡 22 GB,双卡 44 GB,跑 35B 量化模型很轻松。硬件越宽裕,越容易忽略模型版本、量化方式这些软变量。这次事故全程和硬件无关,纯粹是模型版本行为漂移。
坑三:先写了半天「市场为什么弱」的叙事。
事故发生后,我最先做的是看新闻、看板块、找下跌理由,浪费了大半天。正确的顺序是:先查输入数据有没有变,再查代码有没有变,再查模型有没有变。市场叙事应该放最后。
怎么避免
三件事,一劳永逸:
- 模型切换前跑 golden set 回归。 固定 100 个样本,比较新旧模型的置信度分布。分布差异超过阈值,禁止上线。
- 策略得分每日快照。 原始输出存档,出问题当天就能 diff 定位,不用靠回忆。
- 得分 vs 胜率残差监控。 超过阈值自动冻结信号,先崩管道,再谈市场。
这次 21.8 分的教训是:量化系统里,得分是意见,胜率是事实。意见和事实打架的时候,先检查提意见的人嗓子坏了没有。
参考文献