针对中小微企业的信贷决策模型的量化研究(2020年全国大学生数学建模竞赛C题)

封面图

本参赛记录与写作说明

本文是对2020年全国大学生数学建模竞赛C题——“银行业中小微企业信贷决策模型"的完整解题记录。本次比赛中,本人所负责的部分为:数据清洗与预处理、信贷策略制定(包括问题一的借贷决策模型与风险评价模型),以及最终报告的撰写与博客化整理。决策树模型构建与训练部分由队友完成,本文仅介绍其训练思路与方法,过程细节不再赘述。

将解题过程写成博客,一是为了系统梳理建模思路,便于后续复盘与改进;二是希望为同样关注银行信贷风控建模方向的同学提供一个可参考的实践案例。

一、引言

1.1 问题背景

长期以来,我国银行业对中小企业贷款业务开展困难,核心问题在于对中小企业信贷成本高、风险大。具体表现为:中小企业规模小,缺乏固定资产抵押特性,银行难以直接评估其信用风险。因此,银行对中小微企业的信贷决策主要依赖于企业的交易票据信息和上下游企业的影响力。

在对中小微企业进行合理的信贷风险评估后,银行需要按评估结果制定完整的信贷策略,涵盖是否放贷、贷款额度、利率、期限等维度。良好的评价系统对于银行借贷决策有着重大意义。

1.2 问题简述

本题提供三个附件数据:附件一为 123 家有信贷记录企业的相关数据,附件二为 302 家无信贷记录企业的相关数据,附件三为银行贷款年利率与客户流失率关系的 2019 年统计数据。要求完成以下三个问题:

  • 问题一:结合有信贷记录企业的相关信息,对企业信贷风险进行量化分析,给出年度信贷总额固定下的企业信贷策略。
  • 问题二:对给出无信贷记录企业信息进行信贷风险的量化分析,给出年度信贷总额 1 亿下的企业信贷策略。
  • 问题三:综合考虑各种突发因素对于企业的影响,给出第二问中企业信贷策略的优化方案。

二、前置知识:核心算法原理

本章介绍后续章节中将直接引用的算法原理,主要涉及层次分析法、模糊数学评价、TOPSIS 法、决策树和压力测试法。

2.1 层次分析法(AHP)

1. 算法引入原因

在确定各指标对于决策目标的影响权重时,常遇到权重难以定量化、以及主观因素引入造成各权重内部隐性矛盾的问题。层次分析法(Analytic Hierarchy Process, AHP)由美国运筹学家萨亚于 20 世纪 70 年代提出,其基本思想是将评价对象的相关性质划分为目标层、准则层和方案层,对难以完全量化分析的模糊问题进行定量与定性分析,得到各层次相对于最高层的权重比重,以优化评价方案。

2. 1-9 标度法与判断矩阵构造

通过 1-9 标度法对指标进行两两比较,构造判断矩阵 $A = (a_{ij})$。其中

$$a_{ij} = \frac{\text{第 } i \text{ 个指标的重要程度}}{\text{第 } j \text{ 个指标的重要程度}}$$

进一步可写成

$$A = \begin{pmatrix} a_{11} & a_{12} & \cdots & a_{1n} \ a_{21} & a_{22} & \cdots & a_{2n} \ \vdots & \vdots & \ddots & \vdots \ a_{n1} & a_{n2} & \cdots & a_{nn} \end{pmatrix}$$

3. 权重计算:三种方法

算术平均法:

$$\omega_i = \frac{1}{n} \sum_{j=1}^{n} \frac{a_{ij}}{\sum_{k=1}^{n} a_{kj}}, \quad i = 1,2,\cdots,n$$

几何平均法:

$$\omega_i = \frac{\left(\prod_{j=1}^{n} a_{ij}\right)^{1/n}}{\sum_{k=1}^{n} \left(\prod_{j=1}^{n} a_{kj}\right)^{1/n}}, \quad i = 1,2,\cdots,n$$

特征值法:求出判断矩阵最大特征值 $\lambda_{\max}$ 及其对应特征向量,并将特征向量归一化得到权重。

4. 一致性检验

一致性指标定义为:

$$CI = \frac{\lambda_{\max}-n}{n-1}$$

一致性比例定义为:

$$CR = \frac{CI}{RI}$$

当 $CR < 0.10$ 时,说明判断矩阵一致性检验通过;否则需要重新调整判断矩阵。

2.2 模糊层次分析法(F-AHP)

1. 算法思想

模糊层次分析法在传统 AHP 基础上引入模糊数学思想,用于处理定性指标的模糊性问题。通过建立模糊判断矩阵和模糊隶属度函数,将定性评价转化为定量评分。

2. 七步模糊综合评价模型

以供求关系稳定性评价为例,完整流程如下:

第一步:确定因素集

$$U = {u_1(\text{稳定进项客户占比}), u_2(\text{稳定销项客户占比}), u_3(\text{平均季度交易单数方差})}$$

第二步:确定评语集

$$V = {v_1(\text{好}), v_2(\text{较好}), v_3(\text{中等}), v_4(\text{差})}$$

第三步:确定因素权重

$$A = (a_1, a_2, a_3)$$

第四步至第六步:构造隶属函数并形成模糊综合判断矩阵

$$R = \begin{pmatrix} r_{11} & r_{12} & r_{13} & r_{14} \ r_{21} & r_{22} & r_{23} & r_{24} \ r_{31} & r_{32} & r_{33} & r_{34} \end{pmatrix}$$

第七步:综合评判

$$B = A \cdot R = (b_1,b_2,b_3,b_4)$$

2.3 TOPSIS 法

1. 算法原理

TOPSIS 法(Technique for Order Preference by Similarity to an Ideal Solution)是一种多指标决策方法,通过计算评价对象与正负理想解的距离来进行排序。

2. 完整计算流程

原始数据标准化:

$$z_{ij} = \frac{x_{ij}}{\sqrt{\sum_{i=1}^{n} x_{ij}^2}}, \quad i = 1,2,\cdots,n;\ j = 1,2,\cdots,m$$

正负理想解:

$$Z^+ = (\max_i z_{i1},\max_i z_{i2},\cdots,\max_i z_{im})$$

$$Z^- = (\min_i z_{i1},\min_i z_{i2},\cdots,\min_i z_{im})$$

距离计算:

$$D_i^+ = \sqrt{\sum_{j=1}^{m}(Z_j^+ - z_{ij})^2}$$

$$D_i^- = \sqrt{\sum_{j=1}^{m}(Z_j^- - z_{ij})^2}$$

相对贴近度:

$$S_i = \frac{D_i^-}{D_i^+ + D_i^-}, \quad S_i \in [0,1]$$

2.4 决策树

1. 算法概述

决策树(Decision Tree)是一个属性结构的预测模型,代表对象属性和对象值之间的一种映射关系。它由内节点和叶节点构成,适合分类与回归问题。

2. 分类依据

信息熵:

$$Entropy(A) = -\sum_{k=1}^{n} p_k \log_2 p_k$$

信息增益:

$$Gain(D,a) = Entropy(D) - \sum_{v=1}^{V} \frac{|D^v|}{|D|} Entropy(D^v)$$

Gini 系数:

$$Gini(D) = 1 - \sum_{k=1}^{y} p_k^2$$

3. 建树步骤

  • 将全部样本视作一个根节点。
  • 对每个候选变量遍历分裂方式,选择最优分裂。
  • 将节点递归二分,直到节点纯度足够高或满足停止条件。

4. 模型评估指标

准确率、召回率与 F1 值分别记为:

$$ACC = \frac{TP}{TP + FP}, \quad REC = \frac{TP}{TP + FN}$$

$$PRE = \frac{TP}{TP + FP}, \quad F1 = \frac{2 \times PRE \times REC}{PRE + REC}$$

2.5 压力测试法

1. 方法论

压力测试法(Stress Testing)用于评估在极端不利条件下金融机构的风险承受能力。在银行信贷领域,主要用于测试突发因素对企业运营的影响。

2. 情景测试法流程

  • 设定压力情景,如突发疫情、经济衰退、政策变化等。
  • 确定关键影响变量,如利润增长率、退货率等。
  • 模拟影响因素传导路径。
  • 重新计算风险评价值与信贷策略。

三、问题一:123家有信贷记录企业的信贷策略

3.1 企业画像:三个核心维度

企业特征指标图

对 123 家有信贷记录企业进行深度分析,从三个维度刻画企业形象:

  1. 借贷企业实力
  • 净利率:净利润与投入资本额的百分比,综合反映企业经营效率。
  • 净利润增长率:两个时间段净利润增长的幅度,反映企业经营状况。
  • 销项退货比例:负数发票单数与经营总单数比例,反映消极指标。
  1. 企业信誉
  • 信誉等级:企业信用评估结果的直观表示(A/B/C/D 四级)。
  • 违约经历:是否有违约记录,直接影响企业信誉。
  1. 供求关系稳定性
  • 企业稳定进项客户占比。
  • 企业稳定销项客户占比。
  • 平均季度交易单数的方差。

