MCM520 ← 资料站首页 中小微企业的信贷决策(2020C)优秀范文二:无信贷记录企业的信用推断 打开交互阅读器 →

中小微企业的信贷决策(2020C)优秀范文二:无信贷记录企业的信用推断

摘要

第一篇用逻辑回归在 123 家有信贷记录的企业上建立了 A/B/C/D 信用评级体系。本问面对更现实也更棘手的场景:银行还有 302 家无信贷记录的中小微企业,它们没有历史违约标签,无法直接套用有监督校准。本文提出基于特征相似性的最近邻(kNN)信用推断:沿用第一篇全样本统一坐标系下的四维特征(销项、毛利率、税额、发票稳定度),以归一化欧氏距离度量新企业与 123 家参照企业的"画像相似度",取最近 5 家的加权平均校准评分作为推断评分,再套用第一篇的评级阈值(q=(0.682,−0.160,−0.663)q=(0.682,-0.160,-0.663))完成 A/B/C/D 评级,最后按同一套额度/利率/期限规则给出信贷策略。结果显示:302 家推断评级分布为 A 30 家、B 119 家、C 116 家、D 37 家;以隐藏真值评分检验,推断评级与真值评级的一致率达 84.44%84.44\%,偏差 ≤1\le1 级的比例达到 100%100\%;平均额度 221.7221.7 万元、平均利率 6.97%6.97\%。该结果表明:在没有信贷历史的情况下,凭借发票经营特征即可较可靠地推断企业信用等级,为银行拓展"首贷户"市场提供了可量化的风控抓手。

一、问题重述

银行拥有 123 家企业的历史信贷数据(含违约标签),但还有 302 家拟授信企业从未发生过信贷关系,无法用有监督方法直接评级。需要:①设计无标签企业的信用推断方法;②对 302 家逐一给出评级;③给出对应的贷款额度、利率与期限。难点在于:无标签企业没有任何违约历史可供学习,必须依赖其经营特征与"已知信用画像"的参照企业之间的相似性。

二、基本假设

  1. 企业信用与其四维经营特征(销项、毛利率、税额、稳定度)存在稳定映射,特征"相似"的企业信用水平也相似(同质性假设)。
  2. 123 家有记录企业的校准评分可作为"信用画像库":无记录企业只需在画像库中找最相似的参照,即可推断自己的信用水平。
  3. 相似性用归一化欧氏距离度量,近邻数量取 k=5k=5,按距离倒数加权(近邻贡献大)。
  4. 评级阈值沿用第一篇的 q=(0.682,−0.160,−0.663)q=(0.682,-0.160,-0.663),保证两批企业评级可比、信贷策略一致。
  5. 本问的"真值评分"(由生成模型给出)仅用于事后检验推断精度,不参与推断过程,避免循环验证。

三、符号说明

  • zf\mathbf z_f:企业 ff 的标准化特征向量(四维)。
  • d(f,g)=∑j(zf,j−zg,j)2d(f,g)=\sqrt{\sum_j (z_{f,j}-z_{g,j})^2}:ff 与参照 gg 的欧氏距离。
  • N5(f)\mathcal N_5(f):距 ff 最近的 5 家参照企业集合。
  • s^f=∑g∈N5sgd(f,g)∑g∈N51d(f,g)\hat s_f=\frac{\sum_{g\in\mathcal N_5}\frac{s_g}{d(f,g)}}{\sum_{g\in\mathcal N_5}\frac1{d(f,g)}}:ff 的推断评分(距离加权平均)。
  • acc\mathrm{acc}:推断评级与真值评级的一致率。

四、模型建立:kNN 信用推断

4.1 为什么用最近邻

有监督模型(逻辑回归)需要标签,而 302 家企业没有标签。两个可选路线:①用特征与 123 家参照的相似性直接推断——即 kNN;②先用 123 家训练回归器,再对 302 家做预测——即迁移回归。二者本质相通,但 kNN 更透明:每家的评级都能追溯到"参照了哪几家企业",可解释、可审计,符合银行风控对可解释性的要求,故本文采用 kNN。

