4. 金融数据源分析:结构化、半结构化与非结构化数据的采集策略
金融知识图谱的构建质量,80% 取决于数据源的质量与采集策略。金融领域的数据源按结构化程度可分为三类:结构化数据(财报、交易记录)、半结构化数据(新闻 XML、HTML 页面)、非结构化数据(研报、公告 PDF、舆情文本)。本章将深入分析每类数据源的特征、采集难点与工程化策略。
4.1 结构化数据:财报与交易记录
结构化数据以关系型数据库表或 CSV/Parquet 文件形式存在,具有明确的 schema 和数据类型。在金融场景中,财报数据和交易记录是最核心的结构化数据源。
4.1.1 财报数据采集策略
财报数据通常来自交易所官方披露、金融数据终端(Wind、Bloomberg)或企业自建系统。采集策略需关注以下要点:
- 增量采集:财报按季度/年度发布,采用时间戳或版本号进行增量拉取,避免全量重复。
- 数据对齐:不同交易所的财报科目编码(如 IFRS、GAAP)需做标准化映射。
- 异常检测:对数值型字段做空值率、极值、环比波动检测,防止脏数据进入图谱。
| 数据维度 | 典型字段 | 采集频率 | 存储格式 |
|---|---|---|---|
| 资产负债表 | 总资产、总负债、股东权益 | 季度 | Parquet + Hive |
| 利润表 | 营业收入、净利润、每股收益 | 季度 | Parquet + Hive |
| 现金流量表 | 经营活动现金流、投资活动现金流 | 季度 | Parquet + Hive |
| 财务指标 | ROE、ROA、资产负债率、毛利率 | 季度 | Parquet + Hive |
4.1.2 交易记录采集策略
交易记录(股票逐笔成交、期货 tick 数据、银行流水)具有高吞吐、高时效、强顺序的特点。采集策略需满足批流一体架构:
- 流式采集:通过 Kafka 或 Pulsar 实时接入交易流水,延迟控制在秒级。
- 批量回填:历史数据通过 Spark/Flink 批量读取 HDFS 或 S3 上的历史快照。
- 去重与排序:交易记录可能因网络重传产生重复,需在采集层做幂等去重和时序排序。
4.2 半结构化数据:新闻 XML 与 HTML 页面
半结构化数据具有自描述标签,但 schema 不固定。金融新闻 XML、财经网站 HTML、API 返回的 JSON 均属此类。采集策略需兼顾解析灵活性与吞吐量。
4.2.1 新闻 XML 采集与解析
金融新闻通常通过 RSS Feed、交易所公告 XML 接口或第三方数据商(如 Reuters、Bloomberg)提供。典型 XML 结构如下:
<news>
<headline>某公司发布2024年第三季度财报</headline>
<pubDate>2024-10-30T09:30:00Z</pubDate>
<category>财报</category>
<content>某公司今日发布财报,营收同比增长15%...</content>
<ticker>600036.SH</ticker>
</news>
采集策略:
- XPath/正则提取:对固定结构的 XML 使用 XPath 提取标题、时间、正文、股票代码。
- 流式解析:使用 SAX 或 StAX 解析器逐行读取,避免 DOM 加载大文件导致 OOM。
- 字段标准化:将日期统一为 UTC 时间戳,股票代码映射为统一标识(如 ISIN)。
4.2.2 财经网页 HTML 采集
财经网站(如东方财富、雪球、Yahoo Finance)的 HTML 页面结构频繁变动,采集策略需具备弹性:
- CSS 选择器 + 正则:使用 Jsoup(Java)或 BeautifulSoup(Python)提取结构化片段。
- 模板化配置:将页面解析规则外置为 JSON 配置文件,页面改版时只需更新配置。
- 反爬策略应对:设置随机 User-Agent、IP 代理池、请求间隔控制。
4.3 非结构化数据:研报与公告 PDF
非结构化数据是金融知识图谱中信息密度最高的数据源,但也是采集与处理难度最大的。券商研报、上市公司公告、监管文件多以 PDF 格式发布,内含表格、图表、公式等复杂元素。
4.3.1 PDF 文本提取策略
PDF 解析需根据文档类型选择不同工具链:
| PDF 类型 | 推荐工具 | 适用场景 | 注意事项 |
|---|---|---|---|
| 文本型 PDF | PyMuPDF (fitz)、PDFBox | 纯文字研报、公告正文 | 保留段落结构,注意编码 |
| 扫描型 PDF | Tesseract OCR + 图像预处理 | 盖章扫描件、老旧公告 | 需做倾斜校正、二值化 |
| 表格密集型 PDF | Camelot、Tabula、pdfplumber | 财务附表、数据明细 | 需指定表格区域或使用 Lattice 模式 |
| 混合型 PDF | Unstructured.io、LlamaParse | 图文混排、含图表标注 | 支持多模态输出 |
4.3.2 研报与公告的采集流水线
非结构化数据的采集通常需要构建一条完整的 ETL 流水线:
- 源端抓取:通过爬虫或 API 从交易所官网、券商平台下载 PDF 文件。
- 格式转换:将 PDF 转换为纯文本或 Markdown,保留标题层级和列表结构。
- 实体抽取:使用正则或 NLP 模型提取股票代码、公司名称、财务数字、日期等关键实体。
- 结构化存储:将抽取结果写入 Elasticsearch 用于全文检索,同时写入图数据库用于知识关联。
4.4 三类数据源的采集架构总览
下图展示了金融知识图谱批流一体架构下,三类数据源的采集路径与处理流程:
4.5 采集策略对比与选型建议
针对三类数据源,下表总结了采集策略的关键差异与选型建议:
| 对比维度 | 结构化数据 | 半结构化数据 | 非结构化数据 |
|---|---|---|---|
| 数据量级 | GB ~ TB 级 | TB ~ PB 级 | TB 级(文本为主) |
| 采集延迟要求 | 秒级 ~ 分钟级 | 秒级(实时新闻) | 分钟级 ~ 小时级 |
| 解析复杂度 | 低(schema 固定) | 中(需处理标签嵌套) | 高(OCR、表格还原) |
| 数据质量风险 | 空值、异常值 | 标签缺失、编码错误 | 文字错位、表格断裂 |
| 推荐采集工具 | Debezium + Kafka Connect | Scrapy + Jsoup / Playwright | PyMuPDF + Camelot + Tesseract |
| 存储前处理 | 字段映射 + 类型校验 | JSON 扁平化 + 字段标准化 | 实体抽取 + 段落分割 |
4.6 采集策略的工程化落地要点
在实际项目中,三类数据源的采集往往需要统一调度与监控。以下是工程化落地的关键建议:
- 统一元数据管理:使用 Apache Atlas 或自建元数据中心,记录每个数据源的 schema、采集频率、数据质量规则。
- 采集任务编排:使用 Airflow 或 DolphinScheduler 编排采集 DAG,支持依赖触发(如财报发布后自动触发解析任务)。
- 数据质量监控:对每批采集数据做完整性、准确性、时效性校验,异常数据进入死信队列(DLQ)人工处理。
- 增量与全量协同:历史数据全量拉取后,日常运行增量采集;定期(如每月)做一次全量对账,修正遗漏或错误。