3.2 是否放贷:银行借贷决策模型

3.2.1 模型结构与算法流程

是否放贷本质上是一个多指标综合评价问题。对于银行而言,仅依靠单一财务指标不足以刻画中小微企业的真实信用水平,因此本文将企业的借贷能力拆解为两个一级维度:一是能够反映经营质量的企业实力,二是能够反映业务关系可持续性的供求关系稳定性。前者主要由净利率、净利润增长率和销项退货比例构成,后者则通过稳定客户占比与交易波动程度进行度量。

由于企业实力中的指标大多为定量指标,而供求关系稳定性中含有明显的模糊评价成分,因此本模型并非仅采用**模糊层次分析法(F-AHP)**单独求解,而是采用“AHP 定权 + TOPSIS 量化 + F-AHP 模糊综合评价 + 时间加权汇总”的综合求解框架。该框架既保留了层次分析法在权重表达上的可解释性,也兼顾了 TOPSIS 对多指标排序的客观性,以及 F-AHP 对定性特征的刻画能力。

模型的层次结构如下图所示:

银行借贷决策模型层次结构图

整体计算流程如下图所示:

输入:企业指标数据
  │
  ├─ Step 1:构造目标层、准则层、时间层的判断矩阵
  │
  ├─ Step 2:使用 AHP 求出一级权重、二级权重和时间权重,并进行一致性检验
  │
  ├─ Step 3:对企业实力部分使用 TOPSIS 计算综合得分
  │
  ├─ Step 4:对供求关系稳定性部分使用 F-AHP 模糊综合评价计算等级得分
  │
  ├─ Step 5:将两个部分在同一时期内加权合成,得到单期借贷能力评价值
  │
  └─ Step 6:按时间权重进行跨期汇总,得到最终放贷评价值

设第 $i$ 个时间带中企业实力对应的三个核心指标得分分别为 $f_{11}(t_i)$、$f_{12}(t_i)$、$f_{13}(t_i)$,其含义依次对应净利率、净利润增长率和销项退货比例,则企业实力综合评价值可写为

$$f_1(t_i) = \omega_{11} f_{11}(t_i) + \omega_{12} f_{12}(t_i) + \omega_{13} f_{13}(t_i)$$

其中 $\omega_{11}$、$\omega_{12}$、$\omega_{13}$ 分别表示净利率、净利润增长率和销项退货比例在企业实力维度下的指标权重。上述三个底层指标的得分并不是直接取原值,而是先基于原始指标数值通过 TOPSIS 分析法计算得到。

对于供求关系稳定性,记其在第 $i$ 个时间带上的综合得分为 $f_2(t_i)$,则企业在该时间带上的借贷能力评价值为

$$LEND(t_i) = \omega_{f_1} f_1(t_i) + \omega_{f_2} f_2(t_i)$$

其中 $\omega_{f_1}$ 与 $\omega_{f_2}$ 分别表示“企业实力”和“供求关系稳定性”在准则层中的权重。

进一步地,对三个时间带进行加权汇总,可得企业最终的借贷能力综合评分

$$LEND = \sum_i \omega_i \cdot LEND(t_i)$$

其中 $\omega_i$ 为第 $i$ 个时间带的权重,且满足 $\sum_i \omega_i = 1$。这一表达式体现了本文的核心思想:同一企业的借贷能力不是某一时点的静态结果,而是多个时期经营表现与供求稳定性的加权综合。

3.2.2 基于层次分析法的权重量化

为了使借贷决策模型中的各层指标权重更加清晰,本节按照“一级准则层权重”“企业实力内部权重”“缺项场景处理”三个层次展开说明。

1. 一级准则层权重

在准则层中,本文将“企业实力”与“供求关系稳定性”进行两两比较。依据业务理解,供求关系稳定性更能反映中小微企业持续经营的可靠性,因此赋予其略高于企业实力的权重。对应判断矩阵为

$$A = \begin{pmatrix} 1 & 1/2 \ 2 & 1 \end{pmatrix}$$

对判断矩阵 $A$ 求权重时,本文使用算术平均法、几何平均法与特征值法三种方式进行交叉校验:

  • 算术平均法:

$$\omega_i^{(1)} = \frac{1}{n} \sum_{j=1}^{n} \frac{a_{ij}}{\sum_{k=1}^{n} a_{kj}}$$

  • 几何平均法:

$$\omega_i^{(2)} = \frac{\left(\prod_{j=1}^{n} a_{ij}\right)^{1/n}}{\sum_{k=1}^{n}\left(\prod_{j=1}^{n} a_{kj}\right)^{1/n}}$$

  • 特征值法:

$$A \boldsymbol{\omega}^{(3)} = \lambda_{\max} \boldsymbol{\omega}^{(3)}$$

求得主特征向量后再进行归一化,即可得到对应权重。

综合三种方法后,可得一级准则层的最终权重为:

$$\boldsymbol{\omega} = (\omega_1, \omega_2) = (0.3333, 0.6667)$$

即企业实力权重约为 $1/3$,供求关系稳定性权重约为 $2/3$。

对于一致性检验,AHP 的基本表达式为:

$$CI = \frac{\lambda_{\max} - n}{n - 1}$$

$$CR = \frac{CI}{RI}$$

由于此处判断矩阵为二阶矩阵,$n=2$ 时有 $\lambda_{\max}=2$,从而 $CI=0$,因此该矩阵天然满足一致性要求。

作为实现参考,层次分析法中基于特征值法求权重并完成一致性检验的 Matlab 代码可写为:

%% 层次分析法一致性检验和权重结果计算
% 输入判断矩阵 A
[n,n] = size(A);

% 特征值法求权重
[V,D] = eig(A);
Max_eig = max(max(D));
[r,c] = find(D == Max_eig, 1);
disp('特征值法求权重的结果为:');
disp(V(:,c) ./ sum(V(:,c)))

% 一致性检验
CI = (Max_eig - n) / (n - 1);
RI = [0 0.0001 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59];
% 这里 n=2 时,一定是一致矩阵,所以 CI = 0。
% 为避免分母为 0,将第二个元素替换为一个非常接近 0 的正数。
CR = CI / RI(n);
disp('一致性指标 CI=');
disp(CI);
disp('一致性比例 CR=');
disp(CR);
if CR < 0.10
    disp('CR<0.10,判断矩阵A的一致性可接受!');
else
    disp('判断矩阵A需要进行修改!');
end

2. 企业实力内部权重

在企业实力这一维度下,还需要进一步确定净利率、净利润增长率和销项退货比例三项指标的相对权重。对应判断矩阵为

$$A_s = \begin{pmatrix} 1 & 1/2 & 3 \ 2 & 1 & 3 \ 1/3 & 1/3 & 1 \end{pmatrix}$$

其业务含义是:净利润增长率略高于净利率,两者都明显高于销项退货比例,但退货比例仍保留一定权重,因为它体现了经营质量中的负向约束。

求解时,先对判断矩阵逐列归一化,得到

$$r_{ij} = \frac{a_{ij}}{\sum_{k=1}^{n} a_{kj}}$$

再按行求平均,即可得到近似权重向量。最终结果为

$$\boldsymbol{\omega}^{(s)} = (0.3108, 0.4934, 0.1958)$$

即净利率、净利润增长率和销项退货比例的权重分别为 0.3108、0.4934 和 0.1958。

进一步利用特征值法可得:

$$\lambda_{\max} = \frac{1}{n} \sum_{i=1}^{n} \frac{(A_s \boldsymbol{\omega}^{(s)})_i}{\omega_i^{(s)}}$$

可得

$$\lambda_{\max} = 3.0536$$

从而一致性指标为

$$CI = \frac{3.0536 - 3}{2} = 0.0268, \quad CR = \frac{0.0268}{0.58} = 0.0462 < 0.10$$

说明该判断矩阵一致性良好,可以接受。

3. 缺项场景下的权重处理

当部分企业缺少净利润增长率信息时,为避免强行补值带来的噪声,本文改用两指标退化模型。此时判断矩阵写为

$$A_s’ = \begin{pmatrix} 1 & 3 \ 1/3 & 1 \end{pmatrix}$$

对应权重为

$$\boldsymbol{\omega}^{(s’)} = (0.75, 0.25)$$

即在缺项情况下,模型仅使用净利率和销项退货比例两项指标参与评价,并给予净利率更高权重。这样既能避免缺失值引入额外噪声,也能保证模型在不同样本条件下仍保持结构一致性与可解释性。

3.2.3 时间维度加权推导

