3. 数据源接入与清洗:构建反洗钱特征工程的基石
反洗钱特征工程的质量,直接取决于底层数据的完整性、准确性与时效性。本章将系统讲解AML特征工程所需的核心数据源接入方式、数据质量检查要点以及清洗策略,确保后续特征计算建立在可靠的数据基础之上。
3.1 核心数据源概览
AML特征工程通常依赖以下五类数据源,每类数据源在特征体系中承担不同角色:
| 数据源类型 | 核心字段示例 | 特征工程用途 | 更新频率 |
|---|---|---|---|
| 客户信息(KYC) | 客户ID、姓名、证件类型、国籍、职业、注册地址、受益所有人 | 客户画像特征、风险等级、关联关系挖掘 | 日/事件驱动 |
| 交易流水 | 交易ID、账户ID、对手方、金额、币种、交易时间、渠道、IP地址 | 交易行为特征、金额统计、时序模式、网络分析 | 实时/准实时 |
| 黑名单 | 名单ID、姓名、证件号、名单类型、列入日期、来源 | 命中检测、匹配评分、名单交叉特征 | 日/周 |
| 制裁名单 | 制裁ID、实体名称、制裁项目、国家、生效日期、到期日期 | 制裁筛查、地域风险、行业限制特征 | 日/事件驱动 |
| 舆情数据 | 新闻标题、正文、来源、发布时间、实体提及、情感标签 | 负面舆情评分、事件关联、风险信号增强 | 实时/小时 |
关键原则:所有数据源接入时,必须保留原始数据快照(Snapshot),以便特征回溯与模型审计。建议采用"增量接入+全量校验"的双轨策略。
3.2 数据源接入架构
下图展示了AML特征工程中典型的数据源接入与清洗架构,各数据源通过标准化接口进入数据湖,经过质量检查与清洗后,进入特征存储层。
3.3 数据质量检查策略
数据质量检查是特征工程的"守门人"。以下按数据源类型列出核心检查项与标准:
3.3.1 客户信息(KYC)质量检查
| 检查维度 | 检查项 | 可接受阈值 | 处理策略 |
|---|---|---|---|
| 完整性 | 客户ID、姓名、证件号是否为空 | 缺失率 < 0.1% | 标记为待补全,暂不参与特征计算 |
| 准确性 | 证件号格式校验(身份证、护照) | 格式正确率 > 99% | 格式错误记录进入人工核查队列 |
| 一致性 | 同一客户在不同系统中的姓名、证件号是否一致 | 一致率 > 99.5% | 不一致记录按置信度最高的源系统为准 |
| 时效性 | KYC信息最近更新日期 | 90天内更新率 > 95% | 超期未更新客户标记为"KYC过期" |
| 唯一性 | 是否存在重复客户记录 | 重复率 < 0.5% | 基于规则或模型进行客户去重合并 |
3.3.2 交易流水质量检查
| 检查维度 | 检查项 | 可接受阈值 | 处理策略 |
|---|---|---|---|
| 完整性 | 交易ID、账户ID、金额、时间是否缺失 | 缺失率 < 0.01% | 缺失关键字段的交易直接拒绝入库 |
| 准确性 | 金额是否为正数、币种代码是否有效 | 异常率 < 0.1% | 金额为负或零的交易标记为可疑 |
| 一致性 | 交易时间戳是否在合理范围内(非未来时间) | 未来时间占比 = 0% | 未来时间戳交易延迟至实际时间处理 |
| 时效性 | 交易数据延迟到达时间 | 延迟 < 5分钟(实时场景) | 超时交易进入批量补录通道 |
| 唯一性 | 交易ID是否重复 | 重复率 < 0.001% | 重复交易按时间戳保留最新一条 |
3.3.3 黑名单与制裁名单质量检查
- 完整性:名单实体名称、证件号、名单类型不可为空,缺失率须低于0.5%。
- 准确性:制裁名单的生效日期与到期日期逻辑校验(生效日期 < 到期日期)。
- 一致性:同一实体在不同名单源中的名称拼写差异需标准化处理(如"Osama bin Laden" vs "Usama bin Ladin")。
- 时效性:名单更新版本号与发布日期必须记录,过期名单需标记失效日期。
- 唯一性:基于模糊匹配算法(如Jaro-Winkler、Levenshtein)检测名单内重复实体。
3.3.4 舆情数据质量检查
- 完整性:新闻标题、正文、发布时间、实体提及字段不可为空。
- 准确性:实体识别(NER)结果需人工抽检,准确率不低于90%。
- 一致性:同一事件在不同新闻源中的实体提及需对齐(如"马云" vs "Jack Ma")。
- 时效性:舆情数据延迟不超过1小时,历史舆情需标注采集时间戳。
- 去重:基于文本相似度(SimHash、MinHash)去除重复或高度相似的新闻。
实战建议:建立数据质量仪表盘(DQ Dashboard),实时监控各数据源的质量评分。当某个数据源的质量评分低于阈值时,自动触发告警并暂停该数据源的特征计算,避免"垃圾进,垃圾出"。
3.4 数据清洗策略
数据清洗是质量检查的后续动作,旨在将原始数据转化为可用于特征计算的标准格式。以下按数据源类型给出清洗策略:
3.4.1 客户信息清洗
-- 清洗示例:客户姓名标准化与证件号格式化
UPDATE customer_profile
SET
name_standard = UPPER(TRIM(name)), -- 姓名统一大写并去除首尾空格
id_number_standard = CASE
WHEN id_type = 'ID_CARD' AND LENGTH(id_number) = 18
THEN UPPER(id_number) -- 身份证统一大写
WHEN id_type = 'PASSPORT'
THEN UPPER(TRIM(id_number)) -- 护照号统一大写
ELSE id_number
END,
address_standard = regexp_replace(address, '\s+', ' '), -- 地址多余空格压缩
update_timestamp = CURRENT_TIMESTAMP
WHERE quality_flag = 'PENDING_CLEAN';
3.4.2 交易流水清洗
-- 清洗示例:交易金额舍入与时间戳标准化
CREATE OR REPLACE VIEW transaction_clean AS
SELECT
transaction_id,
account_id,
counterparty_id,
ROUND(amount, 2) AS amount_clean, -- 金额保留两位小数
currency_code,
CASE
WHEN transaction_time > CURRENT_TIMESTAMP
THEN DATEADD(hour, -8, transaction_time) -- 时区修正示例
ELSE transaction_time
END AS transaction_time_clean,
channel,
ip_address,
'CLEAN' AS clean_status
FROM transaction_raw
WHERE transaction_id IS NOT NULL
AND account_id IS NOT NULL
AND amount > 0;
3.4.3 名单数据清洗
-- 清洗示例:名单实体名称标准化与别名扩展
INSERT INTO sanction_list_clean
SELECT
sanction_id,
UPPER(TRIM(entity_name)) AS entity_name_standard,
-- 生成别名变体用于模糊匹配
ARRAY[
UPPER(TRIM(entity_name)),
REPLACE(UPPER(TRIM(entity_name)), ' ', ''),
REPLACE(UPPER(TRIM(entity_name)), '-', ' ')
] AS name_variants,
sanction_program,
country,
effective_date,
expiry_date,
source,
CURRENT_TIMESTAMP AS load_timestamp
FROM sanction_list_raw
WHERE effective_date <= CURRENT_DATE
AND (expiry_date IS NULL OR expiry_date >= CURRENT_DATE);
3.4.4 舆情数据清洗
# 清洗示例:舆情文本预处理与实体标准化
import re
import hashlib
def clean_news_article(article):
# 去除HTML标签
text = re.sub(r'<[^>]+>', '', article['content'])
# 去除多余空白
text = re.sub(r'\s+', ' ', text).strip()
# 统一全角半角
text = text.replace(',', ',').replace('。', '.').replace('(', '(').replace(')', ')')
# 生成去重指纹
text_hash = hashlib.md5(text.encode()).hexdigest()
return {
'news_id': article['news_id'],
'title_clean': article['title'].strip(),
'content_clean': text,
'content_hash': text_hash,
'publish_time': article['publish_time'],
'entities': standardize_entities(article['entities']), # 实体标准化
'source': article['source'],
'load_timestamp': datetime.now()
}
3.5 数据质量监控与告警
建立持续的数据质量监控机制,确保特征工程始终运行在高质量数据之上:
3.6 数据清洗常见陷阱与避坑指南
⚠️ 常见陷阱1:过度清洗导致信息丢失
清洗策略过于激进(如直接删除所有含缺失值的记录),可能导致重要风险信号丢失。例如,某笔交易缺少对手方名称,但金额巨大且时间异常,直接删除会遗漏潜在可疑交易。
建议:对缺失字段进行分级处理,关键字段缺失则标记为"待核查",非关键字段缺失则使用占位符或均值填充。
清洗策略过于激进(如直接删除所有含缺失值的记录),可能导致重要风险信号丢失。例如,某笔交易缺少对手方名称,但金额巨大且时间异常,直接删除会遗漏潜在可疑交易。
建议:对缺失字段进行分级处理,关键字段缺失则标记为"待核查",非关键字段缺失则使用占位符或均值填充。
⚠️ 常见陷阱2:忽略时区与夏令时
交易数据可能来自不同时区,直接使用原始时间戳进行特征计算会导致时序特征偏差(如"凌晨交易"被误判为"白天交易")。
建议:统一将所有时间戳转换为UTC+0,并记录原始时区信息。对于夏令时切换日期,需特殊标记。
交易数据可能来自不同时区,直接使用原始时间戳进行特征计算会导致时序特征偏差(如"凌晨交易"被误判为"白天交易")。
建议:统一将所有时间戳转换为UTC+0,并记录原始时区信息。对于夏令时切换日期,需特殊标记。
⚠️ 常见陷阱3:名单匹配中的"假阳性"泛滥
黑名单/制裁名单清洗时,过度激进的别名扩展(如将"张三"扩展为"张 三"、"Zhang San"、"San Zhang")会导致大量误命中。
建议:采用分级匹配策略:精确匹配→模糊匹配→人工复核,并记录匹配置信度分数。
黑名单/制裁名单清洗时,过度激进的别名扩展(如将"张三"扩展为"张 三"、"Zhang San"、"San Zhang")会导致大量误命中。
建议:采用分级匹配策略:精确匹配→模糊匹配→人工复核,并记录匹配置信度分数。
最佳实践:建立数据血缘(Data Lineage)追踪系统,记录每条特征数据从原始数据源到最终特征值的完整转换路径。这不仅有助于问题排查,也是监管审计的重要依据。
3.7 本章小结
数据源接入与清洗是AML特征工程的"地基工程",其质量直接决定上层特征的有效性与模型的可靠性。核心要点包括:
- 五类核心数据源(KYC、交易、黑名单、制裁名单、舆情)各有不同的质量检查重点与清洗策略。
- 质量检查需覆盖完整性、准确性、一致性、时效性、唯一性五个维度,并设定可量化的阈值。
- 清洗策略应保留原始数据快照,采用分级处理机制,避免过度清洗导致信息丢失。
- 监控闭环确保数据质量问题能被及时发现、告警并反馈至规则优化,形成持续改进的良性循环。
完成数据源接入与清洗后,下一阶段将进入特征工程的核心环节——基于清洗后的高质量数据,构建具有业务解释性与统计显著性的AML特征体系。