零、相关内容
2020年全国大学生数学建模竞赛的C题“中小微企业信贷决策”要求参赛者通过数学建模,为银行提供一个量化分析模型,以评估中小微企业的信贷风险,并制定相应的信贷策略。以下是对该问题的详细分析与解答:
-
问题理解与数据整理
- 数据概览:需要仔细阅读并理解附件1和附件2中提供的企业数据,包括企业信息、进项发票、销项发票等[1][2]。
- 数据预处理:对数据进行清洗和预处理,包括剔除无效数据、量化信誉评级等操作[5]。
-
信贷风险量化分析
- 建立风险评估模型:利用机器学习方法(如随机森林、支持向量机等)或统计方法(如逻辑回归)建立信贷风险评估模型,预测企业的违约概率[3]。
- 模型验证:通过交叉验证等方法验证模型的准确性和稳健性,确保模型能够有效预测信贷风险[4]。
-
信贷策略制定
- 多目标优化:在风险评估的基础上,建立一个多目标优化模型,考虑贷款收益最大化、客户流失率最小化及违约风险最小化等因素,确定银行的信贷策略[3]。
- 策略细化:根据优化结果,为每家企业制定具体的贷款额度、利率和期限等信贷条件[2]。
-
无信贷记录企业评估
- 信誉评级预测:对于无信贷记录的企业,首先需要预测其信誉评级,可以通过与企业规模、年利润率等指标建立预测模型[5]。
- 信贷风险评估:在预测出信誉评级后,将这些企业的数据代入已建立的信贷风险评估模型中,得到其信贷风险评分[3]。
-
突发因素下的信贷调整
- 影响程度量化:收集并分析新冠疫情等突发因素对企业的不同影响,将影响程度量化为具体指标[5]。
- 模型调整与预测:将突发因素的影响因素加入到信贷风险评估模型中,重新训练模型,并预测调整后的信贷策略[3]。
-
综合策略制定
- 优先级排序:根据信贷风险和预期收益对所有企业进行排序,确定优先放贷的企业名单[4]。
- 策略分配:在年度信贷总额固定的约束下,按照优先级为企业分配贷款额度和利率,确保整体信贷策略的最优化[2]。
总的来说,通过上述分析,可以建立起一个全面的信贷风险量化分析模型,并为银行提供一个科学的信贷策略。在实际操作中,可能还需要考虑更多实际因素,如市场动态、行业趋势等,以确保模型的实际应用效果。
一、部分题目
2020年高教社杯全国大学生数学建模竞赛题目
C题 中小微企业的信贷决策
在实际中,由于中小微企业规模相对较小,也缺少抵押资产,因此银行通常是依据信贷政策、企业的交易票据信息和上下游企业的影响力,向实力强、供求关系稳定的企业提供贷款,并可以对信誉高、信贷风险小的企业给予利率优惠。银行首先根据中小微企业的实力、信誉对其信贷风险做出评估,然后依据信贷风险等因素来确定是否放贷及贷款额度、利率和期限等信贷策略。
某银行对确定要放贷企业的贷款额度为10~100万元;年利率为4%~15%;贷款期限为1年。附件1~3分别给出了123家有信贷记录企业的相关数据、302家无信贷记录企业的相关数据和贷款利率与客户流失率关系的2019年统计数据。该银行请你们团队根据实际和附件中的数据信息,通过建立数学模型研究对中小微企业的信贷策略,主要解决下列问题:
(1) 对附件1中123家企业的信贷风险进行量化分析,给出该银行在年度信贷总额固定时对这些企业的信贷策略。
(2) 在问题1的基础上,对附件2中302家企业的信贷风险进行量化分析,并给出该银行在年度信贷总额为1亿元时对这些企业的信贷策略。
(3) 企业的生产经营和经济效益可能会受到一些突发因素影响,而且突发因素往往对不同行业、不同类别的企业会有不同的影响。综合考虑附件2中各企业的信贷风险和可能的突发因素(例如:新冠病毒疫情)对各企业的影响,给出该银行在年度信贷总额为1亿元时的信贷调整策略。
二、部分论文
三、部分源代码
(一)数据处理代码
完整代码 https://github.com/yan-fanyu/CUMCM-Paper-And-SourceCode
cb=xlsread('data','进项发票信息', 'A2:I210948');
sr=xlsread('data','销项发票信息', 'A2:I162485');
cb1 = zeros(123, 5);
sr1 = zeros(123, 5);
for i=1:1:length(cb(:, 1))
if cb(i, 5) > 0 && cb(i, 8) > 0
cb1(cb(i, 1), cb(i, 9)-2015) = cb1(cb(i, 1), cb(i, 9)-2015) +1;
end
end
for i=1:1:length(sr(:, 1))
if sr(i, 5) > 0 && sr(i, 8) > 0
sr1(sr(i, 1), sr(i, 9)-2015) = sr1(sr(i, 1), sr(i, 9)-2015) +1;
end
end
(二)熵权法与TOPSIS代码
完整代码 https://github.com/yan-fanyu/CUMCM-Paper-And-SourceCode
import numpy as np
import pandas as pd
## 读取数据
data=pd.read_csv('data6.csv',encoding='utf-8',index_col=0)
indicator=data.columns.tolist() ## 指标个数 多少列
project=data.index.tolist() ## 样本个数 多少行
value=data.values
print("value = ", value)
## 定义数据标准化函数。为了避免求熵值时对数无意义,对数据进行平移,对标准化后的数据统一加了常数0.001
def std_data(value,flag):
for i in range(len(indicator)):
if flag[i]=='+':
value[:,i]=(value[:,i]-np.min(value[:,i],axis=0))/(np.max(value[:,i],axis=0)-np.min(value[:,i],axis=0))+0.01
elif flag[i]=='-':
value[:,i]=(np.max(value[:,i],axis=0)-value[:,i])/(np.max(value[:,i],axis=0)-np.min(value[:,i],axis=0))+0.01
return value
# 定义熵值法函数、熵值法计算变量的权重
def cal_weight(indicator, project, value):
p = np.array([[0.0 for i in range(len(indicator))] for i in range(len(project))])
# print(p)
for i in range(len(indicator)):
p[:, i] = value[:, i] / np.sum(value[:, i], axis=0)
e = -1 / np.log(len(project)) * sum(p * np.log(p)) # 计算熵值
g = 1 - e # 计算一致性程度
w = g / sum(g) # 计算权重
return w
# 调用函数将数据标准化,即为每个数据添加正相关还是负相关标志
std_value=std_data(value, flag)
# 调用函数求权重
w = cal_weight(indicator, project, std_value)
w = pd.DataFrame(w, index=data.columns, columns=['权重'])
print(w)
# 调用函数求得分
score = np.dot(std_value, w).round(4) # 对应数据与权重相乘得到分数,结果保留四位小数
score = pd.DataFrame(score, index=data.index, columns=['综合得分']).sort_values(by=['综合得分'], ascending=False)
print(score)
score.to_excel("jieguo.xlsx")
(三)最小二乘法代码
完整代码 https://github.com/yan-fanyu/CUMCM-Paper-And-SourceCode
X = [0.04 0.0425 0.0465 0.0505 0.0545 0.0585 0.0625 0.0665 0.0705 0.0745 0.0785 0.0825 0.0865 0.0905 0.0945 0.0985 0.1025 0.1065 0.1105 0.1145 0.1185 0.1225 0.1265 0.1305 0.1345 0.1385 0.1425 0.1465 0.15
];
Y1=[0 0.094574126 0.135727183 0.224603354 0.302038102 0.347315668 0.41347177 0.447890973 0.497634453 0.511096612 0.573393087 0.609492115 0.652944774 0.667541843 0.694779921 0.708302023 0.731275401 0.775091405 0.798227368 0.790527266 0.815196986 0.814421029 0.854811097 0.870317343 0.871428085 0.885925945 0.874434682 0.902725909 0.922060687];
YY = [];
A = -200:0.1:-190;
B = -15:0.1:-11;
C = 14:0.1:16;
D = -1:0.1:1;
E = [];
XA = [];
XC=[];
XB=[];
XD=[];
XX = [];
ii = 0;
e = 0;
for i=1:length(A)
a=A(i);
for j=1:length(B)
b=B(j);
for p=1:length(D)
d=D(p);
for k=1:length(C)
c=C(k);
e = 0;
for s=1:length(X)
x=X(s);
f = a*x^3+b*x^2+c*x+d;
e = e+(f-Y1(s))^2;
end
if e < 0.02255
ii = ii + 1;
XA(ii) =a;
XB(ii)=b;
XC(ii)=c;
XD(ii)=d;
XX(ii) = ii;
E(ii) = e;
end
end
end
end
end
[~,position]=min(E);
XA(position)
XB(position)
XC(position)
XD(position)
plot(XX, E);
(四)粒子群代码
完整代码 https://github.com/yan-fanyu/CUMCM-Paper-And-SourceCode
clear;
a1=-194.7;
b1=-13.4;
c1=15.6;
d1=-0.5;
a2=-194.8;
b2=-9.6;
c2=14.8;
d2=-0.5;
a3=-159.7;
b3=-14.5;
c3=14.8;
d3=-0.5;
% 代号-得分-等级
E_Z_DJ = [
1 0.1172 9
2 0.1173 9
12 0.5834 7
25 0.1163 7
34 0.1151 7
38 0.1841 7
45 0.1447 7
47 0.1157 7
49 0.1167 7
53 0.1155 7
56 0.1155 7
60 0.1579 7
61 0.2009 7
62 0.8322 7
63 0.1165 7
64 0.1061 5
66 0.113 5
69 0.3324 5
71 0.1166 7
73 0.1161 7
75 0.1152 7
76 0.1263 5
77 0.1157 7
78 0.1161 7
80 0.1138 5
82 0.1178 7
86 0.1148 7
87 0.1132 5
88 0.1146 5
89 0.1188 5
90 0.1156 7
91 0.1153 7
92 0.1142 5
93 0.1124 5
94 0.1058 5
95 0.1098 5
96 0.1111 5
98 0.1129 5
99 0.1138 7
100 0.1122 5
102 0.1164 7
103 0.1382 7
104 0.1662 7
105 0.1147 7
106 0.1156 7
107 0.1149 5
108 0.1128 5
109 0.1149 7
110 0.1129 5
111 0.1132 5
112 0.1134 5
113 0.1126 5
114 0.1111 5
115 0.1134 5
116 0.1125 5
117 0.1068 5
118 0.1134 5
119 0.1062 5
120 0.1134 5
121 0.1118 5
122 0.1126 5
123 0.1709 5
124 0.1128 5
125 0.1123 5
126 0.113 5
127 0.1123 5
128 0.1381 5
129 0.1127 5
130 0.112 5
131 0.1141 5
132 0.1126 5
133 0.1145 5
134 0.1124 5
135 0.113 5
136 0.1119 5
137 0.1127 5
138 0.1128 5
139 0.1134 5
140 0.112 5
141 0.1057 5
142 0.1118 5
143 0.1132 5
144 0.1136 5
145 0.1333 5
146 0.1126 5
147 0.1119 5
148 0.1115 5
149 0.1123 5
150 0.1148 5
151 0.1153 5
152 0.1117 5
153 0.1116 5
154 0.1129 5
155 0.1128 5
156 0.1127 5
157 0.1132 5
158 0.1129 5
159 0.1115 5
160 0.1132 5
161 0.1126 5
162 0.1118 5
163 0.1115 5
164 0.1119 5
165 0.1118 5
166 0.1133 5
167 0.1127 5
168 0.1113 5
169 0.1141 5
170 0.1133 5
171 0.1125 5
172 0.1118 5
173 0.1115 5
174 0.1124 5
175 0.1192 5
176 0.1126 5
177 0.1125 5
178 0.1128 5
179 0.1123 5
180 0.1129 5
181 0.1135 5
182 0.1127 5
183 0.1123 5
184 0.1123 5
185 0.1128 5
186 0.1116 5
187 0.1129 5
188 0.1122 5
189 0.1129 5
190 0.113 5
191 0.1121 5
192 0.1145 5
193 0.1125 5
194 0.1117 5
195 0.1127 5
196 0.1139 5
197 0.1127 5
198 0.1144 5
199 0.1128 5
200 0.1108 5
201 0.1118 5
202 0.1156 5
203 0.1127 5
204 0.1129 5
205 0.1123 5
206 0.5633 5
207 0.1166 5
208 0.1126 5
209 0.1132 5
210 0.1129 5
211 0.113 5
212 0.1123 5
213 0.1165 5
214 0.1155 5
215 0.1131 5
216 0.1133 5
217 0.1143 5
218 0.1134 5
219 0.1118 5
220 0.1545 5
221 0.1126 5
222 0.1124 5
223 0.1132 5
224 0.1152 5
225 0.1206 5
226 0.1151 5
227 0.1123 5
228 0.1125 5
229 0.1126 5
230 0.1117 5
231 0.1139 5
232 0.1574 5
233 0.1633 5
234 0.13 5
235 0.1844 5
236 0.134 5
237 0.2421 5
238 0.1118 5
239 0.1123 5
240 0.118 5
241 0.1132 5
242 0.1124 5
243 0.1138 5
244 0.1213 5
245 0.1107 5
246 0.1129 5
247 0.2526 5
248 0.1121 5
249 0.1134 5
250 0.1133 5
251 0.1351 5
252 0.2107 5
253 0.1157 5
254 0.1305 5
255 0.112 5
256 0.1105 5
257 0.1711 5
258 0.1115 5
259 0.1821 5
260 0.1164 5
261 0.112 5
262 0.1086 5
263 0.1119 5
264 0.1198 5
265 0.1219 5
266 0.1186 5
267 0.1138 5
268 0.1562 5
269 0.114 5
270 0.1426 5
271 0.1075 5
272 0.1107 5
273 0.1123 5
274 0.1166 5
275 0.1139 5
276 0.1128 5
277 0.1208 5
278 0.1101 5
279 0.1121 5
280 0.1127 5
281 0.1109 5
282 0.1103 5
283 0.1122 5
284 0.1109 5
285 0.1121 5
286 0.1154 5
287 0.1149 5
288 0.1122 5
289 0.1139 5
290 0.1139 5
291 0.1124 5
292 0.2104 5
293 0.1129 5
294 0.1135 5
295 0.1126 5
296 0.1133 5
297 0.113 5
298 0.1139 5
299 0.1153 5
300 0.1122 5
301 0.1179 5
302 0.1098 5
];
E = E_Z_DJ(:, 1);
DJ = E_Z_DJ(:, 3);
Z = E_Z_DJ(:, 2);
fun_range = [0,3.08;0,2.1]; %每个维度的求解范围,行代表维度,第一列最小值,第二列最大值
density = 0.01; %图像中取点的密度
d = 2; %维度
popsize = 10; %种群大小
maxgen = 100; %最大迭代次数
limit_v = 10; %最大运动速度
maxormin = 0; %求最大值还是最小值。最大值为1,最小值为0
dynamic = 1; %是否采用动态参数
W = [0.7,1.4]; %惯性因子
C2 = [0.5,2.5];
C1 = [0.5,2.5]; %学习因子。
ZZ = pso1_im(funct,fun_range,density,d);
[x,v,fitness,pbest,gbest,gbest_fitness,gbest_index,pbest_fitness] =...
pso1_in(funct,popsize,d,fun_range,limit_v,maxormin);
[gbest_fitness,gbest_index,record] =...
pso1_in2(funct,d,popsize,maxgen,dynamic,W,C1,C2,fun_range,limit_v,density...
,x,v,fitness,pbest,gbest,gbest_fitness,gbest_index,pbest_fitness,maxormin);
% sigma = 4:1:15; 年利率
% D = 10:1:100; % 投放金额
T = 1; %周期为 1 年
M = 10000; % 总贷款额度1亿
完整代码 https://github.com/yan-fanyu/CUMCM-Paper-And-SourceCode
Sigma = [];
DD = [];
Beta = [];
W = []; % 利润,即最大化目标
Z_S = ones(1, length(E)); % 每个利率 1不用管
Z_D = ones(1, length(E)); % 每个投资
N = 10000; % 迭代次数
nnn = 0;
for i=1:1:N
Sigma = []; % 该次遍历的利率
DD = []; % 该次遍历的贷款
w = 0; % 该次遍历的目标值
for j=1:length(E)
Sigma(j) = 0.04 + (0.15-0.04).*rand(1,1);
x = Sigma(j);
DD(j) = 10 + (100-10).*rand(1,1);
d = DD(j);
if DJ(j) == 1
Beta(j) = a1*x^3+b1*x^2+c1*x+d1;
elseif DJ(j) == 2
Beta(j) = a2*x^3+b2*x^2+c2*x+d2;
else
Beta(j) = a3*x^3+b3*x^2+c3*x+d3;
end
w = w + d*x*(1-Beta(j))*Z(j);
end
if w > 60
nnn = nnn+1;
W(nnn) = w;
Z_S(nnn,:) = Sigma(:);
Z_D(nnn,:) = DD(:);
end
end
XX = 1:1:nnn;
plot(XX, W, '*');
for i=1:length(Z_S(:, 1))
sum(Z_D(i,:))
end