企业信用并不是静态量。相较于较早年份的数据,近期经营表现更能反映企业当前的真实偿债能力。因此,本文在时间维度上引入额外的一层 AHP 权重,赋予越新的时间带更高的重要性。

将样本时间划分为三个时间带:

时间带 对应年份
$t_1$ 2016-2017
$t_2$ 2018
$t_3$ 2019-2020

在“近期信息更重要”的假设下,构造时间判断矩阵

$$A_t = \begin{pmatrix} 1 & 1/3 & 1/4 \ 3 & 1 & 1/2 \ 4 & 2 & 1 \end{pmatrix}$$

按照层次分析法中的判断矩阵构造、权重求解与一致性检验步骤,可得时间权重向量

$$\boldsymbol{\eta} = (\eta_1, \eta_2, \eta_3) = (0.1220, 0.3196, 0.5584)$$

可以看到,最近时间带 $t_3$ 的权重最高,说明模型更关注企业最新阶段的经营表现。

一致性检验中,

$$\lambda_{\max} = 3.0183, \quad CI = \frac{3.0183 - 3}{2} = 0.00915$$

取 $RI = 0.52$,则

$$CR = \frac{0.00915}{0.52} = 0.0176 < 0.10$$

说明时间层判断矩阵同样通过一致性检验。

因此,单个企业在三个时间带上的借贷能力评价值最终汇总为

$$LEND_i = 0.1220 \cdot LEND_i(t_1) + 0.3196 \cdot LEND_i(t_2) + 0.5584 \cdot LEND_i(t_3)$$

该公式明确体现了“近期样本更重要”的建模思想。

3.2.4 模糊综合评价:供求关系稳定性量化

供求关系稳定性本质上不是单一数值,而是一个带有模糊边界的综合概念。稳定进项客户占比、稳定销项客户占比和平均季度交易单数方差都能从不同角度刻画企业上下游关系是否稳固,但很难直接给出一个绝对的“好”或“差”的阈值。因此,这里不再采用简单线性加权,而是用模糊综合评价把多个指标统一映射到同一套评价等级中。

评价的因素集取为

$$U = {u_1, u_2, u_3} = {\text{稳定进项客户占比},\text{稳定销项客户占比},\text{平均季度交易单数方差}}$$

评语集取为

$$V = {v_1, v_2, v_3, v_4} = {\text{好}, \text{较好}, \text{中等}, \text{差}}$$

其中,前两个指标分别对应采购端和销售端合作关系的稳定性,第三个指标反映交易节奏在季度维度上的波动程度。三个指标共同决定企业供求关系的稳定水平。

在权重设定上,仍然沿用层次分析法的结果。根据判断矩阵计算,三项指标的权重为

$$A = (a_1, a_2, a_3) = (0.25, 0.25, 0.5)$$

这意味着模型更强调交易波动本身的稳定性,而对稳定进项客户占比与稳定销项客户占比给予相同权重。

对应的判断矩阵结果为

$$ \begin{pmatrix} 1 & 1 & 2 \ 1 & 1 & 2 \ 1/2 & 1/2 & 1 \end{pmatrix} $$

根据论文中的计算结果,该矩阵的最大特征值为 $\lambda_{\max}=3$,进一步可得

$$CI = -4.4409 \times 10^{-16}, \quad CR = -8.5402 \times 10^{-16} < 0.10$$

因此,一致性检验通过,上述权重结果可以接受。

在具体求解时,先分别计算各指标对四个评语等级的隶属度。为了保证评价函数平滑、可解释,本文采用常规指派法,并使用梯形函数作为隶属函数模型。得到单个指标在各评语上的隶属度后,再将三个指标的评价结果拼接起来,即可形成该企业的模糊综合判断矩阵:

$$R = \begin{bmatrix} r_{11} & r_{12} & r_{13} & r_{14} \ r_{21} & r_{22} & r_{23} & r_{24} \ r_{31} & r_{32} & r_{33} & r_{34} \end{bmatrix} = \begin{bmatrix} R_1 \ R_2 \ R_3 \end{bmatrix}$$

其中,$r_{ij}$ 表示第 $i$ 个指标对第 $j$ 个评语等级的隶属度。对每一家企业重复上述步骤,就可以分别得到对应的模糊综合判断矩阵。

进一步将权重向量与判断矩阵相乘,可得该企业对四个评语等级的综合隶属度:

$$B = AR = {b_1, b_2, b_3, b_4}$$

若某一等级对应的隶属度最大,则将该企业归入该等级。最后,再将四个等级量化为分值:A、B、C、D 分别对应 100、80、60、40 分。这样就把原本难以直接度量的供求关系稳定性,转化成了可以进入上层借贷决策模型的定量得分。

从模型求解结果来看,模糊综合评价最终能够为每家企业生成一个供求关系稳定性评分。按照论文中的示例,第 1 到第 10 号企业对应的供求稳定性得分依次为:100、40、40、100、40、100、60、60、100、100。也就是说,该模型已经把相对模糊的“供求关系是否稳定”转化成了可直接参与后续借贷能力计算的量化输入。

作为实现参考,利用模糊综合评价计算供求关系稳定性评分的 Matlab 代码示例如下:

%% 进项各企业各年销量前十名的企业代号
for i = 1:123
    % 2016-2017数据
    temp = A(find(A(:,1)==i),:);
    temp2017 = temp(find(temp(:,3)<20180000),:);
    temp2017_2 = unique(temp2017(:,2));
    n = histc(temp2017(:,2),temp2017_2);
    n = [temp2017_2,n];
    n = sortrows(n,2);
    n = flipud(n);
    if size(n,1) < 10
        mysort(1:size(n,1),2*i-1:2*i) = n;
    else
        n = n(1:10,1:2);
        mysort(1:10,2*i-1:2*i) = n;
    end
    % 2018数据
    temp2018 = temp(find(temp(:,3)<20190000),:);
    temp2018_2 = unique(temp2018(:,2));
    n = histc(temp2018(:,2),temp2018_2);
    n = [temp2018_2,n];
    n = sortrows(n,2);
    n = flipud(n);
    if size(n,1) < 10
        mysort(11:10+size(n,1),2*i-1:2*i) = n;
    else
        n = n(1:10,1:2);
        mysort(11:20,2*i-1:2*i) = n;
    end
    % 2019数据
    temp2019 = temp(find(temp(:,3)<20200000),:);
    temp2019_2 = unique(temp2019(:,2));
    n = histc(temp2019(:,2),temp2019_2);
    n = [temp2019_2,n];
    n = sortrows(n,2);
    n = flipud(n);
    if size(n,1) < 10
        mysort(21:20+size(n,1),2*i-1:2*i) = n;
    else
        n = n(1:10,1:2);
        mysort(21:30,2*i-1:2*i) = n;
    end
end

%% 销项各企业各年销量前十名的企业代号
for i = 1:123
    % 2016-2017数据
    temp = A2(find(A2(:,1)==i),:);
    temp2017 = temp(find(temp(:,3)<20180000),:);
    temp2017_2 = unique(temp2017(:,2));
    n = histc(temp2017(:,2),temp2017_2);
    n = [temp2017_2,n];
    n = sortrows(n,2);
    n = flipud(n);
    if size(n,1) < 10
        mysort2(1:size(n,1),2*i-1:2*i) = n;
    else
        n = n(1:10,1:2);
        mysort2(1:10,2*i-1:2*i) = n;
    end
    % 2018数据
    temp2018 = temp(find(temp(:,3)<20190000),:);
    temp2018_2 = unique(temp2018(:,2));
    n = histc(temp2018(:,2),temp2018_2);
    n = [temp2018_2,n];
    n = sortrows(n,2);
    n = flipud(n);
    if size(n,1) < 10
        mysort2(11:10+size(n,1),2*i-1:2*i) = n;
    else
        n = n(1:10,1:2);
        mysort2(11:20,2*i-1:2*i) = n;
    end
    % 2019数据
    temp2019 = temp(find(temp(:,3)<20200000),:);
    temp2019_2 = unique(temp2019(:,2));
    n = histc(temp2019(:,2),temp2019_2);
    n = [temp2019_2,n];
    n = sortrows(n,2);
    n = flipud(n);
    if size(n,1) < 10
        mysort2(21:20+size(n,1),2*i-1:2*i) = n;
    else
        n = n(1:10,1:2);
        mysort2(21:30,2*i-1:2*i) = n;
    end
end

%% 计算各企业各月平均的交易单数的方差
% 各季度进项单数
mynum1 = [];
for i = 1:123
    temp = A(find(A(:,1)==i),:);
    for j = 1:4
        mynum1(i,j) = size(temp(find(temp(:,3)<20160101+j*300),:),1);
    end
    for j = 1:4
        mynum1(i,4+j) = size(temp(find(temp(:,3)<20170101+j*300),:),1);
    end
    for j = 1:4
        mynum1(i,8+j) = size(temp(find(temp(:,3)<20180101+j*300),:),1);
    end
    for j = 1:4
        mynum1(i,12+j) = size(temp(find(temp(:,3)<20190101+j*300),:),1);
    end
    for j = 1:4
        mynum1(i,16+j) = size(temp(find(temp(:,3)<20200101+j*300),:),1);
    end
