4. 账户余额基础特征构建

账户余额是信贷风控、客户经营与反欺诈场景中最基础、最稳定、也最容易被低估的一类数据。它不像交易流水那样高频嘈杂,也不像征信报告那样低频滞后,而是以日粒度或月粒度持续记录客户资金沉淀状态。围绕余额构建统计特征,本质上是把一条时间序列压缩成若干可解释、可比较、可入模的数值,从而回答三个核心问题:客户现在有多少钱、过去一段时间资金水平如何、资金是在变多还是变少、变化是否剧烈。

核心原理:余额特征的四类信息维度

余额基础特征可以归纳为四个维度。第一是水平维度,包括当前余额、平均余额、中位数余额、最大最小余额,反映客户资金体量。第二是变化维度,包括余额变动额、变动率、净流入流出,反映资金增减方向与幅度。第三是趋势维度,包括线性斜率、首尾差、趋势强度,反映资金是在持续积累还是持续消耗。第四是波动维度,包括标准差、变异系数、极差、波动率,反映资金稳定性与不确定性。四类维度组合后,才能较完整地刻画一个账户的“资金画像”。

余额特征的核心价值不在于单点数值大小,而在于把时间序列转化为可比较的统计量。同样当前余额为 5 万元的客户,一个余额长期稳定在 5 万元,另一个刚从 50 万元降到 5 万元,其风险含义完全不同。

方法流程:从原始余额表到特征宽表

假设原始数据为账户日终余额表,字段包括 account_id、stat_date、balance。构建基础特征的标准流程如下:

  1. 按 account_id 分组,按 stat_date 升序排序,确保时间顺序正确。
  2. 确定观察窗口,例如近 30 天、近 90 天、近 180 天,不同窗口分别计算。
  3. 计算水平类统计量:当前余额、平均余额、中位数余额、最大最小余额。
  4. 计算变化类统计量:期末减期初、相邻日变动、净变动率。
  5. 计算趋势类统计量:对余额序列拟合线性回归,取斜率作为趋势值。
  6. 计算波动类统计量:标准差、变异系数、极差、波动率。
  7. 对缺失值、异常值做统一处理,输出账户级特征宽表。

下面给出一个可运行的 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 的资金消耗速度和不确定性显著更高,在贷后预警中应被优先关注。这说明余额特征必须组合使用,单点特征容易产生误判。

实际工程中建议按 7 天、30 天、90 天、180 天多窗口分别计算,并保留窗口间比值,例如近 7 天平均余额除以近 90 天平均余额,用于捕捉短期突变。

误区与复盘

  • 误区一:只取当前余额。当前余额受单日大额进出影响大,容易把临时过账误判为真实资金水平。
  • 误区二:忽略时间顺序。未按日期排序直接计算首尾差,会导致变动方向完全错误。
  • 误区三:波动率分母未做保护。平均余额接近零时,变异系数会爆炸,需加极小值或改用绝对波动。
  • 误区四:趋势斜率对异常值敏感。建议先做缩尾处理,或使用稳健回归,避免单日巨额进出扭曲趋势。
  • 误区五:不同窗口特征混用不标注。必须明确每个特征对应的时间窗口,否则入模后无法解释。
余额类特征对缺失值非常敏感。若某账户在窗口内只有少量天数有余额记录,直接计算均值或趋势会产生严重偏差。建议同时输出有效天数占比,并在特征工程阶段设置最小有效天数阈值,例如少于 7 天不计算趋势类特征。

完成基础余额特征构建后,账户的资金水平、变化方向、趋势强弱和波动程度就被压缩为一组结构化数值。这些特征既可以独立入模,也可以作为后续利用率、还款行为特征的输入基础。关键在于:每个特征都要有明确的窗口定义、计算逻辑和业务解释,避免为了数量而堆砌无意义的统计量。