第二章:金融数据源分析——结构化与非结构化数据、财报/研报/新闻/公告的数据特征、数据质量评估
大家好,我是你们的老朋友。今天我们来聊聊金融RAG系统的地基——数据源。
说实话,很多做RAG的朋友一上来就调模型、搞向量库,结果上线后用户问个「茅台去年三季度净利润」,系统答非所问。为什么?因为数据源没吃透。金融数据跟普通文本不一样,它有自己的脾气。
2.1 结构化数据与非结构化数据:两个世界
金融数据可以粗暴地分成两类:结构化数据和非结构化数据。我个人的习惯是,先搞清楚数据长什么样,再决定怎么处理它。
2.4.1 结构化数据
说白了,就是能塞进Excel表格里的数据。比如股价、成交量、市盈率、财务报表里的数字。每一行是一个时间点或一只股票,每一列是一个指标。
- 特点:整齐、规范、容易计算。
- 常见来源:Wind、Bloomberg、Tushare、公司财报PDF里的表格。
- RAG中的用法:直接查询数据库,或者转成文本描述(比如「贵州茅台2023年营收1506亿」)。
我在项目中遇到过一个问题:从PDF里提取出来的表格,数字经常带逗号(比如1,506,000,000),或者有空单元格。如果不做清洗,RAG检索到的数字就是错的。嗯,这里要注意。
2.4.2 非结构化数据
这类数据就「野」了。财报全文、研报PDF、新闻快讯、公司公告——全是文字、图表、甚至扫描件。它们没有固定的行和列,全靠自然语言理解。
- 特点:信息密度高,但噪声也大。
- 常见来源:巨潮资讯网、东方财富、新浪财经、公司官网。
- RAG中的用法:切片、向量化、检索。
你想想看,一份50页的券商研报,可能只有3句话是真正有用的。怎么把金子从沙子里筛出来?这就是我们后面要讲的分块策略。
核心观点:金融RAG系统里,结构化数据负责「精确回答」,非结构化数据负责「深度分析」。两者缺一不可。
2.2 四大核心数据源的数据特征
金融领域最常见的四类数据源是:财报、研报、新闻、公告。它们各有各的「性格」。我一个个说。
2.2.1 财报数据
财报是金融分析的「硬通货」。资产负债表、利润表、现金流量表,每一行数字都代表真金白银。
- 结构性强:虽然财报是PDF格式,但内部有固定的表格结构。比如「营业收入」永远在利润表的第一行。
- 时间敏感:季报、半年报、年报,每个时间点的数据只对应当期。
- 精度要求高:小数点后两位都不能错。我曾经因为一个四舍五入的问题,导致RAG回答的净利润差了100万——用户差点投诉。
避坑指南:我曾经用OCR提取一份扫描版财报,结果把「1.2亿」识别成了「1.2亿」——看起来没错,但数字后面的单位「万元」被漏掉了。实际上那是1.2亿万元?不,是1.2亿。OCR对单位字符的识别率很低,一定要做后校验。
2.2.2 研报数据
券商研报是RAG系统里最「难搞」的数据。为什么?因为它是半结构化文本。
- 长文本:一份研报动辄30-50页,包含摘要、正文、图表、免责声明。
- 观点性强:研报里有大量主观判断,比如「我们看好新能源赛道」——这种句子对RAG来说很难量化。
- 图表混杂:很多关键数据藏在图表里,而不是文字里。比如一张柱状图显示「2024年预测营收增长20%」,但文字里可能根本没提。
我个人习惯的做法是:把研报的摘要和结论单独提取出来,作为高优先级片段。正文里的图表,用图表解析模型(比如Table Transformer)转成文字描述。
2.2.3 新闻数据
金融新闻是RAG系统里「时效性最强」的数据。比如「美联储加息25个基点」这种消息,5分钟内就会影响股价。
- 短文本:大部分新闻只有几百字,但信息密度极高。
- 噪声大:标题党、重复报道、广告夹杂其中。
- 情感色彩:新闻带有明显的正面或负面倾向。比如「暴雷」「暴跌」是负面,「突破」「新高」是正面。
避坑指南:我曾经把一条「某公司否认破产传闻」的新闻,因为切片时只截取了前半句「某公司破产传闻」,导致RAG回答「该公司已破产」。所以新闻切片时,一定要保证语义完整,最好以段落为单位。
2.2.4 公告数据
公司公告是「最官方」的数据源。比如股权变动、分红方案、重大合同。
- 格式规范:交易所对公告格式有严格要求,比如标题必须包含「公告编号」和「日期」。
- 法律效力:公告内容具有法律约束力,不能出错。
- 更新频率低:不像新闻那样每分钟都有,但每一条都很重要。
我建议把公告数据单独建一个索引,因为它的权威性远高于新闻和研报。当RAG同时检索到公告和新闻时,应该优先采用公告的内容。
小技巧:对于公告数据,可以提取「公告编号」作为元数据字段。这样用户问「关于XX公司的最近公告」,RAG可以直接按编号排序返回最新结果。
2.3 数据质量评估:别让垃圾数据毁了你的RAG
数据质量是RAG系统的生命线。我见过太多团队花80%的时间调模型,却只花20%的时间管数据。结果呢?模型再强,喂进去的是垃圾,吐出来的还是垃圾。
数据质量评估,我一般从四个维度入手:
| 维度 | 评估内容 | 常见问题 | 我的处理方式 |
|---|---|---|---|
| 完整性 | 数据是否有缺失? | 财报缺页、研报缺图表、新闻缺发布时间 | 用正则检查必填字段,缺失则标记为低质量 |
| 准确性 | 数据是否与原始来源一致? | OCR识别错误、数字单位错误、日期格式错误 | 交叉验证:同一数据从两个来源获取并比对 |
| 时效性 | 数据是否过时? | 用了去年的财报回答今年的问题 | 给每条数据打时间戳,检索时按时间排序 |
| 一致性 | 不同来源的数据是否矛盾? | Wind显示营收100亿,财报PDF显示101亿 | 以官方公告为准,其他来源做参考 |
举个例子。我在做某个基金公司的RAG项目时,发现他们提供的研报数据里,有30%的PDF是扫描件,OCR后数字错误率高达5%。这意味着每20个数字里就有一个是错的。后来我们加了一个「数字校验层」:把OCR提取的数字跟Wind数据库里的数字做比对,不一致的自动标记为「待人工审核」。
警告:千万不要盲目相信任何单一数据源。金融数据里,同一个指标在不同平台可能差几个百分点。我建议至少用两个独立来源做交叉验证。
2.4 知识体系总览:一张图看懂金融数据源
说了这么多,我画了一张图来总结。这张图展示了金融RAG系统中数据源的分类、特征以及质量评估的流程。你一看就明白。
这张图从左到右,从上到下,就是金融RAG数据处理的完整链路。先分结构化还是非结构化,再针对四大数据源做特征分析,最后用四个维度评估质量。每一步都不能省。
2.5 实战建议:从零搭建数据质量Pipeline
最后,我分享一个我在项目中实际用过的数据质量Pipeline。很简单,但很有效。
# 伪代码:金融数据质量检查Pipeline
def check_data_quality(data_source):
# 1. 完整性检查
if missing_fields(data_source) > 0.1: # 缺失率超过10%
mark_as_low_quality(data_source)
return
# 2. 准确性检查(交叉验证)
for record in data_source:
if abs(record.value - reference_db[record.id]) > 0.01:
flag_for_review(record)
# 3. 时效性检查
if data_source.timestamp < (now - 30 days):
deprioritize(data_source) # 降低检索优先级
# 4. 一致性检查
if has_contradiction(data_source, other_sources):
mark_as_conflicting(data_source)
# 通过所有检查,标记为高质量
mark_as_high_quality(data_source)
这段代码看起来简单,但我在实际项目中靠它过滤掉了40%的低质量数据。你想想看,如果这40%的垃圾数据进了RAG,系统得吐出多少错误答案?
我的经验:数据质量评估不是一次性工作。金融数据每天都在变,我建议每周跑一次全量检查,每天跑一次增量检查。尤其是财报季,数据更新频繁,更要盯紧。
好了,这一章的内容就到这里。数据源分析是RAG系统的「第一公里」,走稳了,后面就顺了。下一章我们会聊数据采集与清洗,到时候见。
公众号:蓝海资料掘金营,微信deep3321