end

% 各季度销项单数
mynum2 = [];
for i = 1:123
    temp = A2(find(A2(:,1)==i),:);
    for j = 1:4
        mynum2(i,j) = size(temp(find(temp(:,3)<20160101+j*300),:),1);
    end
    for j = 1:4
        mynum2(i,j+4) = size(temp(find(temp(:,3)<20170101+j*300),:),1);
    end
    for j = 1:4
        mynum2(i,j+8) = size(temp(find(temp(:,3)<20180101+j*300),:),1);
    end
    for j = 1:4
        mynum2(i,j+12) = size(temp(find(temp(:,3)<20190101+j*300),:),1);
    end
    for j = 1:4
        mynum2(i,j+16) = size(temp(find(temp(:,3)<20200101+j*300),:),1);
    end
end

% 各季度进出项单数总和
mynum = mynum1 + mynum2;

% 前20个企业的各季度单数折线图
seasontime = 1:20;
for i = 1:20
    subplot(4,5,i)
    plot(seasontime,mynum(i,:),'--o')
    set(gca, 'XTick', 1:1:20)
end

% 计算各企业交易单数均值和方差
mymeans = zeros(123,1);
S = zeros(123,1);
for i = 1:123
    temp = mynum(i,:);
    temp(temp==0) = [];   % 将头部0的数据剔除
    mymeans(i) = mean(temp);
    S(i) = sqrt(sum((temp - mean(temp)).^2) / length(temp));
end

%% 计算123家企业的隶属度得到供求关系稳定性评级和得分
load percent1.mat
load percent2.mat
percent1 = percent1';
percent2 = percent2';

% 将极大型数据转换为极小型数据
temp_percent1 = 1 - percent1;
temp_percent2 = 1 - percent2;

myA = [0.4 0.4 0.2];   % 权重矩阵
scoreindex = zeros(123,2);
for i = 1:123
    R(1,:) = caculate_rate(temp_percent1(:,1),temp_percent1(i,1)); % 得到指标P4隶属函数值
    R(2,:) = caculate_rate(temp_percent2(:,1),temp_percent2(i,1)); % 得到指标P5隶属函数值
    R(3,:) = caculate_rate(S,S(i));                                 % 得到指标P6隶属函数值
    B = myA * R;
    [temp,scoreindex(i)] = max(B);
    % 稳定性等级得分
    if scoreindex(i) == 1
        score2 = 100;
    elseif scoreindex(i) == 2
        score2 = 80;
    elseif scoreindex(i) == 3
        score2 = 60;
    else
        score2 = 40;
    end
    scoreindex(i,2) = score2;
end

%% 将稳定性评分补充到企业信息矩阵中
company_inf(:,12) = scoreindex(:,2);

3.2.5 TOPSIS 法:企业实力量化评分

企业实力由净利率、净利润增长率和销项退货比例组成,属于典型的多指标综合评价问题。为避免直接加权求和带来的尺度偏差,本文使用 TOPSIS 对其进行无量纲化与排序。

设共有 $n$ 家企业、$m$ 个指标,原始数据矩阵为

$$X = (x_{ij})_{n \times m}$$

首先进行向量标准化:

$$z_{ij} = \frac{x_{ij}}{\sqrt{\sum_{i=1}^{n} x_{ij}^2}}$$

得到标准化矩阵 $Z = (z_{ij})$。

然后乘以 AHP 计算得到的指标权重,形成加权标准化矩阵。记加权标准化矩阵为

$$Y = (y_{ij})_{n \times m}, \quad y_{ij} = \omega_j^{(s)} \cdot z_{ij}$$

对于收益型指标(净利率、净利润增长率),数值越大越优;对于成本型指标(销项退货比例),数值越小越优。因此正理想解与负理想解分别定义为

$$Y^+ = (y_1^+, y_2^+, \cdots, y_m^+)$$

$$Y^- = (y_1^-, y_2^-, \cdots, y_m^-)$$

其中收益型指标取最大值作为正理想解,成本型指标取最小值作为正理想解。

接着计算每家企业与正、负理想解之间的欧氏距离:

$$D_i^+ = \sqrt{\sum_{j=1}^{m} (y_{ij} - y_j^+)^2}$$

$$D_i^- = \sqrt{\sum_{j=1}^{m} (y_{ij} - y_j^-)^2}$$

最后定义相对贴近度:

$$f_1^{(i)}(t) = S_i = \frac{D_i^-}{D_i^+ + D_i^-}$$

显然 $S_i \in [0,1]$。$S_i$ 越大,表示企业越接近理想经营状态,其企业实力越强。

作为实现参考,利用优劣解距离法计算企业实力得分的 Matlab 代码示例如下:

%% 优劣解距离法计算得分
% 极大型指标为利润率和利润增长率
% 极小型指标为企业的退货比率
% 计算利润率指标的功效得分

% 第一步,将原始矩阵正向化
% 用 excel 剔除掉 2016-17 年没有数据的企业后导入矩阵 X
load Q1data2016.mat   % X

% 2018
X = company_inf(:,[4:6,10:11]);

% 2019-2020
load Q1data2019-20.mat   % X

%% 开始计算
[m,n] = size(X);
disp(['共有' num2str(m) '个样本数据, 共有' num2str(n) '个指标'])
judge = input('是否有指标需要正向化?若有,填1,若没有,填2: ');
if judge == 1
    position = input('请输入需要正项化的指标所在列,如第一、二、三列需要正向化,则输入[1,2,3]');
    type = input('请从左到右输入需要正向化指标的类型,1.极小型 2.中间型,3.区间型,如[2,1,3]');
    len = size(type,2);
    for i = 1:len
        if type(i) == 1
            X(:,position(i)) = Min2Max(X(:,position(i)));
            disp(['第' num2str(position(i)) '列指标为极小型指标,正项化处理已完成'])
        end
        if type(i) == 2
            best = input(['输入第' num2str(position(i)) '列指标的最佳数值: ']);
            X(:,position(i)) = Mid2Max(X(:,position(i)),best);
            disp(['第' num2str(position(i)) '列指标为中间型指标,正项化处理已完成'])
        end
        if type(i) == 3
            best_inter = input(['输入第' num2str(position(i)) '列指标的最佳区间(如[10,20]): ']);
            X(:,position(i)) = Inter2Max(X(:,position(i)),best_inter);
            disp(['第' num2str(position(i)) '列指标为区间型指标,正项化处理已完成'])
        end
    end
    disp('所有指标都已经正向化处理完成')
end

% 第二步:正向化矩阵标准化
Z = X ./ repmat(sqrt(sum(X.^2)),m,1);

% 第三步:计算得分并归一化
max_Z = max(Z);
min_Z = min(Z);
judge = input('是否需要调整指标权重,若不需要填0,需要请填1: ');
if judge == 0
    max_D = sqrt(sum((repmat(max_Z,m,1) - Z).^2,2));
    min_D = sqrt(sum((repmat(min_Z,m,1) - Z).^2,2));
elseif judge == 1
    % w = input('请从左至右填写各指标权重如[0.3,0.35,0.35]: ');
    % w = [0.25 0.164638129 0.213078843 0.372283029]; % 2016年各指标比重(无利润增长率指标)
    w = [0.103604561 0.164461989 0.146571579 0.213078843 0.372283029];
    max_D = sqrt(sum(repmat(w,m,1) .* (repmat(max_Z,m,1) - Z).^2,2));
    min_D = sqrt(sum(repmat(w,m,1) .* (repmat(min_Z,m,1) - Z).^2,2));
end
score = min_D ./ (max_D + min_D);   % 未归一化的得分
score = score ./ sum(score);        % 归一化后的得分

%% 计算三年各企业的总得分
fx_score = zeros(123,1);
for i = 1:123
    testsum = sum(temp(:,1)==i) + sum(temp(:,3)==i) + sum(temp(:,5)==i);
    % 企业有三年的成绩评分
    if testsum == 3
        myweight = [0.16342 0.29696 0.53961];
        fx_score(i) = myweight * [temp(find(temp(:,1)==i),2); temp(find(temp(:,3)==i),4); temp(find(temp(:,5)==i),6)];
    % 企业有两年的成绩评分
    elseif testsum == 2
        % 企业有16-17年评分
        if sum(temp(:,1)==i) == 1
            myweight = [0.3333 0.6667];
            fx_score(i) = myweight * [temp(find(temp(:,1)==i),2); temp(find(temp(:,3)==i),4)];
        % 企业有19-20年评分
        else
            myweight = [0.3333 0.6667];
            fx_score(i) = myweight * [temp(find(temp(:,3)==i),4); temp(find(temp(:,5)==i),6)];
        end
    % 企业只有一年的数据
    else
        fx_score(i) = temp(find(temp(:,3)==i),4);
    end
