[控场AI]
· 5 分钟阅读· 2,815 字

138k金融头条微调ModernBERT:训练loss降了,测试AUC仍为0.50

138k金融头条微调ModernBERT:训练loss降了,测试AUC仍为0.50

13.8万条金融新闻微调ModernBERT,训练loss下降但测试AUC仅0.5,揭示金融文本预测的三大陷阱。

一位Reddit用户用13.8万条金融新闻标题微调ModernBERT,试图预测近期下跌股票的反弹强度。尽管训练loss持续下降,测试AUC始终停在0.49–0.51,等同随机。作者通过减去同日市场平均收益、严格按时间切分、每只股票每周去重等手段防止泄露,但微调模型、关键词特征、kNN和梯度提升均告失效。手工关键词效应在训练期和测试期之间发生符号翻转,唯一稳定的模式是增发新股后表现更差,但仅98个样本。该实验的价值在于暴露了目标泄露、近重复样本和非平稳性三个常见陷阱,并给出了一份实用的失败清单。

一位Reddit用户用13.8万条金融新闻标题微调ModernBERT,试图预测哪些近期下跌的股票会更强势反弹。结果很干脆:训练loss一路下降,测试集AUC始终停在0.49到0.51之间,约等于抛硬币。

这个“失败”实验的价值,可能比一个漂亮的高分结果更大。它把金融文本预测里最容易被忽略的几个坑——目标泄露、近重复样本、非平稳性——暴露得非常清楚。

实验设计:把市场因素从标签里剥掉

数据集来自Benzinga,包含2,518只美股、137,934条新闻标题。每个样本取该股票前14天的标题作为输入。经过筛选后,共有115,154个案例,全部是“财报不错但股价近期下跌”的股票,表面上条件相似,真正的问题是:哪些会恢复得更好。

目标不是简单的涨跌,而是一笔模拟交易:涨跌幅达到该股日常波动的3倍,或持有20个交易日后结束。结果以“日常波动倍数”为单位来衡量,避免高波动股票主导指标。

关键一步是减去同一交易日所有案例的平均收益。原因很直接:全市场下周怎么走,并不存在于某条新闻标题里。如果不做这个减法,模型很可能只是在学市场情绪,而不是在学标题与个股表现之间的关系。

标签最终定义为:该案例是否跑赢当天中位数。因此AUC衡量的是:在同一天的样本中,模型能否把更好的那一半和更差的那一半分开。

ModernBERT 是 2024 年底发布的一种编码器架构,可视为 BERT 的现代化升级版。它采用旋转位置编码(RoPE)替代绝对位置编码,使用 FlashAttention 加速,并将最大上下文窗口从 BERT 的 512 token 扩展到 8192 token,同时通过去填充和权重共享等技巧提升推理效率。对于金融新闻标题这类短文本分类任务,ModernBERT 的优势在于更稳定的长文本建模能力和更快的训练速度,因此在微调实验中被广泛采用。不过,模型架构的改进并不能解决标签噪声和非平稳性问题——这正是本文实验的核心发现。

AUC(Area Under the ROC Curve) 是二分类任务中衡量模型排序能力的常用指标,取值 0.5 表示与随机猜测无异,1.0 表示完美区分。本文中 AUC 衡量的是:在同一天的样本里,模型能否把表现更好的一半和更差的一半分开。之所以要在同日样本内计算,是因为已经减去了市场平均收益,跨日比较没有意义。AUC 停在 0.49–0.51 意味着模型的排序能力与抛硬币没有统计上的显著差异,即便训练 loss 在下降,模型也只是在拟合噪声而非学到可泛化的信号。

防泄露:严格按时间切分

作者做了几件在金融机器学习里必须做的事:

  • 严格时间切分:训练集截止到2024年11月,测试集从2025年1月开始,中间留出间隔,确保没有任何标签重叠。
  • 每只股票每周只保留一个案例。相邻交易日共享几乎相同的标题和几乎相同的结果,如果每天都保留,模型会记住股票,而不是学到规律。
  • 这种“按时间去重”不是可选项,而是底线。

