金融数据源分析:结构化、半结构化与非结构化数据

做知识图谱,第一步就是跟数据打交道。我常说一句话:数据源的质量,直接决定了图谱的天花板。你算法再牛,喂进去的是垃圾,吐出来的还是垃圾。

金融领域的数据源,说白了就三大类:结构化数据、半结构化数据、非结构化数据。咱们一个一个拆开聊。

一、结构化数据:数据库表里的金矿

结构化数据,就是那种规规矩矩躺在关系型数据库里的表格。行是记录,列是字段,每个字段都有明确的类型和含义。

我个人习惯把金融结构化数据分成两类:

  • 交易类数据:股票行情、期货报价、债券成交记录。这类数据量大、频率高,通常按天甚至按毫秒更新。
  • 参考类数据:公司基本信息、股东信息、行业分类。这类数据相对稳定,变更不频繁。

举个例子,一张典型的股票日行情表长这样:

CREATE TABLE stock_daily (
    trade_date DATE,
    stock_code VARCHAR(10),
    open_price DECIMAL(10,4),
    close_price DECIMAL(10,4),
    high_price DECIMAL(10,4),
    low_price DECIMAL(10,4),
    volume BIGINT,
    amount DECIMAL(20,4)
);

嗯,这里要注意:结构化数据虽然规整,但坑也不少。我在项目中遇到过最典型的问题——数据缺失。比如某天停牌,行情表里直接少了一行。你如果直接拿来做关联分析,时间序列就断了。

我的经验:处理结构化数据时,一定要先做完整性检查。我习惯用SQL的窗口函数,比如 LAG()LEAD() 来检测缺失的时间点。

二、半结构化数据:JSON/XML里的弹性世界

半结构化数据,说白了就是有结构但结构不固定。金融领域最常见的两种格式:JSON 和 XML。

为什么金融系统喜欢用 JSON?你想想看,一个金融产品的属性可能多达上百个,而且不同产品差异巨大。用关系型数据库存,要么搞几百个字段(大部分是空的),要么搞 EAV 模型(查询性能极差)。JSON 就完美解决了这个问题。

举个例子,一个基金产品的 JSON 数据:

{
  "fund_code": "000001",
  "fund_name": "XX混合型基金",
  "fund_type": "混合型",
  "manager": {
    "name": "张三",
    "experience_years": 12,
    "managed_funds": ["000001", "000002"]
  },
  "holdings": [
    {"stock_code": "600519", "weight": 0.15},
    {"stock_code": "000858", "weight": 0.12}
  ],
  "risk_level": "R3"
}

看到没?manager 是个嵌套对象,holdings 是个数组。这种结构在关系型数据库里处理起来很麻烦,但在 JSON 里天然就是树形结构。

避坑指南:我曾经在处理一批基金公告的JSON数据时,发现同一个字段在不同记录里类型不一致。有的 risk_level 是字符串 "R3",有的却是数字 3。这种问题在数据清洗阶段就要处理掉,否则后面解析会直接报错。

XML 在金融领域也有应用,主要是老一代的金融数据交换标准,比如 FIX 协议、SWIFT 报文。虽然现在 JSON 越来越流行,但很多核心系统还在跑 XML。

三、非结构化数据:研报、新闻、公告里的隐藏价值

这才是金融知识图谱最难啃的骨头,也是价值最大的部分。非结构化数据包括:

  • 券商研报:分析师写的深度报告,包含行业分析、公司估值、盈利预测
  • 财经新闻:实时资讯、政策解读、市场评论
  • 公司公告:年报、季报、重大事项公告、董事会决议
  • 社交媒体:股吧评论、微博大V观点(这个水很深)

这些数据有什么特点?说白了就是信息密度高,但噪音也大。一篇研报可能几万字,真正有用的实体和关系可能就几十个。

我举个例子,一段典型的公司公告文本:

"2024年3月15日,XX科技股份有限公司(证券代码:300999)发布公告称,公司拟以自有资金1.5亿元收购YY信息技术有限公司100%股权。本次交易不构成关联交易,不构成重大资产重组。"

从这段文字里,我们能提取出什么?

  • 实体:XX科技(公司)、300999(股票代码)、YY信息(公司)、1.5亿元(金额)
  • 关系:收购(XX科技 → YY信息)、金额(1.5亿元)、时间(2024-03-15)
  • 属性:不构成关联交易、不构成重大资产重组

这些信息,就是知识图谱的原材料。

核心观点:非结构化数据的处理,本质上是把自然语言转化为结构化知识。这个过程需要NLP技术,但更重要的是对金融业务的理解。你如果不懂"关联交易"是什么意思,就提取不出这个关系。

四、三类数据的融合策略

做知识图谱,不是只用一类数据。我习惯的做法是以结构化数据为骨架,以非结构化数据为血肉

具体来说:

  1. 先用结构化数据构建基础实体:从数据库里拉出公司、股票、基金、人员等核心实体,建立它们之间的基础关系(比如持股、任职、交易)
  2. 再用半结构化数据补充属性:从JSON/XML里提取产品的详细属性、风险指标、持仓信息
  3. 最后用非结构化数据挖掘深层关系:从研报里提取分析师观点、从新闻里提取事件、从公告里提取重大事项

这样做的好处是什么?你想想看,如果只靠结构化数据,你只能知道"张三持有100股茅台"。但结合非结构化数据,你还能知道"张三在2024年3月增持了茅台,原因是看好白酒行业复苏"。后者才是真正有价值的知识。

下面这张图展示了我常用的数据融合流程:

金融知识图谱数据融合流程 结构化数据 数据库表(行情/交易/参考) 半结构化数据 JSON/XML(产品/报文) 非结构化数据 研报/新闻/公告 数据清洗 & 标准化 缺失值处理 | 类型统一 | 实体对齐 | 去重 知识融合 & 实体链接 跨源实体匹配 | 关系合并 | 属性补全 金融知识图谱
一个小技巧:在做实体链接时,我习惯用"股票代码"作为核心标识符。因为代码是唯一的、稳定的,不像公司名称会变更(比如"中国平安"和"平安银行"容易混淆)。先把代码对齐了,其他属性再慢慢补。

五、数据源选择的优先级

最后说说我的个人经验。面对海量数据源,怎么选?

优先级 数据源类型 推荐理由 典型应用
P0 交易所行情数据 权威、实时、结构化 价格走势、交易关系
P1 上市公司公告 法律效力、信息准确 重大事件、股权变更
P2 券商研报 深度分析、前瞻性强 行业趋势、公司评级
P3 财经新闻 时效性强、覆盖面广 热点事件、政策解读
P4 社交媒体 情绪指标、舆情监控 市场情绪、风险预警

嗯,这里要提醒一句:优先级不是死的。如果你做的是量化策略,P0的行情数据最重要;如果你做的是风控系统,P1的公告数据才是核心。说白了,数据源的选择要服务于业务场景。

我曾经接手过一个项目,客户要求把所有数据源都接入,结果光数据清洗就花了三个月,图谱还没建起来。后来我建议他们先聚焦公告和行情数据,两周就出了第一个版本。所以我的建议是:先做小,再做全

专注资料整理