知识图谱在金融风控中的应用

反欺诈、反洗钱与信用风控的图谱化实战 | 2026-02

一、为什么金融风控需要知识图谱

传统风控依赖规则引擎和机器学习模型,处理的是"单点特征":一个人的年龄、收入、征信分。但欺诈和洗钱的本质是"关系网络"中的异常模式:一群人通过复杂的资金链条、担保关系、股权嵌套来隐藏真实意图。

知识图谱将"关系"显式化,让风控从"看单点"升级为"看网络":

传统风控视角(单点):
  申请人A -> 特征向量 -> 模型打分 -> 通过/拒绝

图谱风控视角(网络):
  申请人A -[担保]-> B -[股东]-> C -[法人]-> D -[贷款]-> E(逾期)
  申请人A -[同设备]-> F(黑名单)
  申请人A -[同IP]-> G, H, I (批量申请)
  => 发现隐性风险关联

二、金融风控知识图谱 Schema 设计

2.1 核心实体与关系

实体类型:
  Person        -- 自然人(姓名、身份证、手机、地址)
  Company       -- 企业(名称、统一社会信用代码、注册资本)
  Account       -- 账户(账号、开户行、类型)
  Device        -- 设备(设备指纹、IP、MAC)
  LoanApp       -- 贷款申请(金额、期限、状态)
  Transaction   -- 交易(金额、时间、渠道)

关系类型:
  Person  -[OWNS]->       Account
  Person  -[LEGAL_REP]->  Company
  Person  -[SHAREHOLDER {ratio}]-> Company
  Person  -[GUARANTEES]-> Person|Company
  Person  -[USES]->       Device
  Person  -[APPLIES]->    LoanApp
  Account -[TRANSFER {amount, time}]-> Account
  Company -[INVESTS {ratio}]-> Company
  Company -[SUPPLIES]->   Company

2.2 标签体系

风险标签(附着在 Person/Company 节点上):
  BLACKLISTED        -- 黑名单
  HIGH_RISK          -- 高风险
  OVERDUE_90D        -- 逾期 90 天以上
  FRAUD_SUSPECTED    -- 疑似欺诈
  PEP                -- 政治敏感人物
  SANCTIONS_HIT      -- 命中制裁名单

三、反欺诈图模式

3.1 团伙欺诈检测

核心思路:通过设备、地址、联系人等"弱关联"发现表面独立但实际关联的申请人群体。

// 模式 1:设备聚集(同一设备多人申请)
MATCH (d:Device)<-[:USES]-(p:Person)-[:APPLIES]->(app:LoanApp)
WITH d, collect(DISTINCT p) AS users, count(DISTINCT p) AS cnt
WHERE cnt >= 3
RETURN d.fingerprint, cnt, [u IN users | u.name] AS applicants

// 模式 2:地址聚集(同一地址多人申请,非商业地址)
MATCH (p1:Person)-[:APPLIES]->(:LoanApp)
MATCH (p2:Person)-[:APPLIES]->(:LoanApp)
WHERE p1 <> p2
  AND p1.address = p2.address
  AND NOT p1.address CONTAINS '大厦'
WITH p1.address AS addr, collect(DISTINCT p1.name) + collect(DISTINCT p2.name) AS names
WHERE size(names) >= 3
RETURN addr, names

// 模式 3:担保环(A 担保 B、B 担保 C、C 担保 A)
MATCH path = (a:Person)-[:GUARANTEES*3..6]->(a)
RETURN path, length(path) AS loop_size

3.2 身份伪造检测

// 同一手机号关联多个身份证
MATCH (p1:Person)-[:USES]->(phone:Phone)<-[:USES]-(p2:Person)
WHERE p1 <> p2 AND p1.id_number <> p2.id_number
RETURN phone.number, collect(p1.name) AS identities