4.2 距离度量

特征已由第一篇在全样本上 z 标准化,量纲统一,可直接用欧氏距离。若跳过标准化直接用原始特征,销项金额(万元级)将淹没毛利率与稳定度(0~1 级)的差异,相似性度量失真——标准化是 kNN 生效的前提。

4.3 加权投票

取 k=5k=5 个最近邻,以距离倒数加权平均其校准评分:
s^f=∑g∈N5(f)sg / d(f,g)∑g∈N5(f)1/d(f,g)\hat s_f=\frac{\sum_{g\in\mathcal N_5(f)} s_g\,/\,d(f,g)}{\sum_{g\in\mathcal N_5(f)} 1/d(f,g)}
距离越近权重越大;若 dd 极小(近似重合),权重趋于无穷,推断评分被该参照主导——这是期望中的行为(完全同质的企业应获得相同评级)。随后用第一篇阈值评级并套用信贷策略规则。

4.4 推断质量的检验

为防止"自说自话",用生成模型提供的隐藏真值评分检验:将推断评级与真值评级逐一比对,统计一致率 acc\mathrm{acc} 与偏差分布。若 acc 高,说明特征相似性与信用水平的关联确实存在,推断可信;若 acc 接近随机水平(25%),则说明特征不足以刻画信用,需补充维度。

五、求解结果

5.1 推断评级分布

302 家企业推断评级:A 30 家、B 119 家、C 116 家、D 37 家(图 2)。与 123 家参照的分布(A 18/B 43/C 43/D 19,占比 14.6%/35.0%/35.0%/15.4%)相比,302 家整体分布略偏向中档(A 占 9.9%、B 占 39.4%),反映无记录企业中"隐形优质户"占比不低——这正说明信贷记录缺失并不等于信用缺失,靠特征推断可把这些企业从"盲区"中识别出来。

5.2 推断精度

以隐藏真值检验:推断评级一致率 acc=84.44%\mathrm{acc}=84.44\%(255/302),偏差 1 级者 47 家、偏差 ≥2\ge2 级者 0 家(图 3)。推断评分与真值评分呈显著正相关(图 6 散点沿对角线聚集)。这意味着:每 6 家无记录企业中约 5 家能被准确评级,且评级错误全部限于相邻档位的轻微偏差,对信贷策略的实质性影响有限。

5.3 信贷策略

302 家平均额度 221.7221.7 万元、平均利率 6.97%6.97\%(图 4 与 123 家对比、图 5 各评级平均额度)。A 档平均额度最高、D 档最低;利率随评级单调上升。银行可据此为无记录企业放贷,并因推断存在误差而在额度上略保守(相对同类有记录企业可打 9 折),以吸收推断不确定性。

六、结果分析

  1. 特征相似性确实承载信用信息:84.44% 的一致率远超随机水平(25%),证明"特征相似→信用相似"的同质性假设在数据中成立。四维发票特征虽不完美,却足以支撑信贷初筛。
  2. 推断误差的方向性:偏差 1 级的 47 家中,被高估(推断高于真值)与低估大致均衡,未见系统性乐观偏差——说明 kNN 本身不偏,误差主要来自特征信息不足而非方法缺陷。
  3. 对信贷策略的影响:推断误差全部落在相邻档位,而相邻档的利率差仅 1.52.5 个百分点、额度系数差 0.050.08,故推断误差造成的定价偏差有限;且无一家偏差达到 2 级,极端错配被完全排除,可通过"首贷额度打折 + 贷后动态调级"进一步对冲。
  4. 与有监督方法的衔接:302 家推断评级后可进入贷后观察期,一旦产生实际还款记录,即回流为"有记录"样本,加入下一轮校准——推断是暂时的,数据是滚动的,这使模型随业务开展自我增强。

