第一层:原始交易特征——字段提取与清洗
原始交易特征是反洗钱特征分层体系的最底层,也是所有衍生特征与行为画像的数据基础。这一层直接面对金融机构核心交易流水中的原始字段,不经过任何聚合或统计变换。如果原始字段提取不完整、清洗不彻底,上层所有特征都会产生偏差甚至错误。
3.1 原始交易特征的核心字段
根据 FATF 建议与国内反洗钱数据报送标准,一笔交易记录至少应包含以下 6 类原始字段:
| 字段类别 | 典型字段 | 数据来源 | 清洗要点 |
|---|---|---|---|
| 交易标识 | 交易流水号、内部参考号 | 核心系统 | 去重、空值检查 |
| 交易金额 | 交易金额、币种、折合人民币金额 | 交易流水 | 负值处理、精度截断、币种标准化 |
| 交易时间 | 交易时间戳、记账日期、清算日期 | 交易流水 | 时区统一、异常时间戳过滤 |
| 交易对手方 | 对手方账号、对手方名称、对手方证件号 | 交易流水/客户信息 | 脱敏、格式校验、关联客户号 |
| 交易渠道 | 柜面、网银、手机银行、ATM、第三方支付 | 渠道系统 | 渠道编码统一、缺失值填充 |
| 交易类型 | 转账、汇款、消费、取现、投资 | 交易流水 | 类型映射、异常类型标记 |
实战经验:在银行反洗钱项目中,交易金额字段的负值清洗是最容易被忽略的环节。部分系统将退款记为负金额,而反洗钱模型通常只处理正向金额。建议在清洗阶段将负值金额单独标记为“退款类型”,并取绝对值参与金额特征计算。
3.2 原始交易特征的提取流程
从源系统到特征宽表,原始交易特征需要经过 4 个标准步骤:
- 字段映射:将源系统字段名映射到统一特征命名规范,例如
tx_amt、tx_dt、counter_party_id。 - 数据类型转换:金额字段统一为
DECIMAL(18,2),时间字段统一为TIMESTAMP,证件号统一为VARCHAR。 - 缺失值处理:对手方信息缺失时,标记为
UNKNOWN并记录缺失率;金额缺失时,整笔交易标记为异常。 - 异常值过滤:交易时间戳早于系统上线日期或晚于当前日期 +1 天的记录,直接剔除。
SQL 实现提示:在 Hive 或 Spark SQL 中,建议使用
CASE WHEN 对交易金额做分层标记,例如:CASE WHEN tx_amt < 0 THEN 'REFUND' WHEN tx_amt = 0 THEN 'ZERO' ELSE 'NORMAL' END AS amt_flag
3.3 原始交易特征清洗的常见陷阱
- 时间戳时区不一致:跨分行交易可能混用 UTC 和本地时间,必须统一转换为同一时区后再提取特征。
- 对手方信息重复:同一客户在不同系统中有多个客户号,需要先做客户号归并(ID Mapping)再提取对手方特征。
- 金额精度丢失:部分源系统金额字段为
FLOAT类型,直接读取会导致精度误差,必须使用DECIMAL或BIGINT(以分为单位)存储。 - 渠道编码不统一:柜面交易在 A 系统编码为
01,在 B 系统编码为COUNTER,需要建立统一的渠道字典表。
3.4 原始交易特征分层结构图
下图展示了原始交易特征在整个反洗钱特征分层体系中的位置与内部字段结构:
3.5 原始交易特征清洗的 SQL 实现示例
以下 SQL 代码展示了从原始交易流水表中提取并清洗核心字段的典型实现:
-- 原始交易特征清洗:字段提取、类型转换、缺失值处理、异常值过滤
WITH raw_tx AS (
SELECT
tx_seq_no AS tx_id,
CAST(tx_amount AS DECIMAL(18,2)) AS tx_amt,
CASE
WHEN tx_amount < 0 THEN 'REFUND'
WHEN tx_amount = 0 THEN 'ZERO'
ELSE 'NORMAL'
END AS amt_flag,
COALESCE(ccy_code, 'CNY') AS ccy_code,
FROM_UNIXTIME(tx_timestamp) AS tx_dt,
DATE_FORMAT(FROM_UNIXTIME(tx_timestamp), 'yyyy-MM-dd') AS tx_date,
COALESCE(counter_party_id, 'UNKNOWN') AS counter_party_id,
COALESCE(channel_code, 'OTHER') AS channel_code,
COALESCE(tx_type_code, 'UNKNOWN') AS tx_type_code,
data_source
FROM source_tx_table
WHERE tx_timestamp IS NOT NULL
AND tx_timestamp >= UNIX_TIMESTAMP('2010-01-01')
AND tx_timestamp <= UNIX_TIMESTAMP(DATE_ADD(CURRENT_DATE, 1))
)
SELECT
tx_id,
tx_amt,
amt_flag,
ccy_code,
tx_dt,
tx_date,
counter_party_id,
channel_code,
tx_type_code,
data_source
FROM raw_tx
WHERE tx_amt IS NOT NULL; -- 剔除金额为空的异常记录
注意:上述 SQL 中的
FROM_UNIXTIME 和 UNIX_TIMESTAMP 函数在 Hive 和 MySQL 中语法略有差异。在生产环境中,请根据实际数据库引擎调整时间戳转换函数。建议在清洗阶段保留原始时间戳字段,便于后续审计回溯。
3.6 原始交易特征质量评估指标
在完成第一层特征提取后,建议对清洗结果进行质量评估,确保数据可用性:
| 评估维度 | 指标 | 合格标准 | 监控频率 |
|---|---|---|---|
| 完整性 | 字段缺失率 | 核心字段缺失率 < 1% | 每日 |
| 准确性 | 金额精度误差率 | 误差率 = 0% | 每批次 |
| 一致性 | 渠道编码标准化率 | 标准化率 > 99% | 每周 |
| 时效性 | 交易时间戳异常比例 | 异常比例 < 0.1% | 每日 |
| 唯一性 | 交易流水号重复率 | 重复率 = 0% | 每批次 |
原始交易特征的质量直接决定了上层衍生特征与行为画像的可靠性。建议在数据仓库中建立专门的 数据质量监控表,每日自动扫描上述指标,当指标超出合格标准时触发告警,通知数据治理团队介入处理。