end

3.2.6 综合评判与分级阈值确定

将 TOPSIS 计算得到的企业实力得分 $f_1^{(i)}(t)$ 与模糊综合评价得到的供求稳定性得分 $f_2^{(i)}(t)$ 进行加权合成,可得到各时期的借贷能力评价值;再结合时间权重对各时期结果进行汇总,便可得到企业最终综合评分 $LEND_i$。

为了便于展示和后续放贷决策,本文将 $LEND_i$ 换算到百分制表达,即

$$Score_i = 100 \times LEND_i$$

随后按照得分分布与样本排序结果,将企业划分为四个等级:

等级 综合评分特征 放贷策略
A 得分高、经营稳定、供求关系稳固 优先放贷
B 得分较高、风险可控 可放贷
C 得分一般、需审慎评估 收紧额度后放贷
D 得分偏低、偿债能力与稳定性不足 不予放贷

如果将所有企业按 $LEND_i$ 从高到低排序,则放贷阈值可以通过分位点或图形分段来确定。实务上,A/B/C 级企业可以根据风险偏好进入授信池,而 D 级企业则直接剔除。

3.2.7 求解结果:是否放贷

作为实现参考,最终计算银行借贷决策得分的 Matlab 代码示例如下:

%% 优劣解距离法得出信贷决策模型得分
% 计算企业实力得分
% 2016-2017
load X2.mat
% 2018
load X3.mat
% 2019-2020
load X4.mat

%% 开始计算
[m,n] = size(X);
disp(['共有' num2str(m) '个样本数据, 共有' num2str(n) '个指标'])
judge = input('是否有指标需要正向化?若有,填1,若没有,填2: ');
if judge == 1
    position = input('请输入需要正项化的指标所在列,如第一、二、三列需要正向化,则输入[1,2,3]');
    type = input('请从左到右输入需要正向化指标的类型,1.极小型 2.中间型,3.区间型,如[2,1,3]');
    len = size(type,2);
    for i = 1:len
        if type(i) == 1
            X(:,position(i)) = Min2Max(X(:,position(i)));
            disp(['第' num2str(position(i)) '列指标为极小型指标,正项化处理已完成'])
        end
        if type(i) == 2
            best = input(['输入第' num2str(position(i)) '列指标的最佳数值: ']);
            X(:,position(i)) = Mid2Max(X(:,position(i)),best);
            disp(['第' num2str(position(i)) '列指标为中间型指标,正项化处理已完成'])
        end
        if type(i) == 3
            best_inter = input(['输入第' num2str(position(i)) '列指标的最佳区间(如[10,20]): ']);
            X(:,position(i)) = Inter2Max(X(:,position(i)),best_inter);
            disp(['第' num2str(position(i)) '列指标为区间型指标,正项化处理已完成'])
        end
    end
    disp('所有指标都已经正向化处理完成')
end

% 第二步:正向化矩阵标准化
Z = X ./ repmat(sqrt(sum(X.^2)),m,1);

% 第三步:计算得分并归一化
max_Z = max(Z);
min_Z = min(Z);
judge = input('是否需要调整指标权重,若不需要填0,需要请填1: ');
if judge == 0
    max_D = sqrt(sum((repmat(max_Z,m,1) - Z).^2,2));
    min_D = sqrt(sum((repmat(min_Z,m,1) - Z).^2,2));
elseif judge == 1
    % w = input('请从左至右填写各指标权重如[0.3,0.35,0.35]: ');
    % w = [0.75 0.25]; % 2016年各指标比重(无利润增长率指标)
    w = [0.310813683 0.493385967 0.195800351];
    max_D = sqrt(sum(repmat(w,m,1) .* (repmat(max_Z,m,1) - Z).^2,2));
    min_D = sqrt(sum(repmat(w,m,1) .* (repmat(min_Z,m,1) - Z).^2,2));
end
score = min_D ./ (max_D + min_D);   % 未归一化的得分
score = score ./ sum(score);        % 归一化后的得分

%% 计算三年各企业的企业实力得分
load temp.mat
fx_score = zeros(123,1);
for i = 1:123
    testsum = sum(temp(:,1)==i) + sum(temp(:,3)==i) + sum(temp(:,5)==i);
    % 企业有三年的成绩评分
    if testsum == 3
        myweight = [0.16342 0.29696 0.53961];
        fx_score(i) = myweight * [temp(find(temp(:,1)==i),2); temp(find(temp(:,3)==i),4); temp(find(temp(:,5)==i),6)];
    % 企业有两年的成绩评分
    elseif testsum == 2
        % 企业有16-17年评分
        if sum(temp(:,1)==i) == 1
            myweight = [0.3333 0.6667];
            fx_score(i) = myweight * [temp(find(temp(:,1)==i),2); temp(find(temp(:,3)==i),4)];
        % 企业有19-20年评分
        else
            myweight = [0.3333 0.6667];
            fx_score(i) = myweight * [temp(find(temp(:,3)==i),4); temp(find(temp(:,5)==i),6)];
        end
    % 企业只有一年的数据
    else
        fx_score(i) = temp(find(temp(:,3)==i),4);
    end
end

根据模型求得的 $LEND_i$ 值,可将 123 家企业划分为四个借贷等级。图形结果表明,企业得分存在较明显的层次分化,说明该模型能够有效区分高质量企业与高风险企业。

银行借贷决策模型求解结果图

具体而言:

  • A 级企业借贷能力最强,经营质量和供求稳定性均表现优良,可优先发放贷款。
  • B 级企业整体风险可控,适合作为常规授信对象。
  • C 级企业虽然不属于明显高风险群体,但其经营或稳定性存在短板,应通过降低额度、提高审查强度等方式审慎放贷。
  • D 级企业在综合评价中得分最低,建议不予发放贷款。

因此,问题一中的“是否放贷”可被归结为一个明确的分类规则:仅对 A、B、C 级企业发放贷款,对 D 级企业拒贷。这一结论为后续利率与额度设计提供了前提条件。

下图给出了这套模型最终形成的评分规则,可用于对其他企业进行同口径评估:

银行借贷决策模型最终评分规则图

3.3 如何放贷:中小企业信贷风险模型

对于已经通过借贷决策模型筛选的企业,下一步不再回答“能不能贷”,而是回答“应该怎么贷”。因此,问题一中的第二个模型转向风险定价与额度配置:一方面继续保留企业经营表现,另一方面把信誉评级和违约经历纳入评价体系,最终形成可用于利率与额度设计的风险评价值。

3.2 的借贷能力评价值 LEND_i 不同,这里构造的是企业风险评价值 RISK_i。前者用于筛选放贷对象,后者用于确定放贷条件。两个模型在指标选取、权重分配和结果解释上都不完全相同,因此需要单独建模。

3.3.1 模型结构与评价思路

风险评价模型仍采用“准则层 + 指标层 + 时间层”的层次化结构,但准则层由“企业实力”和“企业信誉”两部分组成。其中,企业实力延续净利率、净利润增长率、销项退货比例三项经营指标;企业信誉则由信誉评级和违约经历两项信用指标刻画。这样处理的原因在于:借贷决策模型更关注企业是否具备基本放贷资格,而风险评价模型需要进一步回答银行应该以怎样的价格和额度承担这部分风险。

下图给出了本文搭建的信贷风险模型结构图:

信贷风险模型结构图

在单个时间带内,风险评价值写为

$$RISK_i(t) = \omega_1 f_{i1}(t) + \omega_2 f_{i2}(t) + \omega_3 f_{i3}(t) + \omega_4 f_{i4}(t) + \omega_5 f_{i5}(t)$$

其中,$f_{i1}(t)$、$f_{i2}(t)$、$f_{i3}(t)$ 分别表示企业 $i$ 在时间带 $t$ 下的净利率、净利润增长率和销项退货比例得分,$f_{i4}(t)$ 与 $f_{i5}(t)$ 分别表示信誉评级与违约经历的量化得分;$\omega_1,\dots,\omega_5$ 为对应指标权重。

进一步对三个时间带进行汇总,可得企业最终的综合风险评价值

$$RISK_i = \eta_1 RISK_i(t_1) + \eta_2 RISK_i(t_2) + \eta_3 RISK_i(t_3)$$

其中 $\eta_1, \eta_2, \eta_3$ 为时间权重。至此,模型完成了从单期经营与信用信息到最终风险评分的映射,后续利率和额度设计都以 $RISK_i$ 为基础。

3.3.2 基于层次分析法的权重量化

