4. 金融场景建模

在金融GNN项目中,模型效果的上限往往不由网络结构决定,而由“图建得对不对”决定。银行交易、信贷关系、供应链和股权网络是四类最常见的金融数据源,它们天然具备实体与关系的结构,但原始形态通常是流水表、合同表、工商登记表或ERP单据。本节的核心任务,是建立一套可复用的建模方法,把这四类异构数据统一转化为“节点—边—特征—标签”的图数据,为后续节点分类与关系预测提供干净输入。

一、核心原理:金融实体与关系的抽象规则

图建模的本质是回答三个问题:谁是节点、什么是边、边上和点上带什么信息。金融场景中,节点通常对应企业、个人、银行账户、产品、行业或地区;边则对应资金流、授信、担保、供货、持股等关系。与社交网络不同,金融边往往带有方向、金额、时间、利率、账期等属性,因此更适合建模为属性有向多重图。

一个关键原则是:节点粒度决定任务粒度。若做企业风险分类,节点应为企业;若做账户欺诈识别,节点应为账户;若做集团客户关系预测,节点可为企业并允许同一对节点间存在多条不同类型的边。另一个原则是时间切片:金融关系具有强时效性,交易边和信贷边应保留时间戳,必要时按月度或季度切片构建动态图。

建模口诀:先定任务,再定节点;先定语义,再定边型;先定时间窗,再定特征。三者顺序颠倒,后期返工成本极高。

二、方法流程:四类数据源的转化路径

下面给出从原始表到图数据的通用流程,并用一张结构图展示四类数据源如何汇入统一图模式。

金融多源数据 → 统一图模式 银行交易流水 账户·金额·时间 信贷关系 授信·担保·逾期 供应链 供货·采购·账期 股权网络 统一图模式 节点:企业/账户/人 边:交易/信贷/供货/持股 属性:金额·时间·方向 标签:风险·违约·欺诈 下游任务 节点分类:企业风险等级 关系预测:隐性担保 链路预测:供应链补全 异常检测:欺诈团伙

具体转化步骤可归纳为以下清单:

  1. 实体对齐:用统一社会信用代码、账号、身份证号做去重与映射,解决同一企业在不同表中名称不一致的问题。
  2. 边表构建:每条关系记录生成一行边表,字段包括 src_id、dst_id、edge_type、timestamp、amount、weight。
  3. 节点特征:数值型做分箱或标准化,类别型做嵌入,文本型可提取关键词或使用预训练向量。
  4. 标签对齐:将风险等级、违约标识、欺诈标签挂到对应节点或边上,注意标签泄漏与时间穿越。
  5. 图划分:按时间或企业划分训练/验证/测试集,避免同一集团同时出现在训练和测试中。

三、案例场景:从流水表到可训练图

假设我们有一张银行交易流水表,字段为付款账号、收款账号、金额、交易时间、交易类型。转化为图数据的代码如下:

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的节点分类与关系预测才有可靠基础。

实践建议:先用小样本构建一张“最小可用图”,跑通节点分类与链路预测两条基线,再逐步接入更多数据源。图建模是迭代过程,不是一次性ETL。