2019年五一杯数学建模
B题 商业银行人民币贷款规模分配及盈利问题
原题再现
商业银行贷款投放的简单模型是:从客户端吸收存款,缴存法定准备金(法定准备金率:大型金融机构15.5%,中小金融机构12%;法定准备金利率1.62%),预留一定比例备付水平(商业银行承担支付结算金融中介作用,满足流动性安全),剩余资金用于贷款投放或其他资产配置。
对商业银行而言,贷款规模增长受限于其存款规模增长,只有在存款有效增长的情况下银行才有充足资金用于贷款投放。具体来说,某家商业银行在全国存款总额中所占比例相对稳定,每年可增长的存款量受限于社会资金总量的增长情况。从经济指标上来看,社会存款增长与GDP、CPI、工业增加值等宏观经济指标密切相关(附件1为2010-2017宏观经济指标及2018年预测情况)。
在贷款分配模式上,商业银行过去多采用年初预分配、全年限额管理模式,即年初一次性预分配全年规模至各家分行,年度内不再调增。该模式存在较多弊端,如未考虑全年实际可支配贷款规模、环境变化、需求变化等,效率低、弹性差。目前,商业银行多采用以存定贷、存贷结合、表内外协同、资产负债动态平衡模式,既要努力获取全行最大收益,也要平衡各区域发展差异,调动各单位展业积极性,同时也要对国家重大项目、重点政策、民生工程等倾斜扶持,支持实体经济有效发展。
现有某中型商业银行A,其各家省级分行近三年存贷款业务发展情况见附件2。请查阅相关文献和资料,在对商业银行经营模式有所掌握,对未来经济、利率、汇率等政策及趋势有充分了解和预判的基础上回答以下问题。
1. 假设该银行除客户存款外无其他资金来源,且暂不考虑备付水平。请根据附件2商业银行A各项存贷款历史数据及附件1宏观经济指标历史数据,建立数学模型,预测该银行2018年存、贷款增量情况。
2. 假设该银行除客户存款外无其他资金来源,且暂不考虑备付水平。请根据问题1预测的结果并结合附件3相关数据,建立数学模型,给出2018年商业银行A 各分行贷款规模的分配方案,使得全行增量存贷款利息净收入最大,并将该分配方案填入表1。
3. 若商业银行A将于2018年5月1日发行500亿规模的15年期商业银行普通债(利率约为5.1%),请结合该条件对问题2进一步优化,暂不考虑备付水平情况下,重新设计商业银行A各分行贷款规模的分配方案,使得全行增量存贷款利息净收入最大,并将该分配方案填入表1。
4. 为保证每日交易正常进行,各家分行每日需预留一定的备付资金(备付资金不足易引起客户不满,严重的会引起社会恐慌,引发挤兑;预留资金过多,会降低银行盈利水平),以确保最低的备付水平(备付水平=备付资金÷存款余额)。假设每个客户存取款的行为是随机的,请根据附件4各分行2017年每日存取款交易数据,建立数学模型,计算在置信水平99%的情况下,2018年商业银行A各分行日常经营所需最低备付金额,并将结果填入表1。
5. 在贷款规模分配问题上,为了帮助商业银行A处理好收益与风险、企业经营与国际政策导向,区域化差异与分行公平考核等之间的关系,以期达到双赢或多赢,请对以上模型进行改进,并给出相关建议。
注:所有数据均为假设数据。
整体求解过程概述(摘要)
本文利用支持向量机(svm)回归模型、主成分分析、分位数回归、层次分析法等方法,使用 python 语言对方法进行实现,建立了银行贷款额度分配模型,并引入了收益与风险、企业经营与国际政策导向,区域化差异与分行公平考核对于模型进行优化,最后针对商业银行 A 给出了合理的贷款额度分配方案。
针对问题一,将季度数据合并为年度数据,对数据特征采用主成分分析进行处理并修复缺失值,利用 svm 模型进行回归预测得到 A 行 2018 年贷款增量。
针对问题二,对利率和存款进行 svm 回归预测得到 2018 年 A 行各地预测值,然后对贷款值进行分位数回归求得贷款规模的上下限,将利率和存款作为固定参数,贷款规模分配作为自变量,贷款规模上下限和问题 1 求得贷款总额作为约束条件,以利息收入为目标,建立数学规划模型,得到使得全行增量存贷款利息净收入最大的贷款规模分配方案。
针对问题三,加入普通债所获资金 500 亿,调整贷款总额度和贷款规模上限后使用 python 语言的 scipy 包中的 linprog 线性规划模块求解最优贷款规模分配方案。
针对问题四,统计各地分行每日的存取款之差发现其规律符合正态分布,求得其均值估计和方差估计。利用 2017 年的各分行存款数额、分布均值和方差,得到 2018 年的各分行存款预测数额、分布均值和方差。利用其对各分行贷款额度分配在 99%置信区间对上下界区间进行预测,下界即每日存款小于取款的差额的最大值,可以将此值看作各分行日常经营所需最低备付金额。
针对问题五,为了实现收益与风险、企业经营与国际政策导向、区域化差异与分行公平考核的多赢。利用层次分析法赋予这三对因素权重,引入风险系数、地区国际化指数、不公平差异,对三对因素在不同贷款规模分配方案上进行量化,最终得到三对因素收益最大的贷款规模分配方案。
模型假设:
1.假设 2018 年经济情况平稳发展。
2.假设城市国际化指数和城市风险系数真实有效。
3.假设每个客户存取款的行为是随机的;
4.假设银行普通债能够全部卖出,并在普通债到期日付清本息。
5.假设按照某地存款量来分配贷款额度是公平的。
问题分析:
问题一的分析
第一问中要求预测2018年存、贷款增量情况。筛选出附件1主要指标建立与金融机构人民币各项存款余额差值之间的数学模型,对于2018年金融机构人民币各项存款增量进行预测。题目中给出某家商业银行在全国存款总额中所占比例相对稳定,每年可增长的存款量受限于社会资金总量的增长情况,可以由此建立回归预测模型得出该银行存、贷款增量情况。
问题二的分析
第二问要求建立数学模型,给出2018年商业银行A使得全行增量存贷款利息净收入最大时的各分行贷款规模的分配方案。可以考虑根据附件1中2015-2018年短期贷款利率以及附件3的各地区存贷款利率水平数据,使用线性回归方法建立宏观指标与地区平均贷款利率的关系式,得到2015-2018年的综合平均贷款利率。再使用线性回归方法分别建立2015-2017年每个地区的贷款利率与其相对应的综合平均贷款利率的关系,进而得到2018年商业银行A各地区分行贷款规模分配方案。
问题三的分析
第三问要求在第二问的基础上追加500亿15年期利率为5.1%的商业银行普通债,重新设计使得全行增量存贷款利息净收入最大时的贷款规模分配方案。考虑到商业银行普通债在期末时才会给客户支付利息,因此只代表商业银行A贷款总规模在第二个问的基础上增加了500亿。所以将总贷款规模加500亿带入第二问的数学模型中,得到使得全行增量存贷款利息净收入最大时新的贷款规模分配方案。
问题四的分析
第四问要求考虑备付水平,根据各分行 2017 年每日存取款交易数据建立数学模型,计算在置信水平 99%的情况下,2018 年商业银行 A 各分行日常经营所需最低备付金额。在这里,备付资金主要用于客户取款,不考虑其他用途。因此我们统计各地分行每日的存取款之差,作频率图可发现大多数具有类似正态分布的形状,考虑到用户存取款的行为存在随机性,所以假设每日存取款的额度服从正态分布。根据作图观察分析,我们发现分行存款总额和分行存取款差额的均值、分行存款总额和分行存取款差额的方差都存在相关性。因此本文假设 2018 年的各分行的存取款数额也符合正态分布,以 2017 年的数据为基础,建立回归预测模型对 2018 年各分行存取款数额分布的参数进行预测。根据预测获得的参数构建分布,最终获得置信水平 99%的情况下,2018 年商业银行 A 各分行日常经营所需最低备付金额。
问题五的分析
第五问要求在贷款规模分配问题上,为了达到双赢或多赢的目标,考虑收益与风险、企业经营与国际政策导向、区域化差异与分行公平考核等之间的关系,对贷款规模分配模型进行优化,并给出相关建议。考虑到实际问题中,贷款规模分配不只是依据利率水平的高低,而是由许多内外部因素综合影响决定的。因此,我们引入量化指标:风险系数向量、各分行所在地区的国际化指数SBII、总体区域化差异以及各地区公平差异向量,分别建立收益与风险、企业经营与国际政策导向、区域化差异与分行公平考核与贷款规模分配比例向量的函数关系,进而得到商业银行A总体效益与贷款规模分配比例向量的关系式。最终即可计算得到使得商业银行A总体效益最大时的贷款规模分配方案。
模型的建立与求解整体论文缩略图
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
程序代码:(代码和文档not free)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
npls=[1,1.25,1.67,1.74,1.74,1.83,1.88,1.84,1.73]
year = [i for i in range(2013, 2022)]
p1 = plt.figure(figsize=(8, 4.944))
p1.add_subplot(111)
bar_width = 0.4 # 设置分组条形的宽度
for x, y in enumerate(npls[0:2], start=2013):
plt.text(x+0.2, y+0.01, y, ha='left', color="r", alpha=0.7)
for x, y in enumerate(npls[2:8], start=2015):
plt.text(x+0.08, y+0.028, y, ha='left', color="r", alpha=0.7)
for x, y in enumerate(npls[8:], start=2021):
plt.text(x, y+0.028, y, ha='left', color="r", alpha=0.7)
plt.plot(year, npls, color='r', marker='o', linestyle='--', alpha=0.7, label='不良贷款率(%)')
plt.ylim(0.9, 2)
plt.ylabel('不良贷款率(%)')
plt.title('2013-2021年我国商业银行不良贷款率变化情况(单位:%)')
plt.xlabel('时间(年)')
plt.legend(loc=2)
plt.show()
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
total_assets = [130.8, 150.94, 175.94, 190.42, 203.41, 232.34, 265.79, 281.29]
growth_rate = [None, 15.4, 16.56, 8.23, 6.82, 14.22, 14.4, 5.83]
growth_rate2 = [15.4, 16.56, 8.23, 6.82, 14.22, 14.4, 5.83]
year = [i for i in range(2014, 2022)]
p1 = plt.figure(figsize=(8, 4.944))
ax1 = p1.add_subplot(111)
bar_width = 0.4 # 设置分组条形的宽度
ax1.bar(year, total_assets, width=bar_width, color='steelblue', alpha=0.7, label='总资产(万亿元)')
for x, y in enumerate(total_assets, start=2014):
plt.text(x, y + 5, y, ha='center')
for x, y in enumerate(growth_rate2, start=2015):
plt.text(x, y * 13.2 + 5, y, ha='left', color="r", alpha=0.7)
ax2 = ax1.twinx()
ax2.plot(year, growth_rate, color='r', marker='o', linestyle='--', alpha=0.7, label='增长率(%)')
# plt.ylim(0, 300)
ax1.set_ylim(0, 330)
ax2.set_ylim(0, 25)
ax1.set_ylabel('总资产(万亿元)')
ax2.set_ylabel('增长率(%)')
plt.title('2014-2021年上半年我国商业银行总资产变化情况(单位:万亿元,%)')
plt.xlabel('时间(年)')
ax1.legend(loc=2)
ax2.legend(loc=1)
plt.show()