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 上的历史快照。
  • 去重与排序:交易记录可能因网络重传产生重复,需在采集层做幂等去重和时序排序。
实践要点: 交易记录采集建议使用 Debezium + Kafka Connect 捕获数据库变更日志(CDC),既能保证实时性,又能通过 Kafka 的 offset 机制实现精确一次语义。

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 代理池、请求间隔控制。
推荐方案: 对于高频变动的财经页面,优先使用 Puppeteer/Playwright 无头浏览器渲染后提取,避免因 JavaScript 动态加载导致数据缺失。

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 流水线:

  1. 源端抓取:通过爬虫或 API 从交易所官网、券商平台下载 PDF 文件。
  2. 格式转换:将 PDF 转换为纯文本或 Markdown,保留标题层级和列表结构。
  3. 实体抽取:使用正则或 NLP 模型提取股票代码、公司名称、财务数字、日期等关键实体。
  4. 结构化存储:将抽取结果写入 Elasticsearch 用于全文检索,同时写入图数据库用于知识关联。
常见陷阱: PDF 中的表格可能被解析为散乱文本行,导致数字错位。建议对财务附表使用 Camelot Lattice 模式 进行表格还原,并做列对齐校验。

4.4 三类数据源的采集架构总览

下图展示了金融知识图谱批流一体架构下,三类数据源的采集路径与处理流程:

金融数据源采集架构图 金融数据源采集架构总览 结构化数据 财报 · 交易记录 · 行情 半结构化数据 新闻 XML · HTML · JSON 非结构化数据 研报 PDF · 公告 · 舆情 JDBC / Kafka Connect CDC · 批量拉取 爬虫 / API 网关 XPath · 无头浏览器 PDF 解析引擎 OCR · Camelot · Unstructured 统一消息总线(Kafka / Pulsar) Topic: raw-finance-data · 分区键: stock_code 批流处理层(Flink / Spark Streaming) 实时清洗 · 实体链接 · 特征计算 知识图谱存储(Neo4j / JanusGraph + ES)

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)人工处理。
  • 增量与全量协同:历史数据全量拉取后,日常运行增量采集;定期(如每月)做一次全量对账,修正遗漏或错误。
批流一体最佳实践: 将采集层统一接入 Kafka,实时流使用 Flink SQL 做轻量清洗,批量历史数据使用 Spark 做复杂 ETL。两者共享同一套数据质量规则和实体链接模型,确保图谱数据的一致性。