七、灵敏度讨论

  • 近邻数 kk:k=1k=1 时方差大(单个近邻的偶然性),kk 过大时混入不相似企业、偏差增大。k=5k=5 附近 acc 最高(k=1,3,5,7,9k=1,3,5,7,9 时 acc 分别为 77.15%,80.79%,84.44%,82.12%,81.13%77.15\%,80.79\%,84.44\%,82.12\%,81.13\%),k=5k=5 为经验最优。
  • 距离度量:改用曼哈顿距离时 acc 约 80.46%80.46\%,略低于欧氏距离;若在加权时用 1/d21/d^2(更强近邻主导),acc 约 81.5%81.5\%。欧氏 + 线性倒数权重最稳健。
  • 特征子集:只用销项+毛利率两维时 acc 降至约 67.2%67.2\%;加入税额与稳定度后升至 84.44%84.44\%,说明四维特征均贡献区分信息,发票稳定度对识别"高波动"企业尤为关键。
  • 参照库规模:若只用 60 家参照(抽样),acc 降至约 76.2%76.2\%;123 家全量参照时最优。参照库越大、覆盖的特征空间越密,推断越准——这提示银行应持续扩充标杆样本。

八、模型优缺点

优点:①无需标签即可评级,直接解决"首贷户"难题;②可解释——每家评级可回溯到具体参照企业;③与第一篇同一坐标系、同一阈值,两批结果无缝可比;④实现简单、计算量小(302×123 次距离计算毫秒级)。
缺点:①依赖"特征相似→信用相似"假设,若存在特征无法刻画的信用因子(如老板个人征信、隐性担保),推断会失真;②kNN 对特征空间稀疏区域的新企业推断方差大;③未利用 302 家企业之间的相互信息(如网络图、同行业联动);④推断精度受参照库质量影响,标杆样本若有偏,推断也会偏。

九、结论

针对 302 家无信贷记录企业,本文用 kNN(k=5k=5、距离倒数加权)在 123 家参照企业的校准评分上完成信用推断:评级分布 A 30 / B 119 / C 116 / D 37,与真值一致率 84.44%84.44\%,平均额度 221.7221.7 万元、平均利率 6.97%6.97\%。该方法把银行的信贷覆盖范围从"有记录企业"扩展到"无记录但特征可辨的企业",且推断过程透明可审计。第三篇将进一步分析:当突发因素(疫情)冲击全行业时,这套评级与信贷策略如何调整。

附录:核心 Python 实现(可复现上述数字)

import random, math
from collections import Counter
N_TOTAL, N_CR = 425, 123
KAPPA, MU0 = 2.5, -0.60
W = [0.40, 0.20, 0.25, 0.15]
QT = [0.14, 0.49, 0.84]

def gen(n, seed):
    rnd = random.Random(seed)
    firms = []
    for i in range(n):
        sales = math.exp(rnd.gauss(7.0, 0.45))
        ratio = 0.50 + 0.45 * rnd.random()
        tax = max(0.5, (sales - sales * ratio) / 1.13 * 0.13 * (0.85 + 0.3 * rnd.random()))
        stab = 0.55 + 0.43 * rnd.random()
        firms.append([sales, 1.0 - ratio, tax, stab])
    return firms

firms = gen(N_TOTAL, 2020)
mean = [sum(f[j] for f in firms) / N_TOTAL for j in range(4)]
sd = [math.sqrt(sum((f[j] - mean[j]) ** 2 for f in firms) / N_TOTAL) for j in range(4)]
def z_of(f): return [(f[j] - mean[j]) / sd[j] for j in range(4)]
def score(z): return sum(w * zj for w, zj in zip(W, z))
def p_def(s): return 1.0 / (1.0 + math.exp(KAPPA * (s - MU0)))

# ---- Q1 复刻:123 家打标签 + IRLS 校准 ----
ref = firms[:N_CR]
rnd = random.Random(2020)
y = [1 if rnd.random() < p_def(score(z_of(f))) else 0 for f in ref]
X = [[z_of(f)[0], z_of(f)[1], z_of(f)[2], z_of(f)[3], 1.0] for f in ref]
beta = [0.0] * 5
def solve(A, b):
    n = len(A); M = [A[i][:] + [b[i]] for i in range(n)]
    for col in range(n):
        piv = max(range(col, n), key=lambda r: abs(M[r][col]))
        M[col], M[piv] = M[piv], M[col]
        for r in range(col + 1, n):
            f = M[r][col] / M[col][col] if abs(M[col][col]) > 1e-12 else 0.0
            for c in range(col, n + 1): M[r][c] -= f * M[col][c]
    x = [0.0] * n
    for r in range(n - 1, -1, -1):
        x[r] = (M[r][n] - sum(M[r][c] * x[c] for c in range(r + 1, n))) / M[r][r]
    return x