// 短时间内更换多个手机号
MATCH (p:Person)-[u:USES]->(phone:Phone)
WITH p, collect(phone) AS phones, count(phone) AS phoneCnt
WHERE phoneCnt >= 3
RETURN p.name, phoneCnt, [ph IN phones | ph.number] AS numbers

3.3 实时风险评分架构

                   ┌─────────────┐
  贷款申请 ──────> │  API Gateway │
                   └──────┬──────┘
                          |
                   ┌──────┴──────┐
                   │  风控引擎    │
                   │             │
                   │  1. 规则层  │ -- 黑名单命中、基础规则
                   │  2. 模型层  │ -- XGBoost/LightGBM 特征打分
                   │  3. 图谱层  │ -- 关联风险传导
                   │             │
                   └──────┬──────┘
                          |
              ┌───────────┼───────────┐
              |           |           |
       ┌──────┴──┐  ┌────┴────┐  ┌──┴───────┐
       │ 规则引擎 │  │ ML 模型 │  │ 图谱查询  │
       │ Drools   │  │ Serving │  │ Neo4j    │
       └─────────┘  └─────────┘  └──────────┘

图谱层风险评分逻辑:

def graph_risk_score(person_id: str) -> dict:
    """基于图谱的风险评分"""
    query = """
    // 1 跳内黑名单关联
    MATCH (p:Person {id: $pid})-[*1..2]-(risky)
    WHERE risky:BLACKLISTED OR risky:OVERDUE_90D
    WITH p,
      count(CASE WHEN risky:BLACKLISTED THEN 1 END) AS blacklist_cnt,
      count(CASE WHEN risky:OVERDUE_90D THEN 1 END) AS overdue_cnt

    // 担保环检测
    OPTIONAL MATCH loop = (p)-[:GUARANTEES*2..5]->(p)
    WITH p, blacklist_cnt, overdue_cnt,
      CASE WHEN loop IS NOT NULL THEN 1 ELSE 0 END AS has_loop

    // 设备聚集度
    OPTIONAL MATCH (p)-[:USES]->(d:Device)<-[:USES]-(other:Person)
    WITH p, blacklist_cnt, overdue_cnt, has_loop,
      count(DISTINCT other) AS device_sharing

    RETURN {
      blacklist_proximity: blacklist_cnt,
      overdue_proximity: overdue_cnt,
      guarantee_loop: has_loop,
      device_sharing: device_sharing,
      graph_score: blacklist_cnt * 30 + overdue_cnt * 20
                   + has_loop * 40 + device_sharing * 10
    } AS risk
    """
    with driver.session() as session:
        result = session.execute_read(lambda tx: tx.run(query, pid=person_id).single())
        return result["risk"]

四、反洗钱(AML)知识图谱

4.1 资金流转网络分析

反洗钱的核心是追踪资金流向,发现"分层-混合-整合"三阶段模式:

阶段 1(分层 Layering):
  大额 -> 拆分为多笔小额 -> 多个账户

阶段 2(混合 Integration):
  多个账户 -> 交叉转账 -> 混淆来源

阶段 3(整合 Integration):
  汇集到目标账户 -> 合法用途(购房、投资)

Cypher 检测模式:

// 可疑资金环路:A -> B -> C -> ... -> A,且金额接近
MATCH path = (a:Account)-[:TRANSFER*3..8]->(a)
WITH path, relationships(path) AS transfers
WHERE ALL(t IN transfers WHERE t.amount > 5000)
  AND ALL(t IN transfers WHERE
    abs(t.amount - head(transfers).amount) < head(transfers).amount * 0.2)
RETURN path,
  reduce(s = 0, t IN transfers | s + t.amount) AS totalFlow,
  length(path) AS hops

// 大额拆分(一入多出,金额总和接近)
MATCH (source:Account)-[t_in:TRANSFER]->(hub:Account)-[t_out:TRANSFER]->(targets:Account)
WHERE t_in.amount > 50000
WITH hub, t_in,
  collect(t_out) AS outs,
  sum(t_out.amount) AS total_out
