4. 金融场景建模
在金融GNN项目中,模型效果的上限往往不由网络结构决定,而由“图建得对不对”决定。银行交易、信贷关系、供应链和股权网络是四类最常见的金融数据源,它们天然具备实体与关系的结构,但原始形态通常是流水表、合同表、工商登记表或ERP单据。本节的核心任务,是建立一套可复用的建模方法,把这四类异构数据统一转化为“节点—边—特征—标签”的图数据,为后续节点分类与关系预测提供干净输入。
一、核心原理:金融实体与关系的抽象规则
图建模的本质是回答三个问题:谁是节点、什么是边、边上和点上带什么信息。金融场景中,节点通常对应企业、个人、银行账户、产品、行业或地区;边则对应资金流、授信、担保、供货、持股等关系。与社交网络不同,金融边往往带有方向、金额、时间、利率、账期等属性,因此更适合建模为属性有向多重图。
一个关键原则是:节点粒度决定任务粒度。若做企业风险分类,节点应为企业;若做账户欺诈识别,节点应为账户;若做集团客户关系预测,节点可为企业并允许同一对节点间存在多条不同类型的边。另一个原则是时间切片:金融关系具有强时效性,交易边和信贷边应保留时间戳,必要时按月度或季度切片构建动态图。
二、方法流程:四类数据源的转化路径
下面给出从原始表到图数据的通用流程,并用一张结构图展示四类数据源如何汇入统一图模式。
具体转化步骤可归纳为以下清单:
- 实体对齐:用统一社会信用代码、账号、身份证号做去重与映射,解决同一企业在不同表中名称不一致的问题。
- 边表构建:每条关系记录生成一行边表,字段包括 src_id、dst_id、edge_type、timestamp、amount、weight。
- 节点特征:数值型做分箱或标准化,类别型做嵌入,文本型可提取关键词或使用预训练向量。
- 标签对齐:将风险等级、违约标识、欺诈标签挂到对应节点或边上,注意标签泄漏与时间穿越。
- 图划分:按时间或企业划分训练/验证/测试集,避免同一集团同时出现在训练和测试中。
三、案例场景:从流水表到可训练图
假设我们有一张银行交易流水表,字段为付款账号、收款账号、金额、交易时间、交易类型。转化为图数据的代码如下:
import pandas as pd
import torch
from torch_geometric.data import Data
df = pd.read_csv("bank_transfer.csv")
# 账户ID映射为连续整数
accounts = pd.concat([df["payer"], df["payee"]]).unique()
id_map = {acc: i for i, acc in enumerate(accounts)}
edge_index = torch.tensor([
[id_map[p] for p in df["payer"]],
[id_map[q] for q in df["payee"]]
], dtype=torch.long)
edge_attr = torch.tensor(df[["amount", "hour"]].values, dtype=torch.float)
x = torch.eye(len(accounts)) # 初始节点特征,后续可替换为业务特征
data = Data(x=x, edge_index=edge_index, edge_attr=edge_attr)
print(data)
# Data(x=[1280, 1280], edge_index=[2, 5400], edge_attr=[5400, 2])
对于信贷关系,边可定义为“授信”“担保”“逾期”,方向从银行指向企业或企业指向企业;供应链边可定义为“供货”,带账期与金额;股权网络边为“持股”,带持股比例。四类边可共存于同一张异构图,用 edge_type 区分。
| 数据源 | 节点 | 边类型 | 关键边属性 | 典型任务 |
|---|---|---|---|---|
| 银行交易 | 账户/企业 | 转账、代付 | 金额、时间、频次 | 欺诈检测、资金链分析 |
| 信贷关系 | 银行、企业 | 授信、担保、逾期 | 额度、利率、期限 | 违约预测、风险传播 |
| 供应链 | 企业 | 供货、采购 | 账期、订单额 | 供应链补全、断链预警 |
| 股权网络 | 企业、自然人 | 持股、控制 | 持股比例、层级 | 集团识别、关联交易 |
四、误区与复盘:建模中最容易踩的坑
复盘时建议检查三点:一是边表是否存在重复边与自环,必要时聚合权重;二是节点ID是否全局唯一且稳定,避免增量更新时错位;三是时间窗口是否与业务口径一致,例如“近90天交易”与“自然季度”不可混用。只有图数据在语义、时间、粒度三个维度都对齐,GNN的节点分类与关系预测才有可靠基础。