2020年高教社杯全国大学生数学建模竞赛C题 第一问详细解答+代码

2020年高教社杯全国大学生数学建模竞赛C题 第一问详细解答+代码

本文摘自小编自己的参赛论文与经历,小编获得了2020年高教社杯国奖,有问题的同学们可私聊博主哦。

1. 问题分析

问题一主要围绕信贷风险和信贷策略展开,其中信贷策略又包括是否 放贷 、贷款额度、利率和期限等 。首先,我们应该对企业的信贷风险进行量化评估。 影响信贷风险的因素是多方面的 而依据题意,信贷风险主要依据企业实力和信誉来衡量。对于 多因素影响的问题, 应该对因素进行权重 划分 ,由此我们考虑对企业实力和信誉这两个因素进行加权,最后依据两个因素对信贷风险的贡献度得到该企业的信贷风险,达到量化的目的。关于信贷策略,商业银行的经营目标是利润最大,风险最小,银行应该依据这一准则进行信贷决策。其中是否放贷主要由信贷风险和企业供求关系的稳定性决定,为了能 为 企业制定出合理的、符合信贷准则的信贷策略,我们考虑到 解决优化 问题 中随机性策略 的 算法 模拟退火算法 ,在满足银行利润最大、风险最小的目标下,对贷款额度、年利率以及贷款期限进行求解。

2.数据预处理

在进行问题计算之前,考虑到企业实力主要由公司的利润决定,为了方便利润的计算,我们首先对数据进行了预处理。 首先我们利用 Excel 剔除了附件一和二中开票日期、发票号码、 购房单位代号 、 销方单位代号 以及价税合计 。其次考虑到负数发票是企业已入账记税,之后购方因故发生退货并退款 而开
具的发票, 因为负数发票中的税金是不予以退还的,只能扣。为了便于计算。对于进项发票来说, 负数发票中的税金是有我们缴纳的, 我们对负数发票中的 负数 税额信息予以保留 而对销项发票而言, 负数发票中的税金是消费者缴纳给企业的,为了保证企业不多收税,所以我们依然保留负数发票中的负数税额信息。无论是对购方还是卖方,负数发票都是退款后开具的发票,所以对于负数发票中的金额项实质上没有意义。所以 我们对负数发票中的负数金额做了变换,用0 代替所有负数发票中的负数金额。如图5.1 和图 5.2 为进项销项发票的数据处理例子。

在这里插入图片描述
最后我们对发票状态进行了0 、 1 替换,用 1 代替有效发票,用 0 代替作废发票。数据预处理之后我们得到了含若干行,4 列的矩阵。最后依据第一列的企业代号,得到了每个企业对应的进项发票金额矩阵,销项发票金额矩阵。 进而求出了每个企业的利润,依据他们的发票作废状态对每个企业的供求关系进行了衡量。

3. 信贷风险的量化计算

3.1影响因子

信任值 C
为了简化信贷风险的评价尺度,我们引入信任值这一概念:信任值是银行与信贷企业的信任关系的衡量标准,其值越大,表示信贷风险越低,其值越小,代表信贷风险越高。 信任值由企业实力和信誉组成,其值是企业实力和信誉对信任值的贡献度之和,具体计算公式在后边会给出 。
企业实力C P
企业实力体现在企业规模、企业利润等方面,本文侧重企业利润对企业的实力进行衡量。
企业信誉R P
附件1 中对企业的信誉进行了评级,分别由 A BCD 四种信誉等级,原则上银行对信誉等级为 D 的企业不予以放贷,但是考虑到事件的随机性与特殊性,我们在后续计算中会给评级为 D 的企业一定获得贷款的机会。

3.2模型建立

为了合理的描述每个企业的信贷风险,我们以信任值 C 为评判尺度,给出企业信贷风险量化的函数模型。 为了提高信任值 C 的数据可靠性,我们采用 0 1 的评价系数来评价每一个指标。
在这里插入图片描述
以上式子中, a和b为企业的信誉以及实力的权重系数,CP和RP是企业实力和企业信誉的评价系数。

