4、数据基础与特征工程:交易数据、客户数据、账户数据的结构、清洗、标准化,以及衍生特征(如交易频率、金额波动、地域跳跃)的构建方法

可疑交易监测模型的性能上限,首先取决于输入数据的质量与特征表达的有效性。在反洗钱(AML)实务中,模型团队常面临数据分散、口径不一、噪声大、标签稀疏等挑战。本章聚焦于三类核心数据源——交易数据、客户数据、账户数据——的底层结构解析、清洗标准化流程,以及面向监测场景的衍生特征构建方法论。我们将从数据字典的解剖开始,逐步深入到特征工程的具体操作与实战案例,帮助学员建立从“原始数据”到“可用特征”的完整工程链路。

数据基础与特征工程链路图 数据源层 交易数据 流水/渠道/对手方 客户数据 身份/风险等级/职业 账户数据 开户/余额/状态/限额 清洗与标准化 去重/去空/格式统一 时间戳/金额/币种 异常值/逻辑校验 借贷方向/账户状态 客户/账户/交易关联 外键映射/维度对齐 衍生特征构建 基础统计特征 频次/均值/标准差 时序与波动特征 金额突变/频率激增 地域与网络特征 地域跳跃/对手方集中度 模型输入 特征矩阵 数值型/类别型 时间窗口切片 日/周/月粒度 标签对齐 可疑/正常样本 反馈迭代:模型评估 → 特征调优 → 数据质量再治理 核心原则:数据质量是模型上限,特征工程是逼近上限的手段

上图展示了从数据源到模型输入的完整工程链路。在实际项目中,这一链路并非一次性完成,而是需要根据模型上线后的反馈进行持续迭代。下面我们将分模块深入讲解每个环节的具体操作与关键技术点。

4.1 核心数据结构解析:三类数据的底层逻辑

核心原理:可疑交易监测所需的数据通常分布在核心系统、渠道系统、反洗钱名单系统等多个异构数据源中。交易数据描述“发生了什么”,客户数据回答“是谁做的”,账户数据则提供“资金载体”的状态。三者通过客户ID、账户ID等主外键关联,构成星型或雪花型数据模型。理解每类数据的字段语义、粒度(交易级、账户级、客户级)和生命周期,是后续清洗与特征构建的前提。

数据类别关键字段示例典型粒度常见质量问题
交易数据交易流水号、交易时间、交易金额、借贷标志、对手方账号、渠道编码、交易类型、商户号、IP/MAC地址单笔交易时间戳格式不一致、金额精度丢失、对手方信息缺失、重复记录
客户数据客户号、证件类型/号码、姓名、国籍、职业、行业、风险等级、开户机构、客户经理单一客户证件号码脱敏不一致、风险等级更新滞后、多客户号未合并
账户数据账号、开户日期、账户状态(正常/冻结/销户)、币种、余额、交易限额、开户网点、签约产品单一账户状态字段枚举值混乱、余额与流水不一致、历史状态未留痕

操作流程:在项目启动初期,建议按以下步骤进行数据盘点:

  1. 数据字典梳理:收集所有相关系统的数据字典,标记字段含义、类型、取值范围、是否可空。
  2. 粒度确认:明确每张表的主键和唯一约束,确认数据是增量还是全量存储。
  3. 关联关系验证:通过SQL抽样验证客户-账户-交易之间的关联命中率,识别孤儿数据。
  4. 质量基线建立:记录关键字段的缺失率、重复率、异常值比例,作为后续清洗效果的对比基线。
风险提示:不要轻信业务系统的“标准”字段。例如,某些渠道的“交易金额”可能以“分”为单位,而核心系统以“元”为单位;某些系统的“交易时间”是本地时间,而另一些是服务器UTC时间。这类隐性差异是特征工程中最常见的“坑”。

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小时交易笔数:捕捉短时间内集中交易行为。
  2. 近1小时累计金额与当日累计金额比:识别资金快速流出的节奏。
  3. 金额集中度指标:计算近7天交易金额落在1.5万-2万元区间的比例。
  4. 交易间隔均值与标准差:刻画交易节奏的规律性。

实际操作步骤:首先,对交易流水按商户ID和时间排序,计算相邻交易的时间间隔;其次,使用滑动窗口(1小时)计算交易笔数和累计金额;最后,将所有特征进行Z-score标准化,输入XGBoost分类模型进行训练。训练集采用“时间外验证”方式,即用前9个月数据训练,后3个月数据测试。

结果对比与复盘:加入衍生特征后,模型漏报率从40%下降至12%,误报率仅上升了2个百分点。进一步分析发现,“金额集中度指标”和“近1小时交易笔数”是贡献度最高的两个特征。复盘经验:单一维度的特征(如仅金额)容易被规避,而组合了时间、金额、频次的多维特征能有效刻画行为模式。但需注意,此类特征在节假日或大促期间可能产生误报,需要引入日历因子进行修正。

总结复盘:特征工程不是一次性的工作。随着业务发展,可疑行为模式会演变,特征也需要持续迭代。建议建立特征监控体系,定期评估特征的稳定性(PSI)和区分度(IV值),及时淘汰失效特征,补充新特征。

4.5 常见误区与质量保障

常见误区一:过度清洗导致信息丢失。例如,将“交易对手方为境外”的缺失值直接填充为“境内”,会严重削弱跨境风险识别能力。建议对缺失值单独编码,保留“未知”状态。

常见误区二:特征计算的数据泄漏。在构建时间窗口特征时,如果使用了未来数据(如用当天的数据预测当天的标签),会导致模型上线后效果断崖式下跌。务必使用“历史窗口”而非“全窗口”计算特征。

常见误区三:忽视数据漂移。客户行为会随时间变化,特征的分布也会发生偏移。建议每月计算特征分布的PSI值,若PSI大于0.25,需触发特征重建流程。

质量保障机制:建立特征仓库(Feature Store),统一管理特征定义、计算逻辑、版本和血缘关系。每次模型训练前,自动校验特征数据的新鲜度、完整性和分布一致性,确保训练与推理环境的数据口径一致。