WHERE abs(total_out - t_in.amount) < t_in.amount * 0.05
  AND size(outs) >= 3
RETURN hub.account_no, t_in.amount, total_out, size(outs) AS split_count

4.2 制裁名单与 PEP 筛查

// 客户的 2 跳内是否关联 PEP 或制裁实体
MATCH (c:Person {id: $customer_id})-[*1..2]-(target)
WHERE target:PEP OR target:SANCTIONS_HIT
RETURN target.name, labels(target),
  shortestPath((c)-[*]-(target)) AS connection_path

五、信用风险评估

5.1 图特征工程

将图谱拓扑信息转化为可输入 ML 模型的特征:

图特征 计算方式 风控含义
度中心性 节点的关系数量 社交活跃度
PageRank 节点的图重要性 影响力
社区归属 Louvain/Label Propagation 所属群体风险
黑名单距离 到最近黑名单节点的最短路径 风险传导距离
担保深度 担保链最大长度 间接风险暴露
共同邻居数 与黑名单共享的邻居数 关联紧密度
# 使用 Neo4j GDS 计算图特征
def compute_graph_features(tx, person_id):
    features = {}

    # PageRank
    pr = tx.run("""
        CALL gds.pageRank.stream('riskGraph')
        YIELD nodeId, score
        WITH gds.util.asNode(nodeId) AS node, score
        WHERE node.id = $pid
        RETURN score
    """, pid=person_id).single()
    features["pagerank"] = pr["score"] if pr else 0

    # 黑名单最短距离
    dist = tx.run("""
        MATCH (p:Person {id: $pid}), (b:Person:BLACKLISTED)
        MATCH path = shortestPath((p)-[*..5]-(b))
        RETURN min(length(path)) AS min_dist
    """, pid=person_id).single()
    features["blacklist_distance"] = dist["min_dist"] if dist and dist["min_dist"] else 99

    return features

5.2 图神经网络(GNN)风控模型

传统 ML 只能用手工构造的图特征,GNN 可以端到端学习图结构信息:

输入层: 节点特征(年龄、收入、征信分)+ 图结构(邻接矩阵)
   |
GNN 层 x 2-3: 消息传递(每个节点聚合邻居信息)
   |
读出层: 节点级分类(违约/正常)
   |
输出: 每个申请人的违约概率

适用场景:数据量大(百万节点以上)、关系复杂(多类型关系)、需要自动学习图模式。

六、案例研究

案例 1:某银行信用卡反欺诈

  • 背景:日均申请 5 万笔,传统规则误杀率 15%
  • 方案:构建申请人关联图谱(设备、地址、手机、担保人),图模式检测 + GNN 模型
  • 结果:欺诈检出率从 60% 提升至 89%,误杀率从 15% 降至 5%
  • 关键图模式:设备聚集(3+ 人共用设备)命中率最高

案例 2:某支付公司反洗钱

  • 背景:日均交易 200 万笔,人工审查可疑交易报告效率低
  • 方案:构建实时资金流转图谱,环路检测 + 拆分模式 + 制裁名单关联
  • 结果:可疑交易识别效率提升 3 倍,人工审查量减少 40%
  • 关键图模式:资金环路(3-5 跳闭环)+ 大额拆分(1 入 3+ 出)

七、落地检查清单

  1. 数据接入:核心数据源(客户、交易、设备)是否实时/准实时可用
  2. Schema 评审:是否覆盖了目标场景的关键实体和关系
  3. 查询性能:高频图模式查询是否在 100ms 内返回
  4. 模型集成:图特征是否已接入 ML 模型的特征工程 Pipeline
  5. 规则配置:反欺诈/AML 图模式是否可配置(阈值、跳数、金额)
  6. 合规审查:数据使用是否符合个人信息保护法和金融监管要求
  7. 监控告警:图谱更新延迟、查询超时、异常模式命中是否有告警

Maurice | maurice_wen@proton.me