3.3影响因子的计算

企业实力的计算
通过数据的预处理,我们利用预处理之后得到的表格,分别用销项发票中的金额与税金之和减去进项发票中的金额与税金之和,得到了企业利润。 由于企业利润差距太大,为了使数据不失真,我们采用极差标准化的方法对得到的 123 家企业的利润数据进行了正规化,处理方法如下:
在这里插入图片描述
其中wi代表企业的利润值,wi^'表示企业经过处理后的利润值。此时,经过正规化处理后的数据范围均为(0,1),那么企业实力评价系数的公式如下:
在这里插入图片描述
企业信誉的计算
企业信誉评级是银行内部根据企业的实际情况人工评定的,通过表格我们可以直接得到企业E1-E123的信誉评级,基于企业信誉越高,信贷风险越低的原则,我们规定信誉评级越高,对应的企业信誉系数越高,进而对应的信任值越高,信贷风险越低。
下面我们对信誉等级对应的企业信誉评价系数区间给出规定,规定如表5.3所示。企业信誉评级 信誉评价系数区间
在这里插入图片描述

信誉评价系数不仅与企业信誉等级有关,还与一些其他不可预测因素有关,所以这里我们假设信誉评价系数是在信誉评价系数区间上的一个随机分布,那么这里给出企业信誉评价系数的计算公式:

RP=rand(Q)

其中,Q代表该信誉评价系数区间,rand为在区间Q产生随机数的函数。


3.4信贷风险量化结果


考虑到企业实力更具有代表性,在权重设置时,我们取到企业实力的权重系数为0.6,企业信誉实力的权重系数为0.4,通过建立起来的模型,我们计算得到了123个企业对应的综合信贷风险,部分结果如表5.4所示:
在这里插入图片描述
从表格中我们可以看到,企业的信贷风险与企业的实力和信誉都有很大关系,利润较大的企业信贷风险不一定低,利润较小的企业信贷风险也不一定就很高。

4信贷策略

4.1信贷准则

商业银行的经营宗旨是利润最大化,风险最小化,遵循“效益性、安全性、流动性”的的原则。[1]信贷过程中,银行必须依据这一原则进行信贷,信贷策略是在综合考虑风险与收益的情况下,在众多贷款方式中选择最优的那一种。

4.2信贷策略的确定

4.2.1是否放贷

银行通常向信贷风险低、供求关系稳定、实力强的企业提供贷款,由于信贷风险系数一定程度上体现了企业的实力强弱,所以在是否放贷问题上,我们以信贷风险和供求关系作为评判尺度。为了描述放贷的可能性,我们定义p为放贷可能性,p0为允许放贷的最低阈值,其中p由信贷风险和供求关系决定,其中放贷与否我们用0/1来表示,1表示放贷,0表示不放贷。

在这里插入图片描述
其中C是前边计算得到的信任值,C的值越大,风险越低,放贷可能性就越高,G为供求稳定系数,a,b分别为信贷风险和供求稳定性在放贷可能性计算中的权重,其中G和C的范围均为(0,1)。
供求稳定系数由订单中有效订单的个数决定,我们主要考虑购买和销售时的稳定情况,记销项发票中企业i的订单数一共为N1,其中有效发票数为M1,记进项发票中企业i的订单数一共为N2,其中有效发票为M2则供求稳定系数G的计算公式为:
在这里插入图片描述
结果展示
结合实际的放贷可能性计算结果,我们取p0的值为所有放贷可能性p的平均值,最后按照已构建的模型判断了123个企业的放贷与否情况,其中共有65企业获得了银行的贷款资格,部分允许放贷的企业代码和放贷可能性大小计算结果如下表:

在这里插入图片描述
在这里插入图片描述

4.2.2贷款额度、利率与贷款期限

