4、数据基础与特征工程:交易数据、客户数据、账户数据的结构、清洗、标准化,以及衍生特征(如交易频率、金额波动、地域跳跃)的构建方法
可疑交易监测模型的性能上限,首先取决于输入数据的质量与特征表达的有效性。在反洗钱(AML)实务中,模型团队常面临数据分散、口径不一、噪声大、标签稀疏等挑战。本章聚焦于三类核心数据源——交易数据、客户数据、账户数据——的底层结构解析、清洗标准化流程,以及面向监测场景的衍生特征构建方法论。我们将从数据字典的解剖开始,逐步深入到特征工程的具体操作与实战案例,帮助学员建立从“原始数据”到“可用特征”的完整工程链路。
上图展示了从数据源到模型输入的完整工程链路。在实际项目中,这一链路并非一次性完成,而是需要根据模型上线后的反馈进行持续迭代。下面我们将分模块深入讲解每个环节的具体操作与关键技术点。
4.1 核心数据结构解析:三类数据的底层逻辑
核心原理:可疑交易监测所需的数据通常分布在核心系统、渠道系统、反洗钱名单系统等多个异构数据源中。交易数据描述“发生了什么”,客户数据回答“是谁做的”,账户数据则提供“资金载体”的状态。三者通过客户ID、账户ID等主外键关联,构成星型或雪花型数据模型。理解每类数据的字段语义、粒度(交易级、账户级、客户级)和生命周期,是后续清洗与特征构建的前提。
| 数据类别 | 关键字段示例 | 典型粒度 | 常见质量问题 |
|---|---|---|---|
| 交易数据 | 交易流水号、交易时间、交易金额、借贷标志、对手方账号、渠道编码、交易类型、商户号、IP/MAC地址 | 单笔交易 | 时间戳格式不一致、金额精度丢失、对手方信息缺失、重复记录 |
| 客户数据 | 客户号、证件类型/号码、姓名、国籍、职业、行业、风险等级、开户机构、客户经理 | 单一客户 | 证件号码脱敏不一致、风险等级更新滞后、多客户号未合并 |
| 账户数据 | 账号、开户日期、账户状态(正常/冻结/销户)、币种、余额、交易限额、开户网点、签约产品 | 单一账户 | 状态字段枚举值混乱、余额与流水不一致、历史状态未留痕 |
操作流程:在项目启动初期,建议按以下步骤进行数据盘点:
- 数据字典梳理:收集所有相关系统的数据字典,标记字段含义、类型、取值范围、是否可空。
- 粒度确认:明确每张表的主键和唯一约束,确认数据是增量还是全量存储。
- 关联关系验证:通过SQL抽样验证客户-账户-交易之间的关联命中率,识别孤儿数据。
- 质量基线建立:记录关键字段的缺失率、重复率、异常值比例,作为后续清洗效果的对比基线。
4.2 数据清洗与标准化:从“能用”到“好用”
核心原理:清洗的目标不是简单地删除“坏数据”,而是通过规则和算法,将原始数据转换为无歧义、可计算、可对齐的标准化格式。标准化包括三个层面:格式标准化(如日期、金额、币种)、逻辑标准化(如借贷方向统一、账户状态枚举统一)、语义标准化(如客户姓名大小写、证件类型编码统一)。
判断方法与操作流程:清洗工作应遵循“先探查、后规则、再验证”的路径。
- 缺失值处理:对于交易对手方信息缺失,若缺失率低于5%,可考虑填充“未知”或“跨行”;若高于20%,需回溯上游系统补录。对于客户职业缺失,可采用众数填充或单独标记为“未知”类别。
- 重复值处理:基于交易流水号、交易时间、金额、对手方账号四个字段做精确匹配去重;对于疑似重复(如金额相同但流水号不同),需结合时间窗口(如1分钟内)进行业务判断,避免误删真实交易。
- 异常值处理:金额为负、交易时间在未来、账户状态与交易行为矛盾(如已销户账户仍有交易)等,需生成数据质量报告并反馈给业务部门确认,而非直接丢弃。
- 时间标准化:统一转换为“YYYY-MM-DD HH:MM:SS”格式,并明确时区。建议在ETL层将时间统一转换为UTC存储,展示层再转换为本地时间。
-- 示例:清洗交易时间与金额的SQL逻辑
SELECT
txn_id,
customer_id,
account_id,
TO_TIMESTAMP(txn_time, 'YYYY-MM-DD"T"HH24:MI:SS') AS txn_time_std,
CASE
WHEN currency = 'CNY' THEN amount / 100.0 -- 分转元
WHEN currency = 'USD' THEN amount * 7.2 -- 汇率换算示例
ELSE amount
END AS amount_std,
UPPER(TRIM(txn_type)) AS txn_type_std
FROM raw_txn
WHERE txn_time IS NOT NULL
AND amount IS NOT NULL
AND amount > 0;
4.3 衍生特征构建:从原始字段到风险信号
核心原理:原始字段本身往往无法直接揭示可疑行为。例如,单笔交易金额100万元并不一定可疑,但如果该账户过去30天的平均交易金额仅为5000元,且交易对手方位于境外高风险地区,则这笔交易的风险显著上升。衍生特征的本质是通过统计、时序、网络分析等手段,将原始数据转化为能够刻画“行为模式”和“偏离程度”的量化指标。
特征分类与构建方法:根据反洗钱监测的常见场景,我们将衍生特征分为以下四大类:
| 特征类别 | 代表特征 | 计算逻辑 | 监测意义 |
|---|---|---|---|
| 交易频率类 | 近30天交易笔数、日平均交易笔数、夜间交易占比 | 基于时间窗口的COUNT聚合 | 识别资金快速进出、拆分交易 |
| 金额波动类 | 交易金额标准差、变异系数、最大单笔金额/日均金额比 | 基于金额字段的STD、MAX、AVG计算 | 识别金额异常放大、结构化交易 |
| 地域跳跃类 | 交易对手方地域数量、最大地域跳跃距离、境外交易占比 | 基于对手方所在地的经纬度或国家代码计算 | 识别跨地域快速交易、跨境资金转移 |
| 账户行为类 | 账户余额变动率、快进快出比例、账户活跃天数 | 结合账户余额与交易流水计算 | 识别过渡账户、资金归集账户 |
操作流程:特征构建应遵循“窗口选择→聚合计算→归一化”的步骤。窗口选择是关键,过短(如1天)容易受噪声干扰,过长(如1年)则反应迟钝。建议同时构建多个窗口(如7天、30天、90天)的特征,让模型自行选择最优时间尺度。
# 示例:Python伪代码——计算30天交易频率与金额波动特征
import pandas as pd
import numpy as np
def build_txn_features(df, window_days=30):
# df 包含 customer_id, txn_time, amount, counterparty_region
df['txn_date'] = pd.to_datetime(df['txn_time']).dt.date
end_date = df['txn_date'].max()
start_date = end_date - pd.Timedelta(days=window_days)
window_df = df[(df['txn_date'] >= start_date) & (df['txn_date'] <= end_date)]
features = window_df.groupby('customer_id').agg(
txn_count_30d=('txn_id', 'count'),
txn_amount_mean_30d=('amount', 'mean'),
txn_amount_std_30d=('amount', 'std'),
txn_amount_max_30d=('amount', 'max'),
txn_region_count_30d=('counterparty_region', 'nunique')
).reset_index()
# 金额波动系数 = 标准差 / 均值,避免除零
features['txn_amount_cv_30d'] = features['txn_amount_std_30d'] / (features['txn_amount_mean_30d'] + 1e-6)
return features
4.4 实战案例:某支付机构“拆分交易”监测特征工程
案例背景与约束:某第三方支付机构在反洗钱监测中发现,部分商户通过将大额交易拆分为多笔小额交易(每笔低于2万元)来规避监管阈值。初始规则模型仅依赖“单笔金额”字段,漏报率高达40%。项目目标是在不增加人工审核成本的前提下,将漏报率降低至15%以下。数据约束:仅能使用交易流水表、商户注册表、结算账户表,且历史数据仅保留12个月。
初始现象与关键数据:通过初步数据分析发现,可疑商户的交易笔数显著高于正常商户,且单笔金额集中在1.5万-2万元区间,交易间隔时间短(平均小于5分钟)。而正常商户的交易金额分布较为分散,交易间隔较长。
分析判断过程:我们决定构建以下衍生特征来捕捉“拆分”行为模式:
- 近1小时交易笔数:捕捉短时间内集中交易行为。
- 近1小时累计金额与当日累计金额比:识别资金快速流出的节奏。
- 金额集中度指标:计算近7天交易金额落在1.5万-2万元区间的比例。
- 交易间隔均值与标准差:刻画交易节奏的规律性。
实际操作步骤:首先,对交易流水按商户ID和时间排序,计算相邻交易的时间间隔;其次,使用滑动窗口(1小时)计算交易笔数和累计金额;最后,将所有特征进行Z-score标准化,输入XGBoost分类模型进行训练。训练集采用“时间外验证”方式,即用前9个月数据训练,后3个月数据测试。
结果对比与复盘:加入衍生特征后,模型漏报率从40%下降至12%,误报率仅上升了2个百分点。进一步分析发现,“金额集中度指标”和“近1小时交易笔数”是贡献度最高的两个特征。复盘经验:单一维度的特征(如仅金额)容易被规避,而组合了时间、金额、频次的多维特征能有效刻画行为模式。但需注意,此类特征在节假日或大促期间可能产生误报,需要引入日历因子进行修正。
4.5 常见误区与质量保障
常见误区一:过度清洗导致信息丢失。例如,将“交易对手方为境外”的缺失值直接填充为“境内”,会严重削弱跨境风险识别能力。建议对缺失值单独编码,保留“未知”状态。
常见误区二:特征计算的数据泄漏。在构建时间窗口特征时,如果使用了未来数据(如用当天的数据预测当天的标签),会导致模型上线后效果断崖式下跌。务必使用“历史窗口”而非“全窗口”计算特征。
常见误区三:忽视数据漂移。客户行为会随时间变化,特征的分布也会发生偏移。建议每月计算特征分布的PSI值,若PSI大于0.25,需触发特征重建流程。
质量保障机制:建立特征仓库(Feature Store),统一管理特征定义、计算逻辑、版本和血缘关系。每次模型训练前,自动校验特征数据的新鲜度、完整性和分布一致性,确保训练与推理环境的数据口径一致。