2. 交易数据源解析:常见交易数据字段及其业务含义

交易风控的本质是从海量、异构的交易数据中提取出能够区分“正常”与“欺诈”行为的信号。要构建有效的特征,首先必须深刻理解每一类数据源背后的业务含义。本章将系统解析交易链路中六大核心数据源:订单、用户、商户、设备、IP 和 地理位置,并阐明每个字段在风控场景下的潜在价值。

核心原则: 风控特征工程不是简单的字段搬运,而是基于业务逻辑的“信号再编码”。理解字段的生成机制与异常模式,是特征有效性的前提。

2.1 交易数据全景图

一次完整的线上交易,会串联起多个系统,留下多维度的数据足迹。下图展示了交易事件发生时,各数据源之间的关联关系与数据流向。

交易数据源全景关联图 交易事件 订单数据 用户数据 商户数据 设备数据 IP 数据 地理位置 数据关联价值 交叉验证各维度 信息一致性 发现设备/IP/地址 之间的异常聚集

2.2 订单数据字段解析

订单数据是交易的核心载体,记录了交易本身的属性。风控系统首先关注的便是订单层面的异常信号。

字段名称 业务含义 风控关注点
order_id 订单唯一标识 是否连续、是否异常跳跃
amount 交易金额(含币种) 金额分布、整数金额、与历史偏离度
currency 交易币种 是否与用户/商户所在地区匹配
product_id 商品/服务ID 是否为高风险品类(虚拟商品、充值卡)
quantity 购买数量 批量购买、与历史行为不一致
order_time 订单创建时间 凌晨交易、节假日交易、与历史活跃时段偏离
payment_method 支付方式(卡、钱包、转账) 是否频繁更换、是否为高风险支付渠道
is_first_order 是否首单 首单欺诈率显著高于复购
特征工程提示: 订单金额的 log1p 变换、金额与历史均值的 Z-Score、订单时间与用户典型活跃时段的差值(分钟级),都是高频使用的衍生特征。

2.3 用户数据字段解析

用户数据刻画了交易主体的身份与行为画像。欺诈分子通常会使用虚假或盗用的身份信息。

字段名称 业务含义 风控关注点
user_id 用户唯一标识 是否为新建账号、账号年龄
register_time 注册时间 注册距今时长、是否为批量注册
register_ip 注册IP 注册IP与交易IP是否一致、IP是否在黑名单
phone_number 绑定手机号 是否为虚拟号段、是否与多个账号关联
email_domain 邮箱域名 是否为临时邮箱、一次性邮箱
name 用户姓名 是否与支付卡持卡人姓名一致
id_card 身份证号(脱敏) 年龄校验、是否与多个账号共用
vip_level 用户等级 低等级用户突然高额消费
注意: 用户数据中的 phone_number 和 email_domain 是构建“关联网络特征”的关键字段。一个手机号关联超过 3 个账号,通常意味着存在团伙风险。

2.4 商户数据字段解析

商户数据在 B2C 或平台型交易中至关重要。商户本身可能被黑产控制,或存在恶意经营行为。

字段名称 业务含义 风控关注点
merchant_id 商户唯一标识 商户入驻时长、历史投诉率
merchant_category 商户类别(MCC) 高风险 MCC(赌博、成人、虚拟货币)
merchant_country 商户所在国家 是否与用户 IP 所在地冲突
settlement_account 结算账户 结算账户是否与历史欺诈商户关联
daily_txn_count 商户日交易量 交易量突增、测试交易模式

2.5 设备数据字段解析

设备指纹是识别欺诈团伙和模拟器攻击的核心手段。设备数据通常由 SDK 采集,具有高维度、高噪声的特点。

字段名称 业务含义 风控关注点
device_id 设备唯一指纹 是否在黑名单、是否与多个账号关联
device_type 设备型号(如 iPhone 14) 是否为模拟器、设备型号与系统版本是否匹配
os_version 操作系统版本 版本过低、版本与设备型号不匹配
screen_resolution 屏幕分辨率 模拟器常用分辨率(如 1080x1920)
is_rooted 是否越狱/ROOT 越狱设备风险显著升高
is_emulator 是否为模拟器 模拟器是批量欺诈的典型特征
language 系统语言 系统语言与 IP 所在地语言不一致
timezone 设备时区 时区与 IP 所在地时区偏差过大
特征工程提示: 设备数据中,“device_id 关联账号数”和“device_id 关联 IP 数”是识别设备农场和代理 IP 池的强特征。建议使用 groupby('device_id')['user_id'].nunique() 进行聚合。

