信贷场景建模:客户-设备-联系人图谱构建

做信贷风控这些年,我最大的感触就是——单点看人,永远看不全

你想想看,一个客户提交的资料再漂亮,征信报告再干净,你能保证他没有在别的平台借过钱?你能保证他填的联系人不是随便编的?

嗯,这就是传统风控的盲区。而图计算,恰恰能补上这块短板。

为什么需要客户-设备-联系人图谱?

说白了,我们要把「人」放到「关系网」里去看。

一个客户可能很老实,但他如果跟一群逾期老哥共用同一台设备,或者他的紧急联系人全是黑名单用户——你觉得他还安全吗?

我在项目中遇到过这样一个案例:有个客户征信评分挺高,但图模型一跑,发现他的设备ID跟三个逾期用户完全重合。后来一查,是个团伙作案的中介。嗯,单看征信根本发现不了。

图谱的核心要素

构建图谱,我们需要三类节点和三类边:

节点类型 属性示例 边类型 含义
客户(Person) 身份证号、手机号、姓名 客户-设备 该客户使用过某设备
设备(Device) IMEI、MAC地址、设备型号 客户-联系人 该客户填写的联系人
联系人(Contact) 手机号、姓名、关系 设备-设备 设备间共享关系(如WiFi)

我建议你特别注意设备节点。为什么?因为设备是团伙欺诈的「聚集地」。一个设备上注册过10个客户,这本身就是一个危险信号。

图谱构建的代码实现

这里我用Neo4j举个例子。我个人习惯用Cypher来建图,清晰又直观:

// 创建客户节点
CREATE (p:Person {
  id: 'P001',
  name: '张三',
  id_card: '110101199001011234',
  credit_score: 680
})

// 创建设备节点
CREATE (d:Device {
  imei: '356938035643809',
  device_model: 'iPhone 12',
  first_seen: '2024-01-15'
})

// 创建联系人节点
CREATE (c:Contact {
  phone: '13800138000',
  relation: '配偶'
})

// 建立关系
MATCH (p:Person {id: 'P001'})
MATCH (d:Device {imei: '356938035643809'})
CREATE (p)-[:USED_DEVICE {timestamp: '2024-01-15'}]->(d)

MATCH (p:Person {id: 'P001'})
MATCH (c:Contact {phone: '13800138000'})
CREATE (p)-[:HAS_CONTACT]->(c)

这段代码看着简单,但实际生产环境里,数据量一上来,建图速度就是个大问题。我曾经在几千万节点的图上跑批量导入,结果跑了整整两天……后来改用批量CSV导入加索引优化,才把时间压到小时级。

图谱构建的避坑指南

我曾经踩过一个坑:设备ID的归一化问题。同一个设备,Android拿到的IMEI和iOS拿到的IDFA完全不同。如果不做归一化,一个客户可能被关联到多个「假设备」上,图谱就乱了。

我的做法是:建立一个设备指纹归一化表,把IMEI、IDFA、MAC地址、设备型号+系统版本组合成一个hash值,作为设备的唯一标识。

多头借贷关系建模

多头借贷,说白了就是一个人同时在多个平台借钱。这本身不违法,但借得太多,还款能力肯定跟不上。

传统做法是查征信报告,看近3个月查询次数。但征信报告有滞后性,而且有些小贷平台不上征信。这时候,图模型就派上用场了。

多头借贷的图模式

我们来看一个典型的「多头借贷」子图:

// 查询某个客户的多头借贷情况
MATCH (p:Person {id: 'P001'})-[r:APPLIED]->(l:LoanPlatform)
RETURN p.name, l.name, r.apply_time, r.amount
ORDER BY r.apply_time DESC

如果这个客户关联了超过5个贷款平台,而且申请时间集中在3天内——嗯,这基本就是多头借贷的典型特征。

多头借贷的量化指标

我建议你关注这几个指标:

  • 平台数:客户关联的贷款平台数量,超过3个算预警
  • 申请密度:单位时间内的申请次数,比如1天内申请5次
  • 共债比例:客户在多个平台的总借款额 / 客户收入
  • 平台重叠度:两个客户共同使用的平台数量,用于发现团伙

