2. 金融数据模型设计:实体与关系定义、属性建模、事件与状态区分、时序数据建模要点
金融知识图谱的核心竞争力在于对复杂金融世界的精确抽象。数据模型设计直接决定了链路延迟、查询效率与推理能力。本章从实体与关系定义、属性建模、事件与状态区分、时序数据建模四个维度,构建一套适用于低延迟场景的金融数据模型范式。
2.1 实体与关系定义
金融领域的实体具有强监管、多身份、高动态特征。实体定义需遵循“唯一标识 + 类型分层 + 生命周期”原则。
2.1.1 核心实体类型
| 实体大类 | 典型实体 | 唯一标识策略 | 低延迟关注点 |
|---|---|---|---|
| 机构 | 银行、券商、基金、保险、交易所 | LEI + 内部统一编码 | 机构层级扁平化,避免递归查询 |
| 产品 | 股票、债券、衍生品、基金、理财产品 | ISIN / CUSIP + 产品类型前缀 | 产品属性预聚合,减少运行时计算 |
| 人员 | 高管、交易员、分析师、实控人 | 身份证哈希 + 角色标签 | 身份图谱预索引,支持毫秒级穿透 |
| 账户 | 交易账户、托管账户、资金账户 | 账户号 + 账户类型 | 账户与产品/机构关系固化,避免动态关联 |
| 事件 | 公告、交易、分红、违约、评级调整 | 事件ID + 时间戳 + 事件类型 | 事件作为独立节点,支持时序剪枝 |
2.1.2 关系类型与方向
关系定义采用“主语-谓语-宾语”三元组范式,谓语需标准化为有限集合。低延迟场景下,关系应具备以下特征:
- 有向性:所有关系默认有向,反向关系通过预定义逆关系实现。
- 类型化:关系类型不超过50种,避免语义过载。
- 权重化:关键关系携带置信度或强度权重,支持图算法快速剪枝。
低延迟设计原则: 关系存储采用邻接表 + 属性列存,避免图遍历时的随机IO。高频关系(如“持有”、“交易”)单独建立索引分区。
实战案例: 某券商图谱将“实际控制人”关系从递归查询改为直接存储最终控制人,查询延迟从120ms降至3ms。
2.2 属性建模
属性是实体的静态特征,但在金融场景中,属性具有高频更新、多源异构、时效敏感等特点。属性建模需区分“基础属性”与“动态属性”。
2.2.1 属性分层策略
| 属性层级 | 定义 | 存储方式 | 更新频率 | 低延迟要求 |
|---|---|---|---|---|
| L1 基础属性 | 实体唯一标识、名称、类型、创建时间 | 行存 + 主键索引 | 极少变更 | 毫秒级点查 |
| L2 业务属性 | 注册资本、注册地址、行业分类、法人 | 列存 + 二级索引 | 月度/季度 | 支持批量更新 |
| L3 动态属性 | 评级、风险等级、持仓市值、流动性指标 | 时序列存 + TTL | 日频/实时 | 写入吞吐 > 10万/s |
| L4 衍生属性 | 关联交易金额、集中度指标、异常评分 | 物化视图 / 预计算 | 按需刷新 | 查询时零计算 |
2.2.2 属性版本控制
金融属性具有强回溯需求。采用“属性快照链”模式:
// 属性版本节点结构
{
"entity_id": "ORG_20240301_001",
"attribute": "credit_rating",
"value": "AAA",
"effective_time": 1709251200,
"expire_time": 1711929600,
"source": "S&P_20240301",
"version": 12
}
避坑提示: 不要将所有属性版本存储在同一个属性字段中。高频更新的属性(如股价、汇率)应独立为时序节点,避免属性表膨胀导致查询退化。
2.3 事件与状态区分
金融知识图谱中,“事件”与“状态”是两种本质不同的数据形态。混淆二者会导致模型混乱、查询延迟飙升。
2.3.1 核心区别
| 维度 | 事件 (Event) | 状态 (State) |
|---|---|---|
| 本质 | 发生在某个时间点的动作或事实 | 实体在某个时间段的持续特征 |
| 时间特征 | 点时间,不可变 | 时间段,可变更 |
| 存储模型 | 事件节点 + 时间戳 | 属性快照 / 时序序列 |
| 查询模式 | 时间范围扫描 + 事件类型过滤 | 时间点快照查询 / 趋势分析 |
| 典型例子 | “2024-03-01 公司A 发布年报” | “2024年3月 公司A 信用评级为AAA” |
| 低延迟策略 | 事件分区 + 预聚合索引 | 状态缓存 + 预计算快照 |
2.3.2 事件驱动状态更新
事件是状态变更的触发器。设计“事件→状态”映射规则,避免状态计算在查询时实时推导:
- 事件入图:事件节点写入后,触发异步规则引擎。
- 规则匹配:根据事件类型、实体ID、时间窗口匹配预定义规则。
- 状态更新:规则引擎计算新状态,写入状态快照表。
- 缓存失效:通知缓存层更新对应实体的状态缓存。
性能指标: 事件入图到状态更新完成,端到端延迟控制在50ms以内(P99)。采用事件流处理框架(如Kafka Streams)实现状态增量更新。
2.4 时序数据建模要点
金融知识图谱中,时序数据占比超过70%。时序建模质量直接决定链路延迟与存储成本。
2.4.1 时序数据分类
| 时序类型 | 数据特征 | 采样频率 | 存储策略 | 查询场景 |
|---|---|---|---|---|
| 高频行情 | 毫秒级Tick,数据量大 | 1ms - 1s | 列存 + 压缩 + 分区 | 实时行情、回放 |
| 中频交易 | 逐笔成交、订单簿 | 1s - 1min | 时序数据库 + 预聚合 | 交易分析、风控 |
| 低频指标 | 财务数据、评级、宏观指标 | 日/周/月 | 关系属性 + 快照 | 基本面分析、归因 |
| 事件序列 | 公告、新闻、舆情 | 分钟级 | 事件节点 + 时间索引 | 事件驱动分析 |
2.4.2 时序建模核心要点
- 时间分区:按时间范围分区存储,高频数据按天/小时分区,低频数据按月分区。查询时自动剪枝无关分区。
- 降采样策略:预计算1min、5min、1h、1d的聚合数据,满足90%的查询需求,避免实时扫描原始数据。
- 时序索引:采用“时间戳 + 实体ID”复合索引,支持毫秒级时间范围查询。
- 数据保留策略:原始高频数据保留7天,聚合数据保留1年,低频指标保留10年。过期数据自动归档至冷存储。
- 时序对齐:不同频率的时序数据在查询时自动对齐到统一时间轴,避免时间窗口不匹配导致的错误。
实战案例: 某量化基金图谱将行情数据按“日期+股票代码”分区,配合预计算日频指标,查询延迟从800ms降至15ms,存储成本降低60%。
2.5 数据模型整体架构
下图展示金融知识图谱数据模型的整体架构,涵盖实体、关系、属性、事件、状态、时序数据的组织方式:
2.6 低延迟链路数据流
下图展示数据从采集到查询的完整链路,突出低延迟设计的关键节点:
2.7 本章小结
- 实体与关系:采用“唯一标识 + 类型分层”策略,关系标准化为有限集合,支持有向权重化存储。
- 属性建模:四层属性分层(L1-L4),动态属性独立为时序节点,属性版本控制支持回溯。
- 事件与状态:事件是点时间不可变事实,状态是时间段持续特征。事件驱动状态更新,避免查询时实时计算。
- 时序数据:按频率分类存储,预计算降采样数据,时间分区 + 复合索引保障低延迟查询。