2.6 IP 数据字段解析

IP 地址是连接用户网络身份与物理位置的关键桥梁。IP 数据具有动态性,需要结合外部情报进行解析。

字段名称 业务含义 风控关注点
ip_address 客户端 IP 是否在黑名单 IP 库中
ip_country IP 所属国家 是否与用户注册地/商户所在地一致
ip_city IP 所属城市 是否与收货地址城市一致
isp 网络运营商 是否为数据中心 IP、代理 IP
is_proxy 是否为代理/VPN 代理 IP 是欺诈行为的高危信号
connection_type 网络类型(WiFi/4G/5G) 频繁切换网络类型、使用公共 WiFi
注意: 不要直接使用原始 IP 地址作为特征,因为其基数过大且缺乏泛化能力。应使用 IP 的衍生特征,如 ip_country、isp、is_proxy,以及基于 IP 的统计特征(如“该 IP 过去 1 小时交易次数”)。

2.7 地理位置数据字段解析

地理位置数据(GPS、基站定位、WiFi 定位)提供了用户物理位置的精确信息,是识别位置欺诈和物流欺诈的关键。

字段名称 业务含义 风控关注点
latitude 纬度 是否与 IP 定位经纬度一致
longitude 经度 是否与 IP 定位经纬度一致
gps_accuracy GPS 精度(米) 精度过低可能为伪造定位
geohash 地理哈希编码 用于快速计算距离和区域聚集
shipping_address 收货地址 是否与 GPS 位置匹配、是否为虚假地址
address_type 地址类型(住宅/公司/驿站) 驿站地址在欺诈交易中占比较高

2.8 数据源交叉验证:发现异常模式

单一数据源的特征往往容易被绕过,而多数据源交叉验证是提升风控鲁棒性的关键。下图展示了如何通过字段间的逻辑一致性来识别欺诈行为。

多数据源交叉验证:异常模式识别 ✅ 正常交易模式 用户常驻地:北京 IP 定位:北京 GPS 定位:北京 收货地址:北京 所有维度信息一致 风险评分低 ❌ 异常欺诈模式 用户常驻地:北京 IP 定位:美国 GPS 定位:关闭 收货地址:广州 多维度信息冲突 风险评分高

2.9 实战:字段解析与初步特征构建

下面通过一个简化的 Python 代码示例,展示如何对原始交易数据进行字段解析,并构建几个基础的风控特征。

import pandas as pd
import numpy as np

# 模拟原始交易数据
data = {
    'order_id': ['ORD001', 'ORD002', 'ORD003'],
    'amount': [150.00, 9999.99, 35.50],
    'user_id': ['U1001', 'U1002', 'U1001'],
    'register_days': [365, 1, 365],  # 注册天数
    'device_id': ['DEV_A', 'DEV_B', 'DEV_A'],
    'ip_country': ['CN', 'US', 'CN'],
    'gps_country': ['CN', 'CN', 'CN'],
    'is_proxy': [0, 1, 0]
}

df = pd.DataFrame(data)

# 特征工程:字段解析与衍生
# 1. 金额异常度:与用户历史均值比较(此处简化,使用全局均值)
global_mean_amount = df['amount'].mean()
df['amount_z_score'] = (df['amount'] - global_mean_amount) / df['amount'].std()

# 2. 账号年龄特征:注册天数取对数
df['log_register_days'] = np.log1p(df['register_days'])

# 3. 设备关联账号数(示例中手动计算)
device_user_count = df.groupby('device_id')['user_id'].nunique().to_dict()
df['device_user_count'] = df['device_id'].map(device_user_count)

# 4. 交叉验证特征:IP 国家与 GPS 国家是否一致
df['ip_gps_match'] = (df['ip_country'] == df['gps_country']).astype(int)

# 5. 代理 IP 标记
df['is_high_risk_ip'] = df['is_proxy']

print("衍生特征预览:")
print(df[['order_id', 'amount_z_score', 'log_register_days',
          'device_user_count', 'ip_gps_match', 'is_high_risk_ip']])