金融数据特征:公告、研报、新闻、行情

做金融RAG系统,第一关就是数据。我刚开始接触这个领域时,以为跟做通用问答差不多——扔一堆文档进去,调个embedding模型就完事了。结果呢?被现实狠狠教育了一顿。

金融数据跟普通文本数据完全是两码事。它的类型多、时效性强、质量参差不齐,还带着合规的紧箍咒。今天咱们就掰开揉碎,聊聊这些特征到底意味着什么。

数据类型:公告、研报、新闻、行情

金融数据大概能分成四类。每一类的脾气都不一样。

1. 公告

公告是上市公司发的官方文件。比如年报、季报、重大资产重组公告、分红方案等等。这类数据的特点是:权威、结构化、但格式混乱

我遇到过最头疼的事——同一家公司的两份公告,PDF排版完全不同。有的用表格,有的用纯文本,有的甚至扫描件。你想想看,RAG系统要从中提取关键信息,光解析这一步就够喝一壶的。

关键点:公告是“硬数据”,必须保证100%准确。错一个字,可能就是几百万的损失。

2. 研报

研报是券商分析师写的。说白了,就是“专家观点”。这类数据主观性强,但信息密度高。一份研报里,可能有行业趋势、公司估值、财务预测、风险提示等等。

我个人习惯把研报当作“知识增强”的来源。比如用户问“新能源车怎么看”,RAG系统可以从研报里找到分析师的最新观点,再结合行情数据给出答案。

但要注意——研报有“时效性”。去年看好的股票,今年可能就凉了。所以RAG系统必须能区分“旧研报”和“新研报”。

3. 新闻

新闻是实时性最强的。股价波动,往往就是一条新闻引发的。比如“某公司董事长被调查”,消息一出,股价可能直接跌停。

做RAG系统时,新闻数据要跟行情数据联动。我记得有一次,系统抓取了一条“利好”新闻,但没注意到新闻发布时间是收盘后。结果用户问“今天为什么涨”,系统回答“因为出了利好”,其实利好是收盘后才出的,跟当天涨跌没关系。嗯,这就是典型的“时序错位”。

4. 行情

行情数据是数字化的——开盘价、收盘价、成交量、涨跌幅等等。这类数据最干净,也最容易处理。但它的特点是:高频、海量、需要实时计算

RAG系统一般不直接处理原始行情,而是把行情加工成“指标”。比如“过去5日涨幅”、“成交量异常放大”等等。这些指标可以作为上下文,辅助回答用户的问题。

数据类型 特点 RAG中的用途
公告 权威、结构化、格式乱 事实查询、合规检查
研报 主观、信息密度高 观点增强、趋势分析
新闻 实时、影响大 事件驱动、情绪分析
行情 高频、数字化 指标计算、量化分析

数据时效性要求

金融数据最怕“过期”。你想想看,用户问“今天茅台股价多少”,你给他返回昨天的数据,这系统还能用吗?

不同数据的时效性要求不一样:

  • 行情数据:秒级甚至毫秒级。延迟超过1秒,交易策略就失效了。
  • 新闻数据:分钟级。重大新闻出来,几分钟内就要被RAG系统索引。
  • 公告数据:小时级。交易所发布后,一般有半小时到一小时的缓冲期。
  • 研报数据:天级。研报发布后,当天内更新即可。

我曾经踩过一个坑——系统里存了半年前的研报,用户问“某公司估值如何”,系统直接引用了半年前的研报,给出了一个完全过时的估值。从那以后,我强制要求RAG系统给每个文档打上“时间戳”,检索时按时间排序,优先返回最新的。

小技巧:在embedding向量里加入时间特征。比如把时间戳编码成向量的一部分,这样检索时就能自动区分新旧文档。

数据质量挑战

金融数据质量,说白了就是“脏”。我见过的问题包括:

  • 缺失值:某天的行情数据没采集到,或者公告里漏了关键数字。
  • 重复数据:同一个新闻被多家媒体转载,RAG系统可能索引了10份一模一样的。
  • 错误数据:比如“营收100亿”写成了“营收100万”,差一个数量级。
  • 格式不统一:有的日期是“2024-01-01”,有的是“2024年1月1日”,还有的是“01/01/2024”。

怎么处理?我的经验是:清洗比检索更重要。数据不干净,再好的RAG系统也是垃圾进垃圾出。

举个例子,我做过一个公告解析模块:

def clean_financial_text(text):
    # 去除乱码
    text = re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f]', '', text)
    # 统一日期格式
    text = re.sub(r'(\d{4})年(\d{1,2})月(\d{1,2})日', r'\1-\2-\3', text)
    # 去除重复段落
    lines = text.split('\n')
    unique_lines = list(dict.fromkeys(lines))
    return '\n'.join(unique_lines)

这段代码看着简单,但实际项目中,清洗规则可能有上百条。每一条规则,都是踩坑踩出来的。

合规与隐私考量

金融数据合规,是个大话题。我简单说几个关键点:

  • 内幕信息:未公开的公告、财报,绝对不能提前泄露。RAG系统必须能区分“已公开”和“未公开”。
  • 个人隐私:有些金融数据里包含个人身份信息,比如交易记录、持仓信息。这些数据必须脱敏。
  • 版权问题:研报、新闻是有版权的。RAG系统不能直接复制全文,只能做摘要或引用。
警告:合规不是技术问题,是法律问题。我曾经见过一个团队,因为RAG系统泄露了未公开的财报数据,被证监会罚款。所以,合规检查必须嵌入到RAG系统的每个环节。

我个人习惯的做法是:在数据入库前,加一个“合规过滤器”。比如:

def compliance_check(document):
    # 检查是否包含未公开信息
    if document['status'] == '未公开':
        return False
    # 检查是否包含个人隐私
    if re.search(r'身份证|手机号|银行卡', document['text']):
        return False
    return True

当然,实际项目里合规检查要复杂得多。但核心思路是一样的——宁缺毋滥。不合规的数据,宁可不要,也不能用。

知识体系总览

说了这么多,咱们用一张图来总结一下金融数据的核心特征:

金融数据特征知识体系 金融数据特征 数据类型 时效性要求 数据质量挑战 合规与隐私 公告 研报 新闻 行情 秒级(行情) 分钟级(新闻) 小时级(公告) 天级(研报) 缺失值 重复数据 错误数据 格式不统一 内幕信息 个人隐私 版权问题 核心原则 清洗比检索更重要 | 宁缺毋滥 | 时序优先

这张图把咱们刚才聊的内容串起来了。你看,金融数据特征不是孤立的知识点,而是一个环环相扣的系统。数据类型决定了你怎么处理,时效性决定了你怎么更新,质量挑战决定了你怎么清洗,合规隐私决定了你怎么使用。

做RAG系统,说白了就是跟这些特征斗智斗勇。你越了解它们,系统就越靠谱。

一句话总结:金融RAG系统的数据层,80%的精力花在数据治理上,20%才轮到检索和生成。别搞反了。

专注资料整理