halo 的技术博客

返回

金融文本数据是一座金矿。财报电话会议、分析师研报、新闻公告、SEC 文件——这些非结构化文本里藏着市场定价尚未反映的信息。传统的 NLP 方法用词袋模型或 LSTM 做情感分类,准确率瓶颈明显。大语言模型的出现改变了游戏规则,但通用模型在金融文本上的表现往往一言难尽。微调是解题思路——这篇文章记录我用 LoRA 微调 Qwen 7B 做金融情感分析的全过程。

为什么需要微调,而不是直接 prompt?#

很多人觉得 GPT-4 或 Qwen 这种大模型直接给个 prompt 就能做情感分析了——「请判断以下财报摘录的情感倾向:积极/中性/消极」。实际测试下来,这种方法的问题不少:

首先,通用模型对金融领域的情感表达不够敏感。比如「公司预计下季度营收环比增长 3%」——分析师可能因为预期增长 5% 而认为这条是负面信号,但通用模型会简单地判断为积极。金融情感是相对于市场预期的,而非绝对的好坏。

其次,金融文本有独特的「黑话」。像「margin compression」「deleveraging」「working capital improvement」这些术语,在不同语境下的情感含义完全不同,通用模型经常误判。

第三,prompt 的稳定性是个大问题。同样的文本,稍微改一下 prompt 措辞,结果可能从「强烈积极」变成「略带消极」。在生产环境中,这种不稳定性是不可接受的。

微调的目标是让模型学会:什么信号在金融语境中是真正的积极/消极/中性。

金融情感标注数据分布

数据准备:FiQA + 自建语料#

我用了两个数据源来构建微调数据集:

FiQA(Financial Question Answering)数据集。 包含约 1.7 万条金融新闻的情感标注(三分类:positive/negative/neutral),句子级别的标注质量不错,但覆盖的主要是英文新闻标题。

自建语料——A 股公告与研报。 我从东方财富和巨潮资讯网上爬取了 2020-2024 年间约 5 万条 A 股业绩预告摘要和券商研报标题,然后用一个两阶段标注策略:先用 GPT-4o 做初步情感标注(给详细的标注规范),再人工抽查 10% 做质量校准。标注一致性约 92%,对于构建微调数据集来说够用了。

关键的数据处理技巧:

  • 上下文增强。 单条文本的情感可能与上下文有关。比如一篇研报标题「Q3 业绩超预期」单独看是积极的,但如果有「但毛利率承压」这个后半句,整体情感会打折。我保留完整的段落级上下文,不做过度的句子切分。
  • 标签平滑。 不用硬标签(hard label)而用软标签(soft label),即每条文本给一个情感概率分布而非单一类别。比如「大盘承压但公司表现优于同业」标注为 {negative: 0.1, neutral: 0.3, positive: 0.6},而非简单标一个 positive。
  • 类别平衡。 金融语料天然偏向中性(大多数公告和新闻是中性的),直接训练会导致模型倾向预测中性。我做了上采样和下采样混合策略,三个类别比例控制在 35%/35%/30%。

LoRA 微调配置#

选择了 LoRA(Low-Rank Adaptation)而非全量微调,原因很实际:Qwen-7B 全量微调需要约 56GB 显存(bf16),而 LoRA 只需要 16GB,一块 4090 就能跑。LoRA 在 attention 层的 Q、K、V、O 投影矩阵上插入低秩适配器:

关键超参数选择:

  • Rank r=16:对于分类任务来说足够了。rank 越大越接近全量微调,但收益递减明显。16 是我在验证集上实验的结果。
  • Alpha=32:缩放因子,控制了 LoRA 权重的更新幅度。alpha/r 比值决定了适配器的「强度」。
  • Target modules:q_proj, k_proj, v_proj, o_proj——这是标准的做法。有人还加 gate_proj 和 up_proj(MLP 层),但我实验发现对于情感分类任务,只加 attention 层效果就很好,加 MLP 层反而增加了过拟合风险。
  • Learning rate=2e-4,cosine scheduler,warmup ratio=0.1,训练 3 个 epoch。
  • Batch size=16,gradient accumulation steps=4(等效 batch size=64)。

LoRA微调loss曲线

微调效果评估#