为了满足银行利益最大化,风险最小化的目标,在已有的3个指标下,我们考虑到银行利益与客户丢失率的有着一定的关系,所以把客户丢失率也考虑在优化问题的约束条件之中。在给定约束条件的情况下,满足银行的利益最大化,这里每个企业的风险在前边的计算中已经确定,所以问题就简化为风险一定的情况下满足利益最大。
模型基础变量
1)贷款额度
本题所给出的贷款额度区间为10~100万元。
2)贷款年利率与期限
本题所给出的贷款年利率区间为4%~15%,贷款期限为1年
3)贷款利率与客户流失率
通过分析,贷款利率与客户流失率有着明确的线性关系,我们分别利用已知数据进行了二次拟合,得到了如图5.6所示的关系。

在这里插入图片描述
当给定银行贷款年利率后,客户流失率的计算公式如下:

在这里插入图片描述

其中x^'是变动后的银行贷款利率,a_i, b_i, c_i分别是企业i在对应的信誉等级下如图5.5拟合得到的二次拟合系数。
4)信贷风险决策变量
信贷风险系数与贷款利率、额度等有着密切的联系,为了满足银行对信誉高,信贷风险小的企业提供利率优惠的需求,我们引入信贷风险决策变量作为辅助变量来帮助构建模型。
优惠体现为利率的上浮与下落,为了让利率的变动与信贷风险有关,我们借助函数e^x当自变量在0左右微小波动时,其函数值在1附近微小波动的特点,设企业风险值为r=1-C,给出利率变动公式。
在这里插入图片描述
其中x’为变动后的利率,x为原始利率,C为信任值,ave®为123个企业的平均风险值,经计算平均风险值为0.49,e(r-ave®)为信贷风险决策变量。当企业风险值低于平均风险值时,信贷风险决策变量小于1,表示银行对给予一定的利率优惠。

计算步骤
○1模型构建
银行的利润不仅与贷款利率和贷款额度有关,还与客户流失率有关,利润Z与流失率是负相关的关系,因为f在区间[0,1]上,这里我们用1-f表示剩余客户比例,基于此我们给出目标函数的公式。
在这里插入图片描述
其中Zi 代表银行从企业i获得的利润,n表示银行决定放贷的企业个数,yi代表企业获得的贷款额度,V代表银行贷款总额度,因为银行贷款总额度是固定但未知的,所以在具体求解是,可以不用考虑额度上限问题。
○2算法设计
因为本题对目标函数没有明确的限制条件,无法用确定性的方法求出全局的最优解,无法用非线性规划问题中算法函数进行求解,所以我们考虑用用模拟退火算法进行迭代,根据模拟退火算法的智能性快速找到银行利率最大值。因为我们的目标函数不是单一的被利率和额度两个因素影响,它还受信贷风险和客户丢失率的影响,所以得到的每组利率和额度是对每个企业而言的,达到了题目要求的对每个企业的信贷策略。
模拟退火算法是对计算步骤的迭代重复,其大概步骤如图
在这里插入图片描述
产生新解
目标函数的值由利率和额度两个自变量以及客户丢失率这个因变量和信任值这个常量决定,因为顾客丢失率可以由“利率-丢失率”拟合曲线预测得到,所以在产生新解这一过程中,我们需要的是具有放贷资格的企业对应的利率与额度。在利率与额度上下限都确定的情况下,我们采用随机函数就可以产生新解。
新解接受机制
模拟退火算法属于启发式算法,在迭代求最优解的过程中,对于差解不是完全舍弃,而是采用概率接受的原则,这也很大程度上解决了得到局部最优解的问题。在本题中,我们对新解采取Metropolis准则,在介绍对于新解的接受模型之前,我们先对模拟退火的初始参数进行设定。
变量个数:2
初始温度:T0
衰变系数:α
最大迭代次数:maxgen
每个温度下的迭代次数:Lk
变量上下界:x_lb、x_ub
模拟退后算法的核心在于温度会随着外层循环迭代次数的增加而下降,即T_(t+1=) α*T_t,其中t表示时间,随着时间的增加,温度会慢慢下降。
设新解为f(b),初始解f(a),设新解的接受概率为pt,由Metropolis准则,我们可以得到pt的计算公式如下:
在这里插入图片描述
这里我们以寻找最大值为例,给出新解的接受机制如下:
在这里插入图片描述
其中p是通过随机模拟得到的范围在[0,1]的随机数,它表示一种概率,p与pt作比较代表着模拟退火算法过程中,会有一定的概率接受较差的解。

