2. 特征样本数据源分析:核心表结构与关系

反洗钱特征样本的提取,本质上是将分散在多个业务系统中的数据,按照客户维度进行关联、聚合与筛选。理解各数据源的表结构及其之间的逻辑关系,是构建高效、准确的特征样本提取SQL的基础。本章将逐一剖析五张核心表:客户信息表、交易流水表、账户信息表、黑名单表与外部情报表。

2.1 核心表结构概览

以下表格总结了五张核心表在反洗钱特征提取中的角色、关键字段与典型数据量级。在实际数据仓库中,这些表通常经过ETL清洗,但字段语义与源系统保持一致。

表名 角色定位 关键字段(示例) 数据粒度
客户信息表 特征提取的“主实体”,提供客户身份、风险等级、地域等静态属性 cust_id, cust_name, id_type, id_number, nationality, risk_level, occupation, create_date 每客户一条记录
账户信息表 连接客户与交易的“桥梁”,提供账户类型、开户机构、账户状态等 acct_id, cust_id, acct_type, open_branch, open_date, acct_status, currency 每账户一条记录
交易流水表 特征计算的“数据主体”,提供交易金额、时间、对手方、渠道等行为数据 txn_id, acct_id, txn_date, txn_amount, txn_type, counterparty, channel, ip_address 每笔交易一条记录
黑名单表 特征筛选的“过滤条件”,用于命中制裁名单、通缉犯、政治公众人物等 list_id, name, id_type, id_number, list_type, source, effective_date, expire_date 每条名单一条记录
外部情报表 特征增强的“补充维度”,提供负面新闻、监管处罚、行业风险标签等 report_id, entity_name, id_number, report_type, risk_tag, report_date, source 每条情报一条记录
实战提示:在数据仓库中,客户信息表通常作为维度表(缓慢变化维),而交易流水表作为事实表。特征提取时,优先使用客户信息表作为驱动表,通过账户信息表与交易流水表进行关联,可有效控制数据扫描范围。

2.2 表间关系与关联路径

五张表通过主键与外键形成星型或雪花型模型。理解这些关系,决定了SQL中JOIN的方向与效率。下图展示了核心表之间的逻辑关联。

反洗钱特征样本核心表关系图 反洗钱特征样本核心表关系图 客户信息表 cust_id (PK) risk_level, nationality 账户信息表 acct_id (PK) cust_id (FK), acct_type 交易流水表 txn_id (PK) acct_id (FK), txn_amount 黑名单表 list_id (PK) id_number, list_type 外部情报表 report_id (PK) id_number, risk_tag 1:N 1:N 身份信息匹配 身份信息匹配 关联说明 • 实线:主外键关联 • 虚线:身份信息逻辑匹配 • 黑名单/情报表无直接FK

2.3 各表在特征提取中的关键作用

2.3.1 客户信息表:特征提取的“主实体”

  • 风险分层依据:通过 risk_level 字段,可以快速筛选高、中、低风险客户群体,作为特征样本的初始分层。
  • 地域与职业特征:nationality 与 occupation 是判断“跨境交易频繁”、“现金密集型行业”等可疑特征的基础。
  • 身份唯一性:id_number 是连接黑名单与外部情报表的核心匹配键。

2.3.2 账户信息表:交易行为的“容器”

  • 账户类型过滤:例如,仅提取“对公账户”或“个人高净值账户”的交易流水,缩小特征计算范围。
  • 开户机构维度:open_branch 可用于识别“异地开户”、“频繁销户重开”等异常行为模式。
  • 账户状态:排除已销户或冻结账户,避免无效数据干扰特征计算。

2.3.3 交易流水表:特征计算的“数据主体”

  • 金额与频次特征:基于 txn_amount 与 txn_date 计算“大额交易次数”、“日均交易金额”、“快进快出”等核心指标。
  • 对手方分析:counterparty 字段用于识别“与黑名单账户交易”、“循环转账”等复杂网络特征。
  • 渠道与IP特征:channel 与 ip_address 可用于识别“非柜面交易占比过高”、“IP地址跨地域”等行为异常。