为了使风险评价模型更具可解释性,本文同样采用层次分析法对各层权重进行量化,并结合一致性检验验证判断矩阵的合理性。

1. 一级准则层权重

在准则层中,本文将“企业实力”与“企业信誉”进行两两比较。相较于单纯的经营表现,信誉评级和违约经历更直接地反映了企业的违约风险,因此在风险模型中给予企业信誉更高的权重。对应判断矩阵可写为

$$A_r = \begin{pmatrix} 1 & 1/2 \ 2 & 1 \end{pmatrix}$$

根据论文中的计算结果,可得一级准则层权重为

$$\boldsymbol{\omega}^{(r)} = (0.3333, 0.6667)$$

即企业实力占 1/3,企业信誉占 2/3。由于该判断矩阵为二阶矩阵,最大特征值为 2,一致性天然满足要求。

2. 企业信誉内部权重

企业信誉部分进一步拆分为销项退货比例、信誉评级和违约经历三个指标,其中前者保留了经营质量中的负向约束信息,后两者则直接刻画企业历史信用水平。论文中对应的判断矩阵为

$$A_c = \begin{pmatrix} 1 & 1/3 & 1/4 \ 3 & 1 & 1/2 \ 4 & 2 & 1 \end{pmatrix}$$

计算可得

$$\lambda_{\max} = 3.0183, \quad CI = 0.00914, \quad CR = 0.01759 < 0.10$$

一致性检验通过,对应权重为

$$\boldsymbol{\omega}^{(c)} = (0.1220, 0.3196, 0.5584)$$

这说明在企业信誉维度内部,违约经历的解释力最强,信誉评级次之,销项退货比例则作为辅助性风险信号参与评价。

3. 风险模型底层指标权重

将一级准则层与下层指标权重合并后,可得到风险评价模型在一般情况下的五项底层指标权重:

$$\boldsymbol{\omega} = (0.1036, 0.1645, 0.1466, 0.2131, 0.3722)$$

它们依次对应净利率、净利润增长率、销项退货比例、信誉评级和违约经历。可以看到,违约经历与信誉评级在总权重中占比较高,这与风险模型“重信用、重历史表现”的建模目标是一致的。

其中,企业实力部分在一般情形下沿用 3.2.2 中的判断矩阵,其一致性检验结果为

$$\lambda_{\max} = 3.0536, \quad CI = 0.0268, \quad CR = 0.0516 < 0.10$$

说明该底层权重配置同样满足一致性要求,可以直接用于风险评价模型。

当部分企业缺失净利润增长率时,论文进一步采用缺项情形下的退化模型,此时四项指标的权重调整为

$$\boldsymbol{\omega}’ = (0.2500, 0.1646, 0.2131, 0.3723)$$

分别对应净利率、销项退货比例、信誉评级和违约经历。由于该退化判断矩阵为二阶矩阵,其最大特征值为 2,因此一致性天然成立。这样可以在不强行补值的情况下保持模型结构稳定。

3.3.3 时间维度加权与风险评分汇总

风险评价同样不是静态结果。企业近年的经营表现和信用状态,对银行当前定价的参考价值明显高于较早年份的数据。因此,本文在时间层继续沿用 3.2.3 中的时间判断矩阵,对三个时间带赋予不同权重。

时间层权重向量为

$$\boldsymbol{\eta} = (\eta_1, \eta_2, \eta_3) = (0.1220, 0.3196, 0.5584)$$

其中最近时间带 $t_3$ 的权重最高,说明模型更重视企业最新阶段的风险状态。于是,对每家企业分别计算三个时间带下的单期风险评价值后,可得到最终综合风险评分:

$$RISK_i = 0.1220 \cdot RISK_i(t_1) + 0.3196 \cdot RISK_i(t_2) + 0.5584 \cdot RISK_i(t_3)$$

从论文的结果分布来看,原始风险评价值整体较为集中,直接拿来做利率与额度分层不够直观。为增强评分的区分度,论文进一步对原始结果进行了放大和百分制化处理,用于后续的利率映射与等级划分。这样处理并没有改变企业间的相对排序,只是把分数拉伸到更易解释的刻度上。

3.3.4 放贷利率计算

在利率设计上,论文采用的是“基准利率加点定价”的思路。基准利率参考央行一年期商用借贷利率 4.35%,再根据企业风险评分在 4% 至 15% 的区间内做分段线性映射。其核心逻辑是:风险评分越高,企业质量越好,银行可以给予更低利率;风险评分越低,则需要通过更高利率覆盖潜在风险。

这里的 13.9866 来自样本风险评分本身的统计结果。具体做法是:先对原始风险评价值进行放大,再将放大后的结果归一化并折算成百分制,得到一组更适合用于定价的优化后评分;然后对 123 家企业这组百分制评分取平均值,得到 13.9866

放大并归一化后的风险评价值结果图

我把这个平均值作为锚定基准利率 4.35% 的分段点。这样处理的好处是,分段位置不是人为主观指定的,而是由样本整体评分水平自然给出。于是,评分区间 [0,13.9866)[13.9866,100] 分别对应 15%→4.35%4.35%→4% 两段利率区间。设风险评分为 $x$,贷款利率为 $y$,则利率函数写为:

当 $x \ge 13.9866$ 时,

$$y = 4.35 - \frac{4.35 - 4}{100 - 13.9866}(x - 13.9866)$$

当 $x < 13.9866$ 时,

$$y = 15 - \frac{15 - 4.35}{13.9866}x$$

这一映射方式具有两个优点。第一,它保证了高评分企业的利率会逐步向低利率端收敛,从而增强优质企业的获得感;第二,它又为低评分企业保留了足够的风险溢价,能够在收益与客户流失之间取得平衡。

3.3.5 放贷额度分配

在额度设计上,论文假设年度可发放贷款总额固定为 1 亿元,并将单户可贷额度预设为五档:100 万、70 万、50 万、20 万和 10 万。为了在总额约束下兼顾风险控制与资金利用效率,模型不是按绝对分数生硬切段,而是按企业在总体排序中的排名比例来划分额度等级。

初始额度档位为:

等级 贷款额度
I 100 万
II 70 万
III 50 万
IV 20 万
V 10 万

在额度分配时,我先把年度可发放总额 1 亿元 划分为 5 份,每份 2000 万,分别对应五个额度等级。然后再结合企业风险评价值在总体中的排名比例,将 I、II、III、IV、V 五个等级对应的区间面积做成一致,从而建立“风险评价值排名比例”到“授信额度等级”的映射关系。

映射关系如图所示:

风险评价值排名比例与授信额度映射关系图

按照这一路径反推后,可以得到各档额度对应的排名比例区间,最终分层规则如下:

等级 贷款额度 排名比例
I 100 万 前 3.6347%
II 70 万 前 8.7844%
III 50 万 前 17.6110%
IV 20 万 前 38.2090%
V 10 万 其余通过筛选企业

这样一来,风险评价值越高、排名越靠前的企业,可以获得更高的授信额度;排名相对靠后的企业,则配置更保守的额度水平。至此,问题一中的两阶段框架完成闭环:LEND_i 用于决定是否放贷,RISK_i 用于决定如何放贷。

四、问题二:302家无信贷记录企业的信贷策略

说明:本人只负责了数据清洗和信贷策略制定的部分。决策树模型构建和训练的部分由队友完成,本文在这一部分仅介绍训练思路和方法,过程细节不再赘述。

4.1 数据缺失的挑战

附件二中的 302 家企业没有给出“信誉评级”和“是否违约”两项关键信息,因此无法直接代入问题一中已经建立好的借贷决策模型与风险评价模型。也就是说,问题二的核心并不是重新设计一套新的授信体系,而是先补齐缺失的信用标签,再把这些企业放回问题一的两阶段模型中完成评估。

因此,这一问的求解思路可以概括为两步:第一步,利用附件一中 123 家有信贷记录企业的数据训练分类模型,对附件二企业的信誉评级和违约经历进行预测;第二步,将预测结果补入附件二样本后,继续沿用“是否放贷 + 如何放贷”的一体化框架,完成放贷准入、利率设计和额度分配。

4.2 决策树填补数据空白

4.2.1 数据预处理

在数据清洗阶段,我首先使用 pandas.read_excel() 读取附件一和附件二中的全部表格,并转化为 DataFrame 结构。随后,对“进项发票信息”和“销项发票信息”中的作废发票样本进行剔除,避免无效票据对企业交易规模与经营特征的刻画产生干扰。

接着,将四张发票明细表中的“价税合计”按“企业代号”分别求和,得到每家企业的进货价税合计和销货价税合计。再把这两个汇总结果补充回企业主表中,使原始企业信息表能够同时包含经营标签与交易汇总特征。