即便做了这些处理,结果依然没有跑赢随机。

近重复样本泄露是金融文本建模中一个隐蔽但致命的陷阱。相邻交易日的新闻标题往往高度相似,甚至完全相同(如“公司宣布回购计划”可能连续多天出现),而对应的收益标签也因持仓期重叠而高度相关。如果随机划分训练集和测试集,模型会在训练中“见过”测试样本的近亲,导致测试性能虚高。更隐蔽的是,即便按时间切分,同一只股票在训练集和测试集中反复出现,模型也可能记住个股的特定模式而非学习新闻与收益的普遍关系。因此,按时间去重(如本文中每只股票每周只保留一个案例)是防止泄露的必要步骤,而非可选优化。

结果:微调、关键词、kNN全部失效

作者对比了多种方法:

  • 微调ModernBERT(5天和14天窗口,文本中加或不加行业信息):AUC在0.49到0.51之间。训练loss持续下降,测试表现始终是硬币水平。
  • 手工关键词特征(上调评级、下调指引、回购等):几乎所有效应在训练集和测试集之间发生符号翻转。例如“上调评级”在2025年前是+0.28,2025年后变成-0.04。
  • 基于bge-base嵌入的kNN(用最相似的50个历史案例的结果来预测):所有五分位表现平坦,没有区分度。
  • 把文本和价格特征一起放进梯度提升模型:并不比随机选股更好。

唯一在两个时间段都站得住的,是一个狭窄且需要人工清洗的模式:公司增发新股后表现明显更差。但这类样本只有98个,样本量太小,无法作为可靠策略。

三个值得记住的教训

训练loss下降,在噪声目标上毫无意义

金融预测的标签本身噪声极高。模型可以很开心地拟合噪声,训练loss稳步下降,但测试AUC不会动。看到loss降就以为模型学到了东西,是一种危险的自我安慰。

近重复样本造成的泄露很容易被忽略

相邻交易日共享大量标题,结果也高度相关。如果不去重,模型实际上是在“背股票”,而不是在学新闻与收益的关系。按时间去重,是金融文本建模里最容易被跳过、也最不能跳过的一步。

关键词效应会整体翻转

作者说,关键词符号翻转是他见过最清晰的非平稳性画面。2023年有效的模式,之后可能直接反向。把训练期发现的规律直接外推到测试期,在金融文本上尤其危险。

社区建议:排序损失与更短周期

作者在最后向社区提问:这种零结果在金融文本预测中是否常见?有建议提出改用逐日排序损失(per-date ranking loss)、按日计算rank IC,并把预测周期缩短到1到3天。

这些方向值得尝试。逐日排序更贴近“同一天里谁更好”的真实问题,短周期也能减少持有期内其他信息的干扰。不过在尝试更多模型之前,先把数据泄露和时间切分做扎实,可能比换模型更重要。

这个实验没有给出可交易的信号,但它给出了一份很实用的失败清单:目标要去市场、样本要按时间去重、loss下降不代表学到规律、关键词效应会漂移。对做金融NLP的人来说,这些比一个虚高的回测曲线更有价值。

逐日排序损失(per-date ranking loss) 是一种针对面板数据设计的训练目标。传统二分类损失将每个样本独立看待,但金融预测的核心问题是“在同一天中,哪些股票相对更好”。逐日排序损失不要求模型预测绝对涨跌,而是要求模型对同一天内的样本给出与真实收益一致的排序。具体实现常采用 pairwise ranking loss(如 RankNet)或 listwise loss(如 ListNet),以每天为一个 group 计算损失。这样做的好处是自动剥离市场整体波动,只关注横截面区分度。配合按日计算 rank IC(信息系数),可以更直接地衡量模型是否学到了有用的排序信号,而非拟合绝对收益中的噪声。

#ModernBERT#金融文本预测#AUC#数据泄露#非平稳性#金融NLP#股票预测#训练loss
分享:

相关推荐