2.3.4 黑名单表:特征筛选的“过滤条件”

  • 精确匹配与模糊匹配:通过 id_number 进行精确匹配,或通过 name 进行相似度匹配(如编辑距离算法)。
  • 时效性控制:利用 effective_date 与 expire_date 判断名单在交易发生时是否有效。
  • 名单类型分层:list_type 区分“制裁名单”、“通缉犯名单”、“PEP名单”,不同名单类型对应不同的特征权重。

2.3.5 外部情报表:特征增强的“补充维度”

  • 风险标签注入:将 risk_tag(如“涉嫌洗钱”、“关联诈骗”)作为客户维度的补充特征,提升模型区分度。
  • 时间窗口关联:结合 report_date 与交易时间,判断“负面情报发布后是否出现资金异常转移”。
  • 多源数据融合:不同 source(如“央行处罚”、“司法协查”、“舆情监控”)的情报可信度不同,可在特征工程中赋予不同权重。

2.4 表间关联的SQL实现示例

以下SQL展示了如何将五张表关联,提取一个客户维度的基础特征宽表。注意使用LEFT JOIN保留客户主实体,避免因账户或交易缺失导致客户信息丢失。

-- 反洗钱特征样本基础宽表提取示例
SELECT
    c.cust_id,
    c.risk_level,
    c.nationality,
    a.acct_type,
    COUNT(DISTINCT a.acct_id) AS acct_count,
    SUM(t.txn_amount) AS total_txn_amt,
    COUNT(t.txn_id) AS txn_count,
    MAX(t.txn_date) AS last_txn_date,
    CASE WHEN bl.list_id IS NOT NULL THEN 'Y' ELSE 'N' END AS blacklist_flag,
    CASE WHEN er.report_id IS NOT NULL THEN 'Y' ELSE 'N' END AS external_report_flag
FROM customer_info c
LEFT JOIN account_info a ON c.cust_id = a.cust_id
LEFT JOIN transaction_log t ON a.acct_id = t.acct_id
    AND t.txn_date >= DATEADD(month, -6, GETDATE())  -- 仅关联近6个月交易
LEFT JOIN blacklist bl ON c.id_type = bl.id_type AND c.id_number = bl.id_number
    AND GETDATE() BETWEEN bl.effective_date AND bl.expire_date
LEFT JOIN external_report er ON c.id_type = er.id_type AND c.id_number = er.id_number
    AND er.report_date >= DATEADD(year, -1, GETDATE())
GROUP BY
    c.cust_id, c.risk_level, c.nationality, a.acct_type,
    bl.list_id, er.report_id;  -- 注意:GROUP BY中需包含非聚合字段
性能避坑:在交易流水表(通常为亿级)上直接进行全表LEFT JOIN会导致查询性能急剧下降。实战中,应先在交易流水表上按时间分区(如近6个月)进行过滤,或使用子查询预聚合每日交易汇总,再与账户表关联。上述示例中的 t.txn_date >= DATEADD(month, -6, GETDATE()) 是必须的过滤条件。

2.5 表关系总结与特征提取路径

下图总结了从客户信息表出发,到最终生成特征样本的典型数据流路径。理解此路径,有助于在编写SQL时选择合适的JOIN顺序与数据过滤时机。

特征样本数据流路径图 特征样本数据流路径图 客户信息表 驱动表 账户信息表 1:N 关联 交易流水表 聚合计算 特征宽表 输出 黑名单表 外部情报表 身份信息匹配 身份信息匹配
核心要点:
  1. 客户信息表是特征提取的起点,所有特征最终都应归集到客户维度。
  2. 账户信息表是连接客户与交易的桥梁,通常使用 cust_id 进行1:N关联。
  3. 交易流水表是特征计算的主体,必须在关联前进行时间范围过滤,避免全表扫描。
  4. 黑名单表与外部情报表作为补充维度,通过身份信息(id_type + id_number)进行逻辑匹配,而非主外键关联。
  5. 最终输出的特征宽表应包含客户标识、静态属性、聚合交易指标、名单命中标志与情报标签。