4. 特征工程基础:交易金额、频率、对手方、时间窗口等基础特征提取

特征工程是连接原始交易数据与可疑推理模型的桥梁。原始交易日志中的字段(如交易时间、金额、账户ID)无法直接用于异常检测,必须通过领域知识将其转化为具有统计意义、行为表征能力和区分度的特征变量。本章聚焦于反洗钱场景下最核心的四类基础特征:金额特征、频率特征、对手方特征和时间窗口特征。

4.1 金额特征:异常值、整倍数与拆分模式

金额是可疑交易最直观的数值信号。洗钱者常利用特定金额模式规避监管,例如略低于大额报告阈值的“结构化交易”、整数倍转账、以及快速进出资金的“过桥”行为。

特征名称 计算方式 可疑信号
单笔金额偏离度 (交易金额 - 账户历史均值) / 历史标准差 Z-score > 3 或 < -3
金额整数倍标志 交易金额 % 10000 == 0 或 % 50000 == 0 频繁出现整万/整十万
接近阈值金额 abs(交易金额 - 50000) < 1000 刻意规避大额报告
金额尾数分布 交易金额最后两位数字的频次统计 尾数集中在 00, 50, 99
累计净流量 当日/当周累计流入 - 累计流出 净流量接近零(过账)
实战要点:金额特征必须结合账户历史基线。一个普通个人账户单笔转账50万元是强异常,但一个对公贸易账户同样金额可能属于正常经营。建议按账户类型(个人/对公/同业)分别计算统计基线。

4.2 频率特征:交易密度与突发性检测

频率特征刻画账户在单位时间内的交易活跃程度。洗钱账户往往呈现“长期休眠—突然高频—快速归零”的脉冲式行为模式。

  • 交易笔数统计:过去1小时、24小时、7天内的交易总笔数。
  • 交易间隔特征:相邻两笔交易的时间间隔均值、中位数、最小值、标准差。间隔极短(如<1秒)可能为程序化交易。
  • 突发性指数:当前时段交易笔数 / 历史同期平均笔数。比值 > 5 视为突发活跃。
  • 零交易天数占比:过去30天中交易笔数为0的天数比例。占比过高说明账户长期休眠。
# 示例:计算账户过去24小时交易笔数(Python伪代码)
import pandas as pd

def calc_tx_frequency(tx_df, account_id, lookback_hours=24):
    now = pd.Timestamp.now()
    cutoff = now - pd.Timedelta(hours=lookback_hours)
    mask = (tx_df['account'] == account_id) & (tx_df['tx_time'] >= cutoff)
    return mask.sum()

4.3 对手方特征:交易网络与关联图谱

对手方特征将单笔交易扩展为账户间的关联关系。洗钱网络通常涉及多级账户、循环转账和集中归集,这些模式在对手方维度上会留下明显痕迹。

特征名称 定义 计算逻辑
对手方唯一数 过去N天内交易的对手方数量 len(set(对手方ID列表))
对手方集中度 交易金额最大的前3个对手方占比 top3金额 / 总金额
新对手方标志 当前对手方是否从未在历史中出现 布尔值:True/False
对手方风险等级 对手方账户的历史可疑评分 从风险名单或历史模型获取
循环交易检测 A→B→C→A 的闭环路径 图算法:检测有向环
进阶技巧:对手方特征可与图神经网络(GNN)结合,将账户视为节点、交易视为边,自动学习可疑子图结构。但在基础特征阶段,建议先使用上述统计特征快速构建基线模型。

4.4 时间窗口特征:滑动窗口与周期模式

时间窗口特征通过聚合历史数据,将静态交易转化为动态行为序列。常见的窗口类型包括固定窗口(如过去24小时)、滑动窗口(如过去30笔交易)和周期窗口(如过去30天同一小时)。

# 滑动窗口特征提取示例(窗口大小=10笔交易)
def sliding_window_features(tx_df, window_size=10):
    tx_df = tx_df.sort_values('tx_time')
    features = []
    for i in range(window_size, len(tx_df)):
        window = tx_df.iloc[i-window_size:i]
        feat = {
            'window_mean': window['amount'].mean(),
            'window_std': window['amount'].std(),
            'window_max': window['amount'].max(),
            'window_min': window['amount'].min(),
            'window_sum': window['amount'].sum(),
            'window_count': len(window),
            'time_span': (window['tx_time'].max() - window['tx_time'].min()).total_seconds()
        }
        features.append(feat)
    return pd.DataFrame(features)

时间窗口特征的核心价值在于捕捉行为趋势的变化。例如,一个账户过去30天的日均交易额为5万元,但最近3天日均交易额骤升至200万元,这种趋势变化是典型的可疑信号。

4.5 特征工程全景图

以下SVG图展示了从原始交易日志到基础特征向量的完整提取流程,以及四类特征之间的协同关系。

特征工程全景:从原始交易到基础特征向量 原始交易日志 金额特征 偏离度 / 整倍数 / 阈值 频率特征 笔数 / 间隔 / 突发性 对手方特征 唯一数 / 集中度 / 风险 时间窗口 滑动/周期 特征融合与标准化 基础特征向量(输入模型) 💡 特征工程原则: ① 特征必须可解释,每个特征都能对应具体的洗钱手法;② 优先使用统计特征,再逐步引入复杂特征;③ 特征之间避免高度共线性,必要时做PCA或特征选择。

4.6 特征工程避坑指南

常见错误:
  • 数据泄露:使用未来信息构造特征。例如用“当天总交易笔数”作为当天每笔交易的特征,实际上在交易发生时并不知道全天总量。正确做法是使用截止到当前时刻的历史窗口。
  • 特征膨胀:盲目生成数百个特征,导致模型过拟合且难以解释。建议从20~30个核心特征起步,逐步迭代。
  • 忽视时间衰减:30天前的交易与3分钟前的交易对当前行为的影响权重应不同。建议引入指数衰减权重或时间衰减函数。

4.7 本章小结

基础特征提取是可疑交易推理链路中承上启下的关键环节。金额特征捕捉数值异常,频率特征刻画行为节奏,对手方特征揭示网络关系,时间窗口特征追踪趋势变化。四类特征相互补充,共同构成后续模型训练的输入基底。在实际项目中,建议先对原始交易数据进行质量探查(缺失值、异常值、重复记录),再按上述框架逐类提取特征,最后通过相关性分析和特征重要性评估进行筛选。