由于附件一中的“信誉评级”和“是否违约”是字符串类型变量,在进入模型前还需要进行数值化编码。这里使用 LabelEncoder 对类别标签进行重编码,并用 train_test_split 将样本划分为训练集、验证集和测试集,比例设置为 3:1:1。最终,以“进货价税合计”和“销货价税合计”作为特征,分别训练预测“信誉评级”和“是否违约”的分类模型。

作为实现参考,数据清洗与训练集构造的 Python 代码如下:

import numpy as np
import pandas as pd
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, recall_score, f1_score
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.externals.six import StringIO
import pydotplus
import matplotlib.dates as mdate
from tqdm import tqdm
import matplotlib.pyplot as plt
import os
# 加入环境变量
os.environ['PATH'] += os.pathsep + ''# 环境变量路径

# 读取清洗原数据
df_0 = pd.read_excel('附件1:123家有信贷记录企业的相关数据.xlsx', sheet_name='企业信息', encoding='gbk')
df_in = pd.read_excel('附件1:123家有信贷记录企业的相关数据.xlsx', sheet_name='进项发票信息', encoding='gbk')
df_out = pd.read_excel('附件1:123家有信贷记录企业的相关数据.xlsx', sheet_name='销项发票信息', encoding='gbk')
df_in = df_in[df_in.loc[:, '发票状态'] == '有效发票']
df_out = df_out[df_out.loc[:, '发票状态'] == '有效发票']

# 分类汇总
sum_in = df_in['价税合计'].groupby(df_in['企业代号']).sum()
sum_out = df_out['价税合计'].groupby(df_out['企业代号']).sum()

# 连接表格
sum_in = sum_in.to_frame()
sum_out = sum_out.to_frame()
sum_in.rename(columns={'价税合计': '进价税合计'}, inplace=True)
sum = sum_in.join(sum_out)
df_0.set_index('企业代号', drop=True, inplace=True)
df = df_0.join(sum)

# encoding
df['信誉评级'] = LabelEncoder().fit_transform(df['信誉评级'].values.reshape(-1, 1)).reshape(1, -1)[0]
df['是否违约'] = LabelEncoder().fit_transform(df['是否违约'].values.reshape(-1, 1)).reshape(1, -1)[0]
#df.to_csv('123家企业.csv')

# machine learning
from sklearn.model_selection import train_test_split
features = df.drop(['企业名称', '信誉评级'], axis=1)
label = df['是否违约']
f_v = features.values
f_names = features.columns.values
l_v = label.values
X_tt, X_validation, Y_tt, Y_validation = train_test_split(f_v, l_v, test_size=0.2) # 验证集
X_train, X_test, Y_train, Y_test = train_test_split(X_tt, Y_tt, test_size=0.25) # 测试集 因进行或一次切割,比例进行调整

models = []
#models.append(('LogisticRegression', LogisticRegression(C = 1000, tol = 1e-10, solver = 'sag', max_iter = 10000)))
models.append(('DecisionTreeGini', DecisionTreeClassifier()))
#models.append(('DecisionTreeEntropy', DecisionTreeClassifier(criterion='entropy')))
for (clf_name, clf) in models:
 clf.fit(X_train, Y_train)
 xy_lst = [(X_train, Y_train), (X_validation, Y_validation), (X_test, Y_test)]
 for i in range(len(xy_lst)):
  X_part = xy_lst[i][0]
  Y_part = xy_lst[i][1]
  Y_pred = clf.predict(X_part)
  print(i)
  print(clf_name, 'ACC', accuracy_score(Y_part, Y_pred))
  print(clf_name, 'REC', recall_score(Y_part, Y_pred))
  print(clf_name, 'F1', f1_score(Y_part, Y_pred))

4.2.2 模型训练

这一问选择决策树作为核心机器学习模型,主要原因在于:一方面,样本规模有限,决策树在小样本分类问题中更容易训练;另一方面,决策树具备较强的可解释性,便于把“进销货规模如何影响信誉评级和违约经历”这件事直接转化成可视化的分类规则。

从原理上看,决策树通过不断选择最优特征划分样本集合,使每次划分后的节点纯度尽可能提高。这里采用以 Gini 系数 为标准的分类树,对“信誉评级”和“是否违约”两个标签分别进行训练。

在模型评估阶段,我使用准确率 ACC、召回率 RECF1-score 作为主要评价指标,分别衡量模型整体分类正确率、对目标类别的识别能力以及准确率与召回率之间的平衡程度。通过分别训练“信誉评级”与“是否违约”两个分类任务,可以得到后续用于预测附件二企业信用标签的决策树模型。

从实现结果上看,这段代码会分别输出训练集、验证集和测试集上的 ACCRECF1 指标,其中 012 分别对应训练集、验证集和测试集。这样做的目的,是同时观察模型在训练样本与未见样本上的表现,避免只看训练结果而忽略泛化能力。此外,模型还可以进一步导出决策树图,从而把分类规则可视化展示出来。

4.2.3 预测结果

模型训练完成后,将附件二中的 302 家企业输入决策树,即可获得对应的“信誉评级”和“是否违约”预测值。这样一来,原本缺失的信用标签被补齐,附件二企业便具备了与附件一企业相同的字段结构,可以继续参与后续的量化授信分析。

从结果上看,进货价税合计与销货价税合计对信誉评级和违约经历具有一定的区分能力,能够为无历史信贷记录企业提供一个可操作的信用标签近似值。虽然这种预测结果不能完全替代真实的历史授信表现,但在题目给定信息有限的条件下,已经足以支撑后续的放贷决策和风险定价。

进一步地,在补齐标签之后,附件二样本便可以和问题一一样,继续计算企业实力总得分、借贷能力归一化总评分,以及三个时间带下的年度风险评价总得分,并最终汇总为综合风险评价值。这样一来,决策树的输出结果不再只是单独的分类标签,而是直接成为后续 LEND_iRISK_i 计算链条中的输入变量。

4.3 信贷策略制定

在补齐信誉评级与违约经历之后,附件二中的 302 家企业就可以重新放回问题一已经建立好的授信框架中继续计算。具体求解仍然沿着“是否放贷”与“如何放贷”两条主线展开,只是输入样本由附件一的历史信贷企业,切换成了通过决策树补齐标签后的附件二企业。

1. 是否放贷

首先,利用企业实力得分和供求关系稳定性得分计算借贷能力评价值 LEND_i,并对结果进行归一化与百分制折算。这样可以得到 302 家企业在同一评价标准下的放贷能力分布,再按照问题一中已经确定的等级划分标准,对企业进行准入判断。也就是说,问题二中的“是否放贷”部分,本质上仍然是在判断这些企业落入 A、B、C、D 哪一个放贷等级区间。

对应的‘是否放贷’可视化结果如下:

问题二是否放贷可视化结果图

2. 放贷利率

对于通过准入的企业,继续计算综合风险评价值,并沿用问题一中的利率分配思路进行定价。这里仍采用“百分制平均值锚定基准利率”的方法,只不过附件二样本对应的百分制评分均值变为 23.1107。因此,在问题二中,利率分段点不再是问题一中的 13.9866,而是改为以 23.1107 作为锚定 4.35% 基准利率的分界值。高于该均值的企业向低利率区间映射,低于该均值的企业则向高利率区间映射。

对应的利率计算公式为:

当 $x \ge 23.1107$ 时,

$$y = 4.35 - \frac{4.35 - 4}{100 - 23.1107}(x - 23.1107)$$

当 $x < 23.1107$ 时,

$$y = 15 - \frac{15 - 4.35}{23.1107}x$$

对应的利率归一化结果如下:

问题二利率归一化结果图

3. 放贷额度

在额度分配上,仍然按照风险评价值的排序结果计算排名比例,再结合问题一中已经总结出的额度划分标准,为附件二企业分配对应的授信额度等级。换句话说,问题二并没有重新设计额度体系,而是把预测后的企业放入问题一同样的额度评价框架中,根据其风险评价值在总体中的相对位置,确定最终的授信额度。

综合来看,问题二的关键不在于改变原有信贷决策逻辑,而在于先用决策树补齐信用标签,再将补齐后的企业接回原有模型。这样便实现了从数据缺口修复到授信策略生成的完整闭环。

五、问题三:突发因素下的策略优化

5.1 方法论:压力测试法

在商业银行的风险管理实践中,压力测试通常用于衡量极端不利情境下企业经营状况和银行风险暴露的变化。它能够帮助银行识别潜在风险因素与财务结果之间的关系,进一步分析在突发冲击下银行的授信策略是否仍然稳健。结合本题设定,第三问的核心不再是历史数据拟合,而是研究突发因素发生后,不同行业、不同类型企业的指标会如何变化,并据此重新评估授信策略。