在测试集上,微调后的模型表现显著优于未经微调的基线:

模型准确率加权F1金融情感F1
FinBERT(专用模型)0.8210.8190.815
GPT-4o(prompt)0.8670.8640.851
Qwen-7B(prompt)0.7830.7800.762
Qwen-7B(LoRA微调)0.8910.8890.878

几个有趣的发现:

微调后的 Qwen-7B(70 亿参数)在金融情感任务上超过了 GPT-4o(估计万级参数)。这再次说明了一个核心原则:用对了数据做微调的小模型,可以在专业领域打败通用大模型

更重要的是,微调后的模型对「隐含负面信号」的识别能力大幅提升。比如短语「受宏观环境影响」——这在中概股公告中几乎总是负面信号的委婉表达,未微调的模型会判断为中性,而微调后的模型能正确识别为负面。这类领域特有的信号,恰恰是微调的价值所在。

FinBERT 作为专门为金融情感设计的模型,虽然绝对性能不是最强,但在推理速度上有优势——它只有 1.1 亿参数,推理延迟 <10ms,适合高频场景。

从情感信号到实盘策略#

有了情感分析模型,下一步是把它变成可交易的信号。我设计了一个简单的 pipeline:

信号生成: 每天早上 8:30,爬取前 24 小时内所有与 A 股相关的重要新闻和公告,用微调模型生成每条文本的情感分数(-1 到 +1 的连续值),按股票聚合,取加权平均。

信号聚合: 单日情感信号噪声很大,用指数加权移动平均(EWMA,半衰期 3 天)平滑序列。平滑后的信号再做一个截面标准化(Z-score),得到每只股票的相对情感强度。

策略构建: 多空组合——每天持有多头情感最强的前 20% 和空头情感最弱的后 20%,等权配置,日频调仓,双边千分之一手续费。

回测结果(2021-2024 A 股全市场):

  • 年化收益:14.3%(多头端)、-3.2%(空头端),多空组合 17.5%
  • 年化波动:12.8%
  • 夏普比率:1.37
  • 最大回撤:-15.2%
  • 日胜率:52.3%(看似不高,但收益幅度不对称——赚的时候赚得多,亏的时候亏得少)

这个策略的最大回撤发生在 2022 年 4 月(上海封城期间),情感信号因为大量恐慌新闻而产生了集体偏差,导致多头端跟着全市场一起跌。这个问题提醒我们:宏观系统性风险面前,任何基于截面信号的策略都会失效。解药可能是加上市场状态过滤——在大盘暴跌日(如沪深 300 单日跌幅 >2%),暂停交易。

生产部署注意事项#

把 LoRA 微调模型部署到生产环境,有几个工程层面的考量:

推理效率。 Qwen-7B 的推理延迟约 200-300ms/条(A100),每天处理 5000 条文本大约需要 25 分钟。可以用 vLLM 加速,启用 continuous batching 和 PagedAttention,吞吐量提升 3-5 倍。

LoRA 适配器热插拔。 如果你有多个领域微调任务(情感分析、事件分类、关键词提取),可以把每个任务的 LoRA 权重保存为独立的 adapter 文件(通常只有几十 MB),加载基础模型后按需切换。这个功能 HuggingFace PEFT 库原生支持,非常方便。

成本。 在 A100 40GB 上,每天做一次全市场文本扫描的成本约 $3-5(按 GPU 租赁价格)。如果觉得贵,可以用 Qwen-3B 甚至 Qwen-1.8B 做微调+蒸馏——我在 3B 模型上的实验显示,情感分析准确率只比 7B 低 1.5 个百分点,但推理速度快了 3 倍,成本降低了 80%。

LLM 微调做金融情感分析,已经从「实验室技术」进入「生产可用」阶段。关键是做好标注质量、选择恰当的微调策略、以及设计一个能过滤噪音的信号聚合流程。如果你手头有 GPU(哪怕是消费级的 4090),花一个下午跑完微调,第二天就能拿到一个有实盘价值的 NLP 信号源。

用 LoRA 微调大模型做金融情感分析:从零到实盘信号
https://blog.halo26812.eu.org/blog/llm-finetune-financial-sentiment
Author halo
Published at 2026年7月11日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