2. 金融文本数据基础

在构建金融新闻NLP情绪因子之前,必须先回答一个比模型更底层的问题:你手里的文本数据,究竟长什么样?很多情绪因子在回测中表现优异、上线后迅速失效,根源往往不在模型,而在数据层——来源混杂、时间戳错位、正文缺失、标题与正文语义冲突。本节把金融文本数据拆成五个可检查的维度:来源、格式、时间戳、结构、质量问题,并给出可落地的处理原则。

一、核心原理:情绪因子的“数据血缘”决定因子上限

金融文本不是普通语料。它的价值密度高、时效性强、噪声类型特殊。一条新闻的情绪得分,实际是“来源可信度 × 文本完整性 × 时间对齐精度 × 结构解析正确性”的乘积。任何一项接近零,因子就失效。因此我们需要建立数据血缘(Data Lineage)意识:从原始抓取到因子入库,每一步都要可追溯、可复现。

核心公式:有效情绪信号 = 来源权重 × 文本质量 × 时间对齐 × 结构解析正确率。四者相乘,而非相加——这意味着短板会直接归零。

二、新闻来源:不同来源的情绪“方言”差异

金融新闻来源大致分为四类,它们的语言风格、发布节奏和情绪倾向差异显著,直接混用会导致因子漂移。

来源类型典型代表语言特征时效性情绪处理要点
官方公告交易所、证监会、公司公告格式化、法律化、低频情绪词准点、可预期需规则+模型结合,避免误判中性为负面
财经媒体财新、证券时报、路透专业、结构化、带记者倾向分钟级区分事实陈述与评论
社交舆情股吧、微博、雪球口语化、情绪极端、噪声大秒级需去重、去水军、降权
研报纪要券商研报、电话会议长文本、逻辑密集日级/周级需分段抽取,避免整篇平均

实践中建议为每个来源维护独立的来源权重表和情绪校准集,而不是用一套模型打天下。

三、数据格式与时间戳:最容易被忽视的“隐形杀手”

新闻数据常见格式包括 JSON、XML、CSV 和 HTML 快照。JSON 最主流,但字段命名极不统一:有的叫 publish_time,有的叫 pubDate,有的叫 ctime。时间戳更是重灾区,常见问题包括:

  • 时区不统一:UTC、北京时间、交易所本地时间混用,导致因子与行情错位数小时。
  • 精度不一致:秒级、毫秒级、甚至只有日期,无法做日内因子。
  • 时间语义混淆:“发布时间”与“事件发生时间”不同,公告常在收盘后发布。
  • 字符串格式多样:2024-01-05 09:30:00、2024/01/05、1704418200 并存。
# 统一时间戳处理示例
import pandas as pd

def normalize_timestamp(ts, tz='Asia/Shanghai'):
    # 兼容多种输入格式
    dt = pd.to_datetime(ts, utc=True, errors='coerce')
    if dt.tz is None:
        dt = dt.tz_localize('UTC')
    return dt.tz_convert(tz)

# 对齐到行情分钟线
news['ts_norm'] = news['publish_time'].apply(normalize_timestamp)
news = news.set_index('ts_norm').sort_index()
aligned = news['sentiment'].resample('1min').mean().reindex(price.index, method='ffill')
警告:若时间戳未统一到交易所时区,日内情绪因子会出现“未来函数”或“滞后一天”的假象,回测收益虚高。务必在因子构建前完成时间对齐审计。

四、标题与正文结构:情绪信号的分层提取

一条新闻的标题和正文承担不同功能。标题是高浓度情绪载体,正文是事实与语境补充。二者情绪可能一致,也可能冲突。例如标题写“某公司业绩大幅预增”,正文却提示“但低于市场预期”,此时标题情绪偏正,正文情绪偏负。

建议采用分层结构解析:

  1. 标题层:短文本,适合快速情绪打分,权重高、衰减快。
  2. 导语层:首段通常包含核心事实,适合抽取事件类型。
  3. 正文层:长文本,适合实体识别、关系抽取和细粒度情绪。
  4. 元数据层:来源、作者、板块、标签,用于加权和过滤。
金融新闻文本分层结构与情绪信号流 标题层 高浓度情绪 · 权重高 导语层 核心事实 · 事件类型 正文层 长文本 · 细粒度情绪 元数据层(来源/标签) 分层情绪聚合 标题0.5 + 导语0.3 + 正文0.2 按来源动态调权 情绪因子输出 分钟级情绪得分 来源加权 时间对齐行情 可回测 · 可复现

五、常见数据问题与复盘清单

以下是金融文本数据中最常见的六类问题,建议在因子构建前逐项排查:

  • 重复新闻:同一内容被多家媒体转载,导致情绪被重复计数。需做标题指纹去重。
  • 正文缺失:只有标题没有正文,或正文为“点击查看全文”。需标记并降权。
  • 编码乱码:GBK/UTF-8 混用导致中文乱码,影响分词和情绪识别。
  • HTML残留:正文中混入标签、广告、脚本,需清洗后再入模型。
  • 时间穿越:抓取时间晚于发布时间,但被误用为发布时间,造成未来函数。
  • 来源漂移:某来源改版后字段变化,导致解析静默失败,数据量骤降。
复盘建议:每次因子迭代前,先跑一遍“数据体检”:统计各来源条数、时间分布、正文长度分布、去重率、乱码率。数据体检通过,再谈模型优化。

总结来看,金融文本数据基础不是“脏活”,而是情绪因子的第一道风控。来源决定信号纯度,格式决定解析成本,时间戳决定因子有效性,结构决定提取粒度,质量问题决定因子稳定性。把这五件事做扎实,后续的模型和回测才有意义。