内层循环与外层循环的设置
为了使模拟退火的过程具有更广泛的搜索性,我们设置两层循环进行迭代,其中外层循环是迭代终止条件的设置,内层循环是指在每一个温度下的迭代次数,双层循环使最后的结果更准确。
○3算法流程
步骤1:选定初始温度T0,依据两个变量的上下界产生初始解X_(n×2),此时最优解为f(a),外层迭代次数m=0,内层L=0;
步骤2:在可行解空间重新随机产生一个解,计算得到新解f(b);
步骤3:依据Metropolis准则判断是否接受新解,L以1的增长速率递增;
步骤4:重复步骤2和步骤3,直至L=Lk,此时得到一个最优解;
步骤5:判断是否达到最大迭代次数,若m<maxgen,则对m加1,继续返回步骤一;若m≥maxgen,算法终止。

○4结果分析

多次迭代之后,我们得到银行利润在156万左右,在满足利润最大时,部分企业对应的利率和额度如如表5.9,模拟退火的迭代图如图5.8所示。
在这里插入图片描述
从模拟退火算法迭代图来看,在寻找最优解的过程中,前期搜索范围较大,所得到的利润不是很大,随着迭代次数的增加利润的最优值逐渐稳定,最后在156万附近微小波动。

5.Matlab部分代码参考

数据预处理处理代码
%chulisj.m
%第一步:数据预处理
y_jin_jine=xlsread('附件1:123家有信贷记录企业的相关数据.xlsx',2,'E2:E210948');
y_jin_shuie=xlsread('附件1:123家有信贷记录企业的相关数据.xlsx',2,'F2:F210948');
y_xiao_jine=xlsread('附件1:123家有信贷记录企业的相关数据.xlsx',3,'E2:E162485');
y_xiao_shuie=xlsread('附件1:123家有信贷记录企业的相关数据.xlsx',3,'F2:F162485');
 %读取发票状态
jin_zf=xlsread('附件1:123家有信贷记录企业的相关数据.xlsx',2,'H2:H210948'); 
xiao_zf=xlsread('附件1:123家有信贷记录企业的相关数据.xlsx',3,'H2:H210948');

y_jin_qy=xlsread('附件1:123家有信贷记录企业的相关数据.xlsx',2,'A2:A210948');
y_xiao_qy=xlsread('附件1:123家有信贷记录企业的相关数据.xlsx',3,'A2:A162485');

n_jin_jine=xlsread('附件2:302家无信贷记录企业的相关数据.xlsx',3,'E2:E395176');
n_jin_shuie=xlsread('附件2:302家无信贷记录企业的相关数据.xlsx',3,'F2:F395176');
n_xiao_jine=xlsread('附件2:302家无信贷记录企业的相关数据.xlsx',2,'E2:E330836');
n_xiao_shuie=xlsread('附件2:302家无信贷记录企业的相关数据.xlsx',2,'F2:F330836');
n_jin_zf=xlsread('附件2:302家无信贷记录企业的相关数据.xlsx',3,'H2:H395176');
n_xiao_zf=xlsread('附件2:302家无信贷记录企业的相关数据.xlsx',2,'H2:H330836');

n_jin_qy=xlsread('附件2:302家无信贷记录企业的相关数据.xlsx',3,'A2:A395176');
n_xiao_qy=xlsread('附件2:302家无信贷记录企业的相关数据.xlsx',2,'A2:A330836');