实战经验:我在某消费金融公司做过一个模型,把「平台数」和「申请密度」作为图特征输入XGBoost,AUC从0.72直接提到了0.81。说白了,图特征比传统特征好使多了。

多头借贷的图算法应用

这里我常用的是标签传播算法(LPA)。为什么?因为多头借贷的客户往往有相似的借贷行为模式,LPA可以自动把这些人聚类到一起。

// Neo4j GDS 中的标签传播
CALL gds.labelPropagation.write({
  nodeProjection: 'Person',
  relationshipProjection: {
    SHARED_PLATFORM: {
      type: 'SHARED_PLATFORM',
      orientation: 'UNDIRECTED',
      aggregation: 'SINGLE'
    }
  },
  writeProperty: 'community'
})

跑完之后,每个客户都会被打上一个「社区标签」。如果某个社区里逾期率超过30%,那这个社区的新客户就得格外小心了。

担保圈识别

担保圈,是信贷领域的老大难问题。

你想想看,A给B担保,B给C担保,C又给A担保——表面上每个人都有担保人,实际上风险全在圈内循环。一旦一个人出问题,整个圈子就崩了。

我记得2012年长三角的互保圈危机,就是典型的担保圈暴雷。嗯,图计算就是用来提前发现这种圈子的。

担保圈的图模式

担保关系本质上是一个有向图:A担保B,就是A→B的一条边。如果存在A→B→C→A这样的环,那就是一个担保圈。

小技巧:担保圈不一定是简单的三角形。实际业务中,我见过几十个节点组成的大环,还有「领带结」结构的复杂担保圈。用肉眼根本看不出来,必须上算法。

担保圈检测算法

检测担保圈,核心就是找强连通分量(SCC)。一个强连通分量里的节点,任意两个都能互相到达——这就是一个担保圈。

// 使用 Neo4j GDS 检测强连通分量
CALL gds.alpha.scc.write({
  nodeProjection: 'Company',
  relationshipProjection: {
    GUARANTEE: {
      type: 'GUARANTEE',
      orientation: 'NATURAL'
    }
  },
  writeProperty: 'scc'
})

跑完之后,每个公司都会得到一个scc编号。同一个编号的公司,就属于同一个担保圈。

担保圈的风险分级

不是所有担保圈都要一棍子打死。我一般按以下标准分级:

风险等级 判定标准 处理建议
低风险 圈内节点≤3,且所有企业正常经营 正常审批,但需关注
中风险 圈内节点4-10,或有1-2家经营异常 提高担保要求,或要求解圈
高风险 圈内节点>10,或存在逾期企业 直接拒贷,或要求全额抵押

我曾经犯过一个错:只检测了直接担保环,忽略了间接担保关系。比如A担保B,B担保C,A和C虽然没有直接担保关系,但A实际上承担了C的间接风险。后来我改用可达性分析,把间接担保也纳入考量,才真正把风险兜住。

担保圈的可视化

光有算法还不够,你得能看得见。我习惯用SVG画担保圈的关系图,这样业务同事一眼就能看懂。

担保圈示例:A→B→C→A 循环担保 A B C 担保 担保 担保 这是一个典型的循环担保圈,风险高度集中

你看这张图,A担保B,B担保C,C又担保A。表面上每个人都有担保,实际上风险全在圈子里打转。一旦A出问题,B和C都得跟着遭殃。

担保圈的实际应用

在信贷审批中,我一般这样用担保圈检测结果:

  1. 准入过滤:高风险担保圈内的企业,直接拒绝准入
  2. 额度调整:中风险圈内的企业,降低授信额度20%-50%
  3. 担保要求:要求圈内企业提供额外的抵押物或第三方担保
  4. 动态监控:对已放款的担保圈企业,提高监控频率,一旦出现逾期立即预警

说句实在话:担保圈检测这件事,不做图计算之前,我们靠人工排查,一个月能查100家企业就不错了。上了图算法之后,一天能跑完10万家。效率提升的不是一星半点。

好了,以上就是信贷场景建模的三个核心方向。客户-设备-联系人图谱是基础,多头借贷建模是风险识别,担保圈识别是风险传导。三者结合起来,才能构建一个完整的信贷风控图体系。


公众号:蓝海资料掘金营,微信deep3321