4. 账户余额基础特征构建
账户余额是信贷风控、客户经营与反欺诈场景中最基础、最稳定、也最容易被低估的一类数据。它不像交易流水那样高频嘈杂,也不像征信报告那样低频滞后,而是以日粒度或月粒度持续记录客户资金沉淀状态。围绕余额构建统计特征,本质上是把一条时间序列压缩成若干可解释、可比较、可入模的数值,从而回答三个核心问题:客户现在有多少钱、过去一段时间资金水平如何、资金是在变多还是变少、变化是否剧烈。
核心原理:余额特征的四类信息维度
余额基础特征可以归纳为四个维度。第一是水平维度,包括当前余额、平均余额、中位数余额、最大最小余额,反映客户资金体量。第二是变化维度,包括余额变动额、变动率、净流入流出,反映资金增减方向与幅度。第三是趋势维度,包括线性斜率、首尾差、趋势强度,反映资金是在持续积累还是持续消耗。第四是波动维度,包括标准差、变异系数、极差、波动率,反映资金稳定性与不确定性。四类维度组合后,才能较完整地刻画一个账户的“资金画像”。
方法流程:从原始余额表到特征宽表
假设原始数据为账户日终余额表,字段包括 account_id、stat_date、balance。构建基础特征的标准流程如下:
- 按
account_id分组,按stat_date升序排序,确保时间顺序正确。 - 确定观察窗口,例如近 30 天、近 90 天、近 180 天,不同窗口分别计算。
- 计算水平类统计量:当前余额、平均余额、中位数余额、最大最小余额。
- 计算变化类统计量:期末减期初、相邻日变动、净变动率。
- 计算趋势类统计量:对余额序列拟合线性回归,取斜率作为趋势值。
- 计算波动类统计量:标准差、变异系数、极差、波动率。
- 对缺失值、异常值做统一处理,输出账户级特征宽表。
下面给出一个可运行的 Python 示例,使用 pandas 完成核心计算:
import pandas as pd
import numpy as np
# 假设 df 包含 account_id, stat_date, balance
df = df.sort_values(["account_id", "stat_date"])
def build_balance_features(g):
b = g["balance"].astype(float)
n = len(b)
cur = b.iloc[-1]
avg = b.mean()
med = b.median()
mx, mn = b.max(), b.min()
chg = b.iloc[-1] - b.iloc[0]
chg_rate = chg / (abs(b.iloc[0]) + 1e-6)
std = b.std(ddof=0)
cv = std / (abs(avg) + 1e-6)
rng = mx - mn
vol = std / (abs(avg) + 1e-6)
# 线性趋势斜率
x = np.arange(n)
slope = np.polyfit(x, b.values, 1)[0] if n >= 2 else 0.0
return pd.Series({
"cur_balance": cur,
"avg_balance": avg,
"median_balance": med,
"max_balance": mx,
"min_balance": mn,
"balance_change": chg,
"balance_change_rate": chg_rate,
"balance_std": std,
"balance_cv": cv,
"balance_range": rng,
"balance_volatility": vol,
"balance_trend": slope
})
feat = df.groupby("account_id").apply(build_balance_features).reset_index()
业务含义:每个特征在风控与经营中的解释
当前余额直接反映客户当下可动用资金水平,是额度审批和贷后监控的强信号。平均余额比当前余额更稳定,能削弱单日大额进出带来的噪声。余额变动额和变动率刻画资金增减方向,若短期内大幅下降,可能预示收入中断、债务挤压或资金转移。余额趋势斜率若持续为负,说明账户处于消耗状态,即使当前余额尚可,也需警惕未来还款能力下滑。余额波动率越高,说明资金进出频繁且不稳定,客户现金流管理能力可能较弱,违约不确定性上升。
| 特征名称 | 计算方式 | 业务含义 | 典型风险指向 |
|---|---|---|---|
| 当前余额 | 窗口内最后一天余额 | 当下资金水平 | 余额骤降需关注 |
| 平均余额 | 窗口内余额均值 | 长期资金沉淀能力 | 均值过低授信谨慎 |
| 余额变动额 | 期末余额减期初余额 | 资金净增减方向 | 大幅为负预警 |
| 余额变动率 | 变动额除以期初余额 | 相对变化幅度 | 降幅过大风险高 |
| 余额趋势 | 线性回归斜率 | 资金积累或消耗趋势 | 持续负斜率预警 |
| 余额波动率 | 标准差除以平均余额 | 资金稳定性 | 高波动不确定性大 |
案例场景:两个当前余额相同的客户
客户 A 近 90 天余额稳定在 5 万元上下,标准差很小,趋势斜率接近零,波动率低于 0.05。客户 B 近 90 天余额从 50 万元一路降到 5 万元,趋势斜率为明显负值,波动率超过 0.8。若只看当前余额,两人相同;但结合平均余额、趋势和波动率,客户 B 的资金消耗速度和不确定性显著更高,在贷后预警中应被优先关注。这说明余额特征必须组合使用,单点特征容易产生误判。
误区与复盘
- 误区一:只取当前余额。当前余额受单日大额进出影响大,容易把临时过账误判为真实资金水平。
- 误区二:忽略时间顺序。未按日期排序直接计算首尾差,会导致变动方向完全错误。
- 误区三:波动率分母未做保护。平均余额接近零时,变异系数会爆炸,需加极小值或改用绝对波动。
- 误区四:趋势斜率对异常值敏感。建议先做缩尾处理,或使用稳健回归,避免单日巨额进出扭曲趋势。
- 误区五:不同窗口特征混用不标注。必须明确每个特征对应的时间窗口,否则入模后无法解释。
完成基础余额特征构建后,账户的资金水平、变化方向、趋势强弱和波动程度就被压缩为一组结构化数值。这些特征既可以独立入模,也可以作为后续利用率、还款行为特征的输入基础。关键在于:每个特征都要有明确的窗口定义、计算逻辑和业务解释,避免为了数量而堆砌无意义的统计量。