for _ in range(12):
    p = [1.0 / (1.0 + math.exp(-sum(b * xj for b, xj in zip(beta, row)))) for row in X]
    grad = [0.0] * 5; H = [[0.0] * 5 for _ in range(5)]
    for i in range(N_CR):
        r = y[i] - p[i]
        for j in range(5): grad[j] += r * X[i][j]
        for j in range(5):
            for l in range(5): H[j][l] -= p[i] * (1 - p[i]) * X[i][j] * X[i][l]
    d = solve(H, [-g for g in grad])
    beta = [b + di for b, di in zip(beta, d)]
w_hat = [-b / KAPPA for b in beta[:4]]
def cal_score(f): return sum(wh * zj for wh, zj in zip(w_hat, z_of(f)))

scores_ref = [cal_score(f) for f in ref]
ss = sorted(scores_ref, reverse=True)
qs = [round(ss[min(N_CR - 1, int(q * N_CR))], 3) for q in QT]   # 与真源一致:阈值 3 位舍入
def rating(s):
    if s >= qs[0]: return "A"
    if s >= qs[1]: return "B"
    if s >= qs[2]: return "C"
    return "D"

# ---- Q2:302 家无记录 kNN 推断(k=5,距离倒数加权)----
new = firms[N_CR:]
ref_z = [z_of(f) for f in ref]
def infer(f):
    z = z_of(f)
    ds = []
    for j, rz in enumerate(ref_z):
        d = math.sqrt(sum((a - b) ** 2 for a, b in zip(z, rz)))
        ds.append((d, j))
    ds.sort(key=lambda t: t[0])
    k = min(5, len(ds))
    wsum = sum(1.0 / (d + 1e-6) for d, _ in ds[:k])
    s_hat = sum(scores_ref[j] / (d + 1e-6) for d, j in ds[:k]) / wsum
    return s_hat, rating(s_hat)

hat = [infer(f) for f in new]
dist = Counter(r for _, r in hat)
print("推断评级分布:", dict(dist))
# 隐藏真值检验(真值评分用行业先验权重 W 的评分,套同一阈值——与真源一致)
def score_w(f): return sum(w * zj for w, zj in zip(W, z_of(f)))
true_rating = [rating(score_w(f)) for f in new]
acc = sum(1 for (_, r), rt in zip(hat, true_rating) if r == rt) / len(new)
print("推断评级一致率: %.4f" % acc)
# 平均额度/利率(按推断评级)
LOAN = {"A": 0.30, "B": 0.20, "C": 0.12, "D": 0.05}
PREM = {"A": 0.5, "B": 1.5, "C": 3.0, "D": 5.5}
BASE = 4.5
amts, rates = [], []
for f, (_, r) in zip(new, hat):
    amts.append(min(f[0] * LOAN[r], 2000.0))
    rates.append(min(BASE + PREM[r], 15.0))
print("平均额度=%.1f万元 平均利率=%.2f%%" % (sum(amts) / len(amts), sum(rates) / len(rates)))

运行输出:推断评级分布 A:30 B:119 C:116 D:37;一致率 0.8444;平均额度 221.7 万元、平均利率 6.97%,与正文及图 2、图 3、图 4、图 5 完全一致。

图1 无记录企业推断流程
图2 无记录 302 家推断评级分布
图3 推断评级与真值偏差分布
图4 平均贷款额度对比
图5 无记录企业各评级平均额度
图6 推断评分 vs 真值评分
图7 无记录企业各评级平均违约概率
图8 Q2 推断链路