2020年国赛高教杯数学建模
C题 中小微企业的信贷决策
原题再现
在实际中,由于中小微企业规模相对较小,也缺少抵押资产,因此银行通常是依据信贷政策、企业的交易票据信息和上下游企业的影响力,向实力强、供求关系稳定的企业提供贷款,并可以对信誉高、信贷风险小的企业给予利率优惠。银行首先根据中小微企业的实力、信誉对其信贷风险做出评估,然后依据信贷风险等因素来确定是否放贷及贷款额度、利率和期限等信贷策略。
某银行对确定要放贷企业的贷款额度为10至100万元;年利率为4%至15%;贷款期限为1年。附件1~3分别给出了123家有信贷记录企业的相关数据、302家无信贷记录企业的相关数据和贷款利率与客户流失率关系的2019年统计数据。该银行请你们团队根据实际和附件中的数据信息,通过建立数学模型研究对中小微企业的信贷策略,主要解决下列问题:
(1) 对附件1中123家企业的信贷风险进行量化分析,给出该银行在年度信贷总额固定时对这些企业的信贷策略。
(2) 在问题1的基础上,对附件2中302家企业的信贷风险进行量化分析,并给出该银行在年度信贷总额为1亿元时对这些企业的信贷策略。
(3) 企业的生产经营和经济效益可能会受到一些突发因素影响,而且突发因素往往对不同行业、不同类别的企业会有不同的影响。综合考虑附件2中各企业的信贷风险和可能的突发因素(例如:新冠病毒疫情)对各企业的影响,给出该银行在年度信贷总额为1亿元时的信贷调整策略。
附件1 123家有信贷记录企业的相关数据
附件2 302家无信贷记录企业的相关数据
附件3 银行贷款年利率与客户流失率关系的2019年统计数据
附件中数据说明:
(1) 进项发票:企业进货(购买产品)时销售方为其开具的发票。
(2) 销项发票:企业销售产品时为购货方开具的发票。
(3) 有效发票:为正常的交易活动开具的发票。
(4) 作废发票:在为交易活动开具发票后,因故取消了该项交易,使发票作废。
(5) 负数发票:在为交易活动开具发票后,企业已入账记税,之后购方因故发生退货并退款,此时,需开具的负数发票。
(6) 信誉评级:银行内部根据企业的实际情况人工评定的,银行对信誉评级为D的企业原则上不予放贷。
(7) 客户流失率:因为贷款利率等因素银行失去潜在客户的比率。
整体求解过程概述(摘要)
中小微企业信贷风险是商业银行投资中重大的风险。信贷风险产生的根源是借贷双方信息的不对称,建立信贷风险量化模型是提高信息对称度的重要手段。本文建立了信贷决策模型,通过朴素贝叶斯算法及多元因子分析,对各企业信贷风险进行量化,给出贷款额度、利率等信贷策略。
针对问题一,首先对附件1中的数据进行处理,再对信誉等级、盈利额以及营运能力等指标进行量化分析,建立朴素贝叶斯分类模型。根据不同企业的信誉等级、盈利额以及营运能力,将贷款额度进行量化分配得到信贷分配策略。
针对问题二,我们将问题一中求得的数据进行拟合,来预测附件二中无信贷记录企业的贷款额度和年利率。基于问题一的朴素贝叶斯模型,将企业的贷款额度根据盈利额的占比进行量化分配,得到信贷分配策略。
针对问题三,对附件2中的企业依据关键词及税率进行行业划分。分别从多方面综合考虑新型冠状病毒对各个行业的影响,通过SPSS软件进行多元因子分析,结果显示,医药医疗业、互联网行业经济迅速得到增长,但其余行业受疫情影响较严重。最终,根据附件二中302家企业所归行业类别及该企业经济涨跌情况,给出合理化贷款分类策略调整。最后,引用精确率、召回率和得分数来验证模型的准确性。
模型假设:
1. 假设该银行为一般商业银行,以获取盈利为目的;
2. 忽略道德风险对银行信贷业务的影响;
3. 假设发票中的税额全部按时缴纳;
4. 假设问题一、二中企业未受到突发因素的影响;
5. 假设不考虑费用支出等对企业盈利的影响。
问题分析:
问题一的分析
我们运用机器学习算法对附件1中数据进行量化分析(量化分析可以帮助我们更加直观的衡量风险和收益)。问题中,首先将企业贷款信誉等级分为6个级别,根据附表中的数据,筛选出有效发票的数据之后,计算该123家有信贷记录企业的公司的盈利额。其次,由盈利企业的盈利情况、企业贷款信誉等级和企业开票数量,使用分类算法中的朴素贝叶斯算法编程,分析得出该银行对这些企业在年度信贷总额固定时的信贷策略。
问题二的分析
对于问题二,运用问题一中的模型对附件2的数据进行量化分析。用附件1中的企业盈利额和企业开票数量分别与银行贷款额度、年利率作拟合曲线图,分析各个特征条件之间的相关性。因附件2中的企业无信誉等级,我们只能通过企业的盈利亏损情况和企业开票数量,用机器学习算法进行数据整合、分析和计算,来给出银行对其贷款额度的分配策略。
问题三的分析
本题对附件2中的企业依据关键词及税率进行行业划分。我们分别从房地产业、制造业、基础建设业、服务业、旅游业、医药医疗业、互联网业等多个行业综合考虑新型冠状病毒疫情的影响,通过SPSS软件做多元因子分析,得出,医药医疗业、互联网行业经济迅速得到增长,其他行业受疫情影响,收到严重打击。最终,根据附件二中321家企业所归行业类别及该企业经济涨跌情况,给出合理化贷款分类策略调整。
模型的建立与求解整体论文缩略图
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
程序代码:(代码和文档not free)
#导入excel文件处理库
import openpyxl
#读入企业信贷记录相关数据
wb = openpyxl.load_workbook('附件1:123家有信贷记录企业的相关数据.xlsx')
#选择df1,企业信息
df1 = wb['企业信息']
#定义存储公司名称列表
name_list = []
#循环读入公司名称
for row in df1.iter_rows(min_row=2, max_row=124,min_col=1, max_col=1):
for cell in row:
#遍历读取公司名称存入列表中
name_list.append(cell.value)
#定义存储信誉评级、是否违约列表
leavel_list = []
weiyue_list = []
#循环读入信誉评级与是否违约
for row in df1.iter_rows(min_row=2, max_row=124,min_col=3, max_col=4):
#展示存储每一行数据
tmp = []
#遍历读取数据
for cell in row:
tmp.append(cell.value)
#取第一项数据即为信誉评级
leavel_list.append(tmp[0])
#取第二项数据即为是否违约
weiyue_list.append(tmp[-1])
#将信誉评级与是否违约合并为一个等级
cls = ['leavel_list[i]'+'weiyue_list[i]' for i in range(len(leavel_list))]
#标准的公司分类为6类
cls_normal = ['A否','B是','B否','C是','C否','D是']
#定义存储不同分类的所属公司
cls_gs = []
#遍历获取不同类别的所属公司
for item in cls_normal:
tmp = []
for i in range(len(cls)):
#若分类存在标准分类中,则提取公司名称
if item == cls[i]:
tmp.append(name_list[i])
#存储类别与所属的公司
cls_gs.append([item,tmp])
'''
分类情况
['A否', ['E1', 'E2', 'E6', 'E7', 'E8', 'E9', 'E13', 'E15', 'E16', 'E17', 'E18', 'E19', 'E22', 'E24',
'E26', 'E27', 'E31', 'E42', 'E48', 'E54', 'E59', 'E64', 'E81', 'E84', 'E88', 'E89', 'E91']]
['B是', ['E45']]
['B否', ['E5', 'E10', 'E12', 'E20', 'E21', 'E23', 'E28', 'E30', 'E32', 'E33', 'E34', 'E35', 'E37',
'E38', 'E43', 'E51', 'E57', 'E58', 'E60', 'E61', 'E62', 'E63', 'E65', 'E66', 'E67', 'E70', 'E71'
'E74', 'E76', 'E79', 'E83', 'E85', 'E93', 'E95', 'E97', 'E98', 'E106']]
['C是', ['E29', 'E87']]
['C否', ['E3', 'E4', 'E11', 'E14', 'E25', 'E39', 'E40', 'E41', 'E44', 'E46', 'E47', 'E49', 'E50',
'E53', 'E55', 'E56', 'E68', 'E69', 'E72', 'E73', 'E75', 'E77', 'E78', 'E80', 'E86', 'E90', 'E92',
'E94', 'E96', 'E104', 'E105', 'E110']]
['D是', ['E36', 'E52', 'E82', 'E99', 'E100', 'E101', 'E102', 'E103', 'E107', 'E108', 'E109',
'E111', 'E112', 'E113', 'E114', 'E115', 'E116', 'E117', 'E118', 'E119', 'E120', 'E121',
'E122', 'E123']]
'''
#导入pandas库读取excel
import pandas as pd
#定义函数用于获取行标,返回被查找值的第一个行号
def find_row(num_value,file_name):
#使用read_excel函数读取文件
demo_df = pd.read_excel(file_name)
#遍历索引
for indexs in demo_df.index:
for i in range(len(demo_df.loc[indexs].values)):
#如果行中的值与你所查询值相等则返回该值对应的行号
if (str(demo_df.loc[indexs].values[i]) == num_value):
row = str(indexs+2).rstrip('L')
return row
#提取出进项、销项的数据到单独的excel用于提取行号
filejin_name = '进项发票信息.xlsx'
filechu_name = '销项发票信息.xlsx'
#定义存储进项、销项行号的列表
jin_point = []
chu_point = []
#遍历公司名称,用于获取此公司对应的行号,用于读取价税合计信息
for item in name_list:
print(name_list.index(item))
#将行号追加到列表中
jin_point.append(find_row(item,filejin_name))
chu_point.append(find_row(item,filechu_name))
#获取附件1中sheet2 进项发票信息
sheet2 = wb['进项发票信息']
#获取附件2中sheet3 销项发票信息
sheet3 = wb['销项发票信息']
#定义函数,用于获取有效发票的税额合计
def getMoney(min_row,max_row):
#定义存储税额合计的列表
money = []
#遍历读取某一个公司的税额合计
for row in sheet2.iter_rows(min_row=min_row, max_row=max_row,min_col=7,
max_col=8):
tmp = []
for cell in row:
tmp.append(cell.value)
#如果为有效发票,则存储此项对应的税额合计
if tmp[1] == '有效发票':
money.append(tmp[0])
#返回此公司的均值
return round(sum(money)/len(money),2)
#定义存储进项税额合计的列表
In_name = []
#遍历获取进项税额合计
for i in range(len(jin_point)):
try:
#存储税额合计的均值
In_name.append(getMoney(jin_point[i],jin_point[i+1]))
except:
pass
#定义存储销项税额合计的列表
chu_mean = []
#遍历获取销项税额合计
for i in range(len(chu_point)):
try:
#存储税额合计的均值
chu_mean.append(getMoney(chu_point[i],chu_point[i+1]))
except:
pass
print(In_name,chu_mean)
#计算盈亏情况,盈亏情况为销项平均值 - 进项平均值
profit_loss = chu_mean - In_name
print(profit_loss)