%有信贷——数据处理
if jin_zf==0   %发票状态为作废时,进项金额、税额都作废
    y_jin_jine1=0;
    y_jin_shuie1=0;
else
    y_jin_jine1=y_jin_jine;     
    y_jin_shuie1=y_jin_shuie;
    if y_jin_jine<0     %负数发票时,进项金额为0,税额不变,供以后抵扣
    y_jin_jine1=0;
    end
end

if xiao_zf==0
    y_xiao_jine1=0;
    y_xiao_shuie1=0;
else
    y_xiao_jine1=y_xiao_jine;
    y_xiao_shuie1=y_xiao_shuie;    
    if y_xiao_jine<0          %负数发票时,销项金额为0,税额不变,供以后抵扣
    y_xiao_jine1=0;
    
    end
end
       
xlswrite('处理:123家有信贷记录企业的相关数据1.xlsx',y_jin_jine1,1, 'B2:B210948');
xlswrite('处理:123家有信贷记录企业的相关数据1.xlsx',y_jin_shuie1,1, 'C2:C210948');
xlswrite('处理:123家有信贷记录企业的相关数据1.xlsx',y_xiao_jine1,2, 'B2:B162485');
xlswrite('处理:123家有信贷记录企业的相关数据1.xlsx',y_xiao_shuie1,2, 'C2:C162485');

%无信贷数据处理
if n_jin_zf==0
    n_jin_jine1=0;
    n_jin_shuie1=0;
else
    n_jin_jine1=n_jin_jine;
    n_jin_shuie1=n_jin_shuie;
    if n_jin_jine<0 
    n_jin_jine1=0;
    end
end

if n_xiao_zf==0
    n_xiao_jine1=0;
    n_xiao_shuie1=0;
else
    n_xiao_jine1=n_xiao_jine;
    n_xiao_shuie1=n_xiao_shuie;
    if n_xiao_jine<0 
    n_xiao_jine1=0;
    end
end

xlswrite('处理:302家无信贷记录企业的相关数据.xlsx',n_jin_jine1,1, 'B2:B395176');
xlswrite('处理:302家无信贷记录企业的相关数据.xlsx',n_jin_shuie1,1, 'C2:C395176');
xlswrite('处理:302家无信贷记录企业的相关数据.xlsx',n_xiao_jine1,2, 'B2:B330836');
xlswrite('处理:302家无信贷记录企业的相关数据.xlsx',n_xiao_shuie1,2, 'C2:C330836');

%求各企业总收益
%有信贷企业
y_zong=zeros(123,1);
y_jin_zong=zeros(123,1);
y_xiao_zong=zeros(123,1);

for i=1:123
    for j=1:210947
        if y_jin_qy(j)==i
        y_jin_zong(i)=sum(y_jin_jine1(j)+y_jin_shuie1(j));
        end
    end
end
for i=1:123
    for k=1:162484
        if y_xiao_qy(k)==i
            y_xiao_zong(i)=sum(y_xiao_jine1(k)+y_xiao_shuie1(k));
        end
    end
end
for i=1:123
    y_zong(i)=y_xiao_zong(i)-y_jin_zong(i);    %总收益=销项总-进项总
end
xlswrite('处理:123家有信贷记录企业的相关数据1.xlsx',y_zong,3, 'B2:B124');


%无信贷企业
n_zong=zeros(302,1);
n_jin_zong=zeros(302,1);
n_xiao_zong=zeros(302,1);
for i=124:425
    for j=1:395175
        if n_jin_qy(j)==i
        n_jin_zong(i-123)=sum(n_jin_jine1(j)+n_jin_shuie1(j));
        end
    end
end
for i=124:425
    for k=1:330835
        if n_xiao_qy(k)==i
            n_xiao_zong(i-123)=sum(n_xiao_jine1(k)+n_xiao_shuie1(k));
        end
    end