从方法上看,压力测试主要包括敏感性测试和情景测试两类。敏感性测试强调单个风险因素变化带来的影响,而情景测试则同时考虑多个因素在极端环境下的联动变化。由于题目中的突发因素更接近于真实场景中的系统性冲击,因此这里采用情景测试法来模拟企业在特殊环境下的经营表现。

5.2 以物流行业为例

5.2.1 情景假设

在情景设定上,这里选取新冠疫情作为典型突发因素,并以物流行业为例展开分析。之所以选择物流行业,是因为在疫情背景下,大量线下活动受限,居民生活物资和企业生产资料的流转更依赖物流体系,从而可能带来物流行业利润率上升、利润增长率提升以及退货概率下降等变化。

因此,本文假设疫情冲击下物流企业的经营指标出现系统性改善,并据此分析银行应如何调整贷款额度和利率。

5.2.2 测试方案

具体测试时,先通过数据透视表筛选出物流相关企业代号,再对这些企业分别施加三组压力情景:

  • 利润率和利润增长率提升 20%,同时退货率下降 20%
  • 利润率和利润增长率提升 40%,同时退货率下降 40%
  • 利润率和利润增长率提升 60%,同时退货率下降 60%

在每一种情景下,都重新计算物流企业的借贷决策得分与信贷风险得分,并比较其相对原始状态的增长率,从而判断突发因素对企业授信结果的影响方向与幅度。

5.2.3 求解结果

问题三物流行业二次评估结果图

从物流企业借贷风险的二次评估结果来看,在三组情景下,企业风险得分增长率整体呈上升趋势。这说明随着利润水平提高、退货率下降,企业的盈利能力增强,综合风险得分随之改善,也就意味着违约风险相对下降。

问题三物流行业借贷决策分数增长率图

从借贷决策得分的二次评估结果来看,也呈现出与风险得分相似的规律:企业利润率和利润增长率越高、退货率越低,其借贷决策得分增长越明显。这表明突发因素并不一定只会带来负面影响,对于像物流这样受益于特殊环境的行业,企业综合实力反而可能增强。

基于这一结果,银行在面对类似情景时,可以考虑对相关行业采取更积极的授信调整策略,例如适当降低准入门槛、下调贷款年利率,或在风险可控的前提下提高授信额度。这样既有助于控制客户流失率,也能在行业景气改善阶段提升银行自身的收益水平。

5.3 动态调整机制

压力测试的意义不只是给出一次性的情景结论,更重要的是形成动态调整机制。当外部环境发生显著变化时,银行可以根据行业属性和企业指标变化,及时重算借贷能力评价值与风险评价值,并同步修正利率、额度和准入条件。

换句话说,问题三给出的并不是一个固定答案,而是一种在突发情境下可重复使用的策略更新框架:先识别冲击因素,再设定情景假设,随后重新评估企业得分,最后调整授信策略。这样可以显著增强整套模型在复杂环境中的鲁棒性与现实适用性。

六、结论

本文围绕中小微企业信贷决策问题,构建了一套从企业评价、风险定价到策略优化的完整量化分析框架。在问题一中,我将信贷决策拆分为“是否放贷”与“如何放贷”两个层次:前者通过借贷决策模型计算企业借贷能力评价值 (LEND_i),用于完成放贷准入判断;后者通过信贷风险评价模型计算综合风险评价值 (RISK_i),用于进一步确定贷款利率与授信额度。这样一来,原本较为笼统的信贷决策过程,被拆解为结构清晰、逻辑明确且具备较强解释性的两阶段建模流程。

在具体求解上,本文综合使用了层次分析法、TOPSIS 法、模糊综合评价与时间加权思想。其中,AHP 主要负责确定准则层、指标层及时间维度的权重;TOPSIS 用于对企业实力进行多指标综合评分;模糊综合评价用于处理供求关系稳定性这类定性较强的指标;时间权重则用于完成跨年度信息整合。基于这一组合方法,模型不仅能够反映企业当期经营表现,还能够兼顾不同年份信息的重要性差异,从而提高授信判断的稳定性。

在问题二中,针对无历史信贷记录企业缺失“信誉评级”与“是否违约”字段的问题,本文引入决策树模型完成信用标签补齐,再将补齐后的样本重新接入问题一的授信框架之中继续计算。这样就实现了“先补数据、再做决策”的闭环处理路径,使得原本无法直接进入授信模型的企业,也可以在统一评价标准下完成放贷准入、利率分配和额度划分。

在问题三中,本文进一步引入压力测试法,以物流行业为例,模拟突发因素对企业经营指标和信贷策略的影响。通过设置多组利润提升与退货率下降的情景,重新计算借贷决策得分与风险评价得分,并据此动态调整授信策略。由此可见,这套模型不仅适用于静态历史数据分析,也具备一定的情景扩展能力,可用于银行在复杂经营环境下进行策略修正与风险应对。

总体而言,本文建立的模型兼具可解释性、可操作性和一定的扩展性,能够较好地支持银行在固定信贷总额约束下,对中小微企业做出更系统、更量化的授信决策。

七、模型评价与反思

7.1 方法组合优势

从方法组合上看,本文最大的优势在于构建了一个层次分明、前后衔接紧密的综合评价体系。借贷决策模型负责判断企业是否具备放贷资格,信贷风险模型负责在准入之后进一步完成利率与额度分配,两者分工明确,既避免了单一评分模型同时承担过多任务,也使模型结构更符合银行实际授信流程。

在指标求解层面,AHP、TOPSIS 与模糊综合评价的组合具有较强互补性。AHP 能够将经验判断系统化,适合处理多层指标体系中的权重分配问题;TOPSIS 能够在多个量化指标之间给出较稳定的综合排序结果;模糊综合评价则弥补了定性指标难以直接度量的不足,使供求关系稳定性等指标能够被纳入统一的评价体系中。三者结合后,既保留了模型的数学结构,也增强了结果的现实解释性。

从应用扩展性来看,本文没有把模型局限在“有历史信贷记录企业”的场景中,而是进一步通过决策树完成标签预测,使无历史授信企业也能纳入同一套分析框架。同时,在问题三中又引入压力测试法,将静态授信模型扩展到突发情景分析。这说明本文的建模框架并不是一次性的结论工具,而是一个可以根据数据条件和业务场景不断外延的策略分析框架。

7.2 模型局限性

尽管模型整体具备较好的解释性与可操作性,但仍然存在若干局限。首先,AHP 中部分判断矩阵依赖人工经验赋值,不同研究者对指标重要性的理解可能存在差异,因此权重结果带有一定主观性。虽然本文进行了一致性检验,但一致性通过并不意味着权重一定最优,只能说明判断矩阵在内部逻辑上基本自洽。

其次,决策树部分虽然解决了附件二企业信用标签缺失的问题,但其训练样本毕竟只来自附件一的 123 家企业,样本量相对有限,且用于预测的特征维度也较为简化。因此,模型在样本外企业上的泛化能力仍然有限,预测出的“信誉评级”和“是否违约”更适合作为近似标签,而不能完全替代真实的长期信用历史。

再次,本文构建的大部分指标仍高度依赖企业历史交易票据数据,例如利润率、利润增长率、退货比例、稳定客户占比等。这意味着模型对已有经营记录的企业较为友好,但对于交易数据稀疏、处于早期成长阶段或财务记录不完整的企业,其识别能力会受到一定限制。

最后,问题三中的压力测试仍然建立在情景假设基础之上。无论是选择物流行业,还是设定利润提升与退货率下降的具体比例,都带有一定的经验判断色彩。现实环境中的突发冲击往往更加复杂,行业之间也会存在明显异质性,因此该部分结论更适合作为策略模拟参考,而非精确预测结果。

7.3 改进方向

未来如果进一步提升模型效果,可以从以下几个方向继续优化。第一,在标签预测部分,可以考虑引入随机森林、XGBoost 或 LightGBM 等集成学习模型,替代单棵决策树,以提高对“信誉评级”和“是否违约”预测的稳定性与泛化能力。尤其在样本规模逐渐扩大后,集成模型通常能够取得更好的分类表现。

第二,在指标体系构建上,可以适当引入更多外部信息,例如企业财务报表、行业景气度、上下游集中度、经营区域、舆情风险和法人画像等,从而降低模型对发票数据单一来源的依赖。这样不仅可以提高企业画像的完整性,也有助于增强模型对不同类型企业的适应能力。

第三,在授信策略层面,可以继续推进分行业、分客群、分生命周期的差异化建模。例如对制造业、物流业、贸易业分别建立更贴合其经营特征的指标体系和风险映射规则,而不是完全使用统一模型口径。这样可以进一步提升信贷策略的精细化程度和业务落地效果。

第四,在压力测试部分,还可以从单行业示例扩展为多行业、多冲击因素联合测试,并结合动态监测机制实现定期重估。这样一来,模型就不只是一个静态分析工具,而能够逐步演化为面向实际风控管理的动态授信决策系统。