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的方向与效率。下图展示了核心表之间的逻辑关联。
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顺序与数据过滤时机。
核心要点:
- 客户信息表是特征提取的起点,所有特征最终都应归集到客户维度。
- 账户信息表是连接客户与交易的桥梁,通常使用
cust_id进行1:N关联。 - 交易流水表是特征计算的主体,必须在关联前进行时间范围过滤,避免全表扫描。
- 黑名单表与外部情报表作为补充维度,通过身份信息(
id_type+id_number)进行逻辑匹配,而非主外键关联。 - 最终输出的特征宽表应包含客户标识、静态属性、聚合交易指标、名单命中标志与情报标签。