end
for i=1:302
    n_zong(i)=n_xiao_zong(i)-n_jin_zong(i);
end
xlswrite('处理:302家无信贷记录企业的相关数据.xlsx',n_zong,3, 'B2:B303');


%risksy.m
%收益归一化处理,求收益信任值
y_shouyi=xlsread('处理:123家有信贷记录企业的相关数据1.xlsx',3,'B2:B124');
n_shouyi=xlsread('处理:302家无信贷记录企业的相关数据.xlsx',3,'B2:B303');
y_max=max(y_shouyi);
y_min=min(y_shouyi);

n_max=max(n_shouyi);
n_min=min(n_shouyi);

y_rs=zeros(123,1);
n_rs=zeros(302,1);
for i=1:123
    y_rs(i)=(y_shouyi(i)-y_min)/(y_max-y_min);
end
xlswrite('处理:123家有信贷记录企业的相关数据1.xlsx',y_rs,3, 'C2:C124');


for k=1:302
    n_rs(k)=(n_shouyi(k)-n_min)/(n_max-n_min);
end
xlswrite('处理:302家无信贷记录企业的相关数据.xlsx',n_rs,3, 'C2:C303');
xlswrite('处理:302家无信贷记录企业的相关数据.xlsx',1-n_rs,3, 'D2:D303');

%riskxy.m
%信誉等级数据预测,求信誉信任值
[num,str]=xlsread('附件1:123家有信贷记录企业的相关数据.xlsx',1,'C2:C124');
y_xy=zeros(123,1);
%信誉等级ABCD对应的信誉数据分别为[0.75,1],[0.5,0.75],[0.25,0.5],[0,0.25]区间的随机数
for i=1:123
    if strcmp(str(i),'A')
        y_xy(i)=0.75+0.25*rand(1);
    end
    if strcmp(str(i),'B')
        y_xy(i)=0.5+0.25*rand(1);
    end
    if strcmp(str(i),'C')
        y_xy(i)=0.25+0.25*rand(1);
    end
    if strcmp(str(i),'D')
        y_xy(i)=0+0.25*rand(1);
    end
end
xlswrite('处理:123家有信贷记录企业的相关数据1.xlsx',y_xy,3, 'D2:D124');


%riskall.m
%加权求总信任值及风险
y_risksy=xlsread('处理:123家有信贷记录企业的相关数据1.xlsx',3,'C2:C124');
y_riskxy=xlsread('处理:123家有信贷记录企业的相关数据1.xlsx',3,'D2:D124');

y_risk=zeros(123,1);

for i=1:123
    y_risk(i)=0.6*y_risksy(i)+0.4*y_riskxy(i);%收益信任值和信誉信任值的权重为64
end
xlswrite('处理:123家有信贷记录企业的相关数据1.xlsx',y_risk,3, 'E2:E124');
xlswrite('处理:123家有信贷记录企业的相关数据1.xlsx',1-y_risk,3, 'F2:F124');


%ls_nihe.m
%利率与流失率的拟合函数
x = xlsread('附件3:银行贷款年利率与客户流失率关系的统计数据.xlsx', 'sheet1', 'A3:A31');
y1=xlsread('附件3:银行贷款年利率与客户流失率关系的统计数据.xlsx', 'sheet1', 'B3:B31'); 
y2=xlsread('附件3:银行贷款年利率与客户流失率关系的统计数据.xlsx', 'sheet1', 'C3:C31'); 
y3=xlsread('附件3:银行贷款年利率与客户流失率关系的统计数据.xlsx', 'sheet1', 'D3:D31');
p1=polyfit(x,y1,2);
p2=polyfit(x,y2,2);
p3=polyfit(x,y3,2);

figure(1);
draw(p1,x,y1);

篇幅原因,如想要后续代码,请点赞博文,关注博主并私信。

猜你喜欢

转载自blog.csdn.net/qq_35712832/article/details/117599328