金融数据特征:公告、研报、新闻、行情
做金融RAG系统,第一关就是数据。我刚开始接触这个领域时,以为跟做通用问答差不多——扔一堆文档进去,调个embedding模型就完事了。结果呢?被现实狠狠教育了一顿。
金融数据跟普通文本数据完全是两码事。它的类型多、时效性强、质量参差不齐,还带着合规的紧箍咒。今天咱们就掰开揉碎,聊聊这些特征到底意味着什么。
数据类型:公告、研报、新闻、行情
金融数据大概能分成四类。每一类的脾气都不一样。
1. 公告
公告是上市公司发的官方文件。比如年报、季报、重大资产重组公告、分红方案等等。这类数据的特点是:权威、结构化、但格式混乱。
我遇到过最头疼的事——同一家公司的两份公告,PDF排版完全不同。有的用表格,有的用纯文本,有的甚至扫描件。你想想看,RAG系统要从中提取关键信息,光解析这一步就够喝一壶的。
2. 研报
研报是券商分析师写的。说白了,就是“专家观点”。这类数据主观性强,但信息密度高。一份研报里,可能有行业趋势、公司估值、财务预测、风险提示等等。
我个人习惯把研报当作“知识增强”的来源。比如用户问“新能源车怎么看”,RAG系统可以从研报里找到分析师的最新观点,再结合行情数据给出答案。
但要注意——研报有“时效性”。去年看好的股票,今年可能就凉了。所以RAG系统必须能区分“旧研报”和“新研报”。
3. 新闻
新闻是实时性最强的。股价波动,往往就是一条新闻引发的。比如“某公司董事长被调查”,消息一出,股价可能直接跌停。
做RAG系统时,新闻数据要跟行情数据联动。我记得有一次,系统抓取了一条“利好”新闻,但没注意到新闻发布时间是收盘后。结果用户问“今天为什么涨”,系统回答“因为出了利好”,其实利好是收盘后才出的,跟当天涨跌没关系。嗯,这就是典型的“时序错位”。
4. 行情
行情数据是数字化的——开盘价、收盘价、成交量、涨跌幅等等。这类数据最干净,也最容易处理。但它的特点是:高频、海量、需要实时计算。
RAG系统一般不直接处理原始行情,而是把行情加工成“指标”。比如“过去5日涨幅”、“成交量异常放大”等等。这些指标可以作为上下文,辅助回答用户的问题。
| 数据类型 | 特点 | RAG中的用途 |
|---|---|---|
| 公告 | 权威、结构化、格式乱 | 事实查询、合规检查 |
| 研报 | 主观、信息密度高 | 观点增强、趋势分析 |
| 新闻 | 实时、影响大 | 事件驱动、情绪分析 |
| 行情 | 高频、数字化 | 指标计算、量化分析 |
数据时效性要求
金融数据最怕“过期”。你想想看,用户问“今天茅台股价多少”,你给他返回昨天的数据,这系统还能用吗?
不同数据的时效性要求不一样:
- 行情数据:秒级甚至毫秒级。延迟超过1秒,交易策略就失效了。
- 新闻数据:分钟级。重大新闻出来,几分钟内就要被RAG系统索引。
- 公告数据:小时级。交易所发布后,一般有半小时到一小时的缓冲期。
- 研报数据:天级。研报发布后,当天内更新即可。
我曾经踩过一个坑——系统里存了半年前的研报,用户问“某公司估值如何”,系统直接引用了半年前的研报,给出了一个完全过时的估值。从那以后,我强制要求RAG系统给每个文档打上“时间戳”,检索时按时间排序,优先返回最新的。
数据质量挑战
金融数据质量,说白了就是“脏”。我见过的问题包括:
- 缺失值:某天的行情数据没采集到,或者公告里漏了关键数字。
- 重复数据:同一个新闻被多家媒体转载,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系统不能直接复制全文,只能做摘要或引用。
我个人习惯的做法是:在数据入库前,加一个“合规过滤器”。比如:
def compliance_check(document):
# 检查是否包含未公开信息
if document['status'] == '未公开':
return False
# 检查是否包含个人隐私
if re.search(r'身份证|手机号|银行卡', document['text']):
return False
return True
当然,实际项目里合规检查要复杂得多。但核心思路是一样的——宁缺毋滥。不合规的数据,宁可不要,也不能用。
知识体系总览
说了这么多,咱们用一张图来总结一下金融数据的核心特征:
这张图把咱们刚才聊的内容串起来了。你看,金融数据特征不是孤立的知识点,而是一个环环相扣的系统。数据类型决定了你怎么处理,时效性决定了你怎么更新,质量挑战决定了你怎么清洗,合规隐私决定了你怎么使用。
做RAG系统,说白了就是跟这些特征斗智斗勇。你越了解它们,系统就越靠谱。