2020数学建模C题一等奖经验:中小微企业信贷决策完整复现

发布时间:2026/9/9 22:04:44
2020数学建模C题一等奖经验:中小微企业信贷决策完整复现 简介一份面向2020年全国大学生数学建模竞赛C题的一等奖获奖资源包完整覆盖赛题论文、MATLAB/Python求解代码与Excel数据预处理表格适合准备国赛、希望提升建模实战能力的学生系统研读。压缩包共13个文件以4个m文件、2个py文件、6个xlsx表格及1份pdf论文组成整体仅1.6MB轻量但内容密集。其中associationanalysis.m用于关联规则分析CRITIC.m实现指标权重计算problem1/2/3的m或py脚本对应各问求解流程Excel表格包含行业与规模分类、问题2数据处理等中间结果便于对照数据清洗与建模过程。pdf论文对问题理解、模型构建、求解与结果解释均有详细阐述适合学习系统建模思路和写作规范。已有15228人浏览学习无论用于赛前突击还是长期钻研都能从代码、数据和论文三方面获得完整参考。 2020年高教社杯全国大学生数学建模竞赛C题“中小微企业的信贷决策”我们组拿到了国赛一等奖。这篇博客把当时的获奖论文、完整代码和Excel数据处理表格全部整理成一份可直接参考的压缩包想给正在备赛的同学一份“拿来就能用”的实操方案。无论你目前是零基础第一次参加建模还是已经带队冲过省奖这篇文章都会讲清楚三个问题拿到原始数据后先做什么模型怎么选怎么建论文和附件怎么整理才经得起评委细看。1. 赛题背景与一等奖作品的整体思路1.1 2020年C题到底在解决什么问题那年的C题背景很现实中小微企业规模小、抵押物少银行想给它们放贷却缺少可靠的财务信息只能靠一些基础数据和进销项发票数据来判断“这家企业到底靠不靠谱”。题目要求我们设计一套量化评分体系给出具体的信贷策略包括是否放贷、贷款额度上限和利率定价。这几句话看起来简单但背后是一整条决策链条。银行不是慈善机构它要平衡风险和收益钱放出去收不回来是亏钱不放出去赚不到利息也是亏。所以这道题的核心矛盾是“风险识别”和“收益最大化”之间的权衡。一等奖论文本质上不是比别人多用了什么高深算法而是把这条决策链讲得足够清楚每一步都用数据说话。这道题是典型的数据驱动型赛题评委最看重的是你对数据的处理深度和模型的自洽性。哪怕模型用的是经典方法只要逻辑严丝合缝结果可复现就能拿高分。这一点在后面各个章节里会反复提到。1.2 一等奖作品靠什么从几千支队伍里胜出我们组分析过很多历年一等奖论文发现它们的共性是数据处理绝对扎实模型选择克制且解释性强论文写作像一份严谨的商业分析报告而不是算法堆砌。具体落到2020年C题评委手里的评分表大致关注四个维度数据预处理是否到位、模型是否合理且可复现、结果是否解决了实际问题、论文规范性是否达标。其中数据处理是大部分人最容易丢分的地方。原始发票数据有几万条里面乱得很很多队伍没有认真清洗就直接算均值算出来的指标自然站不住脚。我们组当时给自己定的原则是宁可模型朴素一点也要保证每一步操作都能被评委看懂、还原。最终选择的方案是“熵权法确定指标权重 TOPSIS打分分级 线性规划优化贷款决策”这三个方法单独拎出来都不稀奇但组合在一起恰好覆盖了题目要求的“评级—额度—利率”完整链路。这个思路也是那份一等奖论文的主心骨。2. 数据清洗与Excel处理表格的实战拆解2.1 原始数据长什么样脏数据怎么处理题目给的原始数据主要有两张表一张是企业基本信息表包含企业名称、成立时间、经营状态、注册资本、员工人数等另一张是进销项发票明细字段有企业名称、交易时间、发票号、金额、税额、购方名称、销方名称等。发票数据的时间跨度有几年总量在几万条以上。拿到数据后第一件事不是建模而是疯狂清洗。这里面坑非常多。比如企业名称前后有空格导致同一家企业在不同表里对不上比如发票金额有的含税有的不含税直接加总会出现系统性偏差再比如时间字段格式不统一有的是“2020/1/6”有的是“2020-01-06”Excel分列或者Python解析的时候容易出错。我建议的清洗顺序是先用Excel快速浏览数据确认字段含义和缺失情况然后写Python脚本做批量清洗最后在Excel里保留一份清洗后的标准表。Excel处理表格的价值就在这里它不只是中间产物更是你检查数据质量的可视化工具。2.2 五张中间表从流水到建模特征的必经之路建模之前必须把几万条发票记录压缩成每个企业一行的特征宽表。我们当时在Excel里做了五张中间表这个结构非常建议你直接抄作业。第一张是企业信息表把企业名称做了去空格、统一别名处理后面所有表都通过统一后的企业名称关联。第二张是进项汇总表按企业统计进项总金额、总笔数、活跃月份数、月均进项税额、进项金额的变异系数。第三张是销项汇总表统计口径同进项。第四张是客户和供应商集中度表计算前五大客户占全部销项的比例、前五大供应商占全部进项的比例。第五张是票据异常表统计负数发票和作废发票数量、比例。这五张表合在一起等于把“企业的经营实力、稳定性、上下游依赖度、票据质量”全部量化成了可计算的指标。当时我们写代码时也确保能直接从原始CSV重新跑出这些Excel表格从头到尾不经过手工改数。2.3 Excel函数、透视表与Python的配合用法很多同学有一个误区觉得Excel和Python只能二选一。实际上这两者配合起来效率最高。初步探索和快速核对用Excel批量处理和大规模合并用Python。在Excel阶段SUMIFS和COUNTIFS是绝对的主力。比如统计某个企业所有有效销项发票的总金额用SUMIFS(销项金额列企业名称列目标企业名票据状态列正常)就能一次搞定。同理统计交易月份数需要用到更复杂的数组公式这时我建议直接转Python的groupby().nunique()效率更快也不容易错。Python侧推荐用pandas配合openpyxl清洗完数据后直接to_excel输出标准表。有一点必须提醒你如果给队友或评委使用的Excel是中文表头导出CSV时编码要选utf-8-sig否则用Excel打开会乱码。这个细节我们组在备赛期间踩过后来写进自己的checklist里了。3. 核心建模过程与完整代码实现3.1 评价指标体系与熵权法确定权重确定指标体系时我们把指标分成了三个维度。实力维度包括注册资本、员工数、年均销售收入稳定性维度包括销售收入的变异系数、活跃月份占比信誉维度包括作废发票比例、负向发票比例。最终进入评分模型的是9个指标全部在Excel处理表格中计算完毕。权重选择上我们对比了层次分析法和熵权法最后用了熵权法。原因是层次分析法依赖专家打分主观性比较强而熵权法完全从数据本身出发哪个指标在不同企业之间差异大就说明它的区分能力强应该给更高权重。熵权法的计算细节值得展开说。先把每个指标做极差归一化正向指标用(x-min)/(max-min)负向指标用(max-x)/(max-min)。然后计算每个指标的熵值import numpy as np import pandas as pd def entropy_weight(data): # data: DataFrame每一列是一个指标已完成归一化 data data / data.sum(axis0) k 1 / np.log(len(data)) entropy -k * (data * np.log(data 1e-10)).sum(axis0) weight (1 - entropy) / (1 - entropy).sum() return weight代码里加1e-10是为了防止log(0)出现。这个细节看起来小但真运行起来能救你一命。最后用熵权法算出来的权重里销售收入稳定性和票据质量占比最高这跟实际信贷风控的经验是一致的也反过来证明了这个方法的可靠性。3.2 TOPSIS评分与信贷分级权重算出来后用TOPSIS方法给每家中小微企业计算综合得分。TOPSIS的思路很简单先找到所有企业中的正理想解和负理想解然后计算每个企业与这两个理想解的距离。距离正理想解越近、距离负理想解越远得分越高。这里有一个容易搞错的细节计算距离之前一定要把原始指标做标准化否则量纲大的指标比如“销售收入”会直接把其他指标淹没。我们用的是极差标准化后乘以权重得到加权规范矩阵再计算欧氏距离。def topsis_score(norm_data, weight): # norm_data极差标准化后的数据weight熵权法得到的权重 norm_w norm_data * weight ideal_best norm_w.max(axis0) ideal_worst norm_w.min(axis0) dist_best np.sqrt(((norm_w - ideal_best) ** 2).sum(axis1)) dist_worst np.sqrt(((norm_w - ideal_worst) ** 2).sum(axis1)) score dist_worst / (dist_best dist_worst) return score按得分我们把企业划分为A、B、C三个信用等级得分前30%为A类中间50%为B类后20%为C类。A类企业信用好银行可以正常放贷B类企业信用中等限额放贷并适当提高利率C类企业信用差原则上不放贷。这个分级结果用Excel表格呈现每个企业一行总分和等级一目了然。3.3 贷款额度与利率定价的线性规划实现分级之后要做的是把“能不能贷”升级成“贷多少、利率多少”。这道题最终要提交的是一张放贷策略表里面包含每家企业的贷款金额和年利率。我们用的是线性规划模型目标是银行总收益最大化。先做约束条件。第一贷款总额不能超过银行设定的资金上限第二单家企业贷款额不能超过企业申报的需求上限第三单家企业贷款额不能超过其还款能力。还款能力我们用“年均净利润乘以贷款期限”估算其中净利润率参考了题目数据里行业平均水平保守取了一个参数。利率定价采用基准利率加风险溢价的方式A类企业在基准利率上加0.5个百分点B类加1.5个百分点C类直接不贷。然后用scipy优化求解from scipy.optimize import linprog # c为负的利率因为linprog默认求最小化 c -np.array(rates) / 100 A_ub [np.ones(len(rates))] # 贷款总额约束 b_ub [total_limit] bounds [(0, min(demand[i], repayment_capability[i])) for i in range(len(rates))] res linprog(c, A_ubA_ub, b_ubb_ub, boundsbounds, methodhighs)这里要提醒一点methodhighs是SciPy新版推荐的求解器比默认的老方法更稳定。我们当时因为版本问题踩过坑换成highs之后求解速度明显提升再也没有出现过收敛警告。3.4 模型检验与灵敏度分析评委很看重模型是否稳健所以灵敏度分析必须有。我们做了三类检验。第一类是权重扰动检验。把熵权法结果中权重最大的指标上下浮动20%重新计算评级看评级结果变化比例是否在可接受范围内。第二类是分级阈值检验。把A类占比从25%调整到35%对比银行总收益变化最终发现收益变化不超过5%说明策略不敏感、结果稳定。第三类是参数敏感性检验。对还款能力里的净利润率参数做了±10%的浮动观察贷款方案是否发生剧烈变化。这些检验结果放在论文的“模型评价与检验”章节不需要写很长的推导一张表格列清楚“参数变化范围—结果变化幅度”就够了。这张表格我们是用Excel做的直接引用处理表格中的数据非常方便。4. 论文写作、可视化与附件规划4.1 摘要和正文结构的“高分行文逻辑”国赛论文的摘要单独占一页是评委最先看的内容直接决定了第一印象。我们的摘要一共四段。第一段用两句话交代问题背景和要解决的核心问题。第二段写数据处理方法强调用Excel和Python完成了数据清洗构建了指标体系。第三段是重点写清楚用了什么模型、如何求解、得到什么关键结果比如“对123家企业完成信用评级A类36家B类62家C类25家贷款总额3.5亿元预计银行年收益xxxx万元”。第四段写灵敏度分析结论和模型优点。正文结构上我们严格按照“问题分析—模型假设—符号说明—模型建立与求解—模型检验—评价与推广”来写。其中“问题分析”很多人写得像凑字数其实这里反而是展示你思考深度的机会。我们当时画了完整的决策流程图并写清楚“数据处理是基础评级是核心贷款决策是落地结果”这条主线。4.2 图表怎么放结果怎么呈现评委看正文的时间非常有限图表直接决定阅读效率。我们的原则是能用图表示的关系绝不用大段文字能用表格罗列的数据绝不写进正文段落里。数据分布统计划用直方图和箱线图比如销项金额分布一眼能看出大部分企业集中在低区间少数头部企业贡献了大部分流水。评级结果用饼图和条形图展示。贷款总额和利率的关系做了一个简单的散点图横轴是贷款金额纵轴是利率颜色区分信用等级整张图信息量非常大看起来很专业。图注也要写好不要用“xx数据图”这种敷衍的写法要用“图1 样本企业销售收入分布数据来源附件2发票明细”这种带解释性的图注。表格统一用三线表Excel处理表格的原始数据作为支撑材料论文里只放汇总后的核心表。4.3 代码与Excel附件怎么整理才让人想给高分附件整理这件事很多队伍做得非常随意代码文件叫新建文档1.pyExcel有十几个Sheet没有说明。这样评委根本没法复现印象分直接掉一格。我们当时的附件结构是这样设计的一个根目录文件夹里面是“论文”、“代码”、“数据”、“结果”四个子文件夹外加一个README说明文档。代码文件夹里data_clean.py负责清洗数据entropy_topsis.py负责评分分级loan_optimize.py负责线性规划求解三个脚本按顺序运行就能从原始数据直接得到最终贷款方案。Excel数据文件夹里按照“原始数据—中间表—特征表—结果表”的顺序排列每个文件内部Sheet命名规范加一列“说明”字段。这里我强烈建议你保留所有中间结果不要只在代码里跑到最后一步。一方面可以随时检查是哪一步出了问题另一方面评委如果认真看附件会觉得你的工作流程非常完整。5. 常见问题与三天赛程避坑指南5.1 数据处理阶段最容易踩的五个坑第一个坑是编码问题。CSV文件如果用pandas处理后再保存默认是UTF-8Excel直接打开会乱码导出时记得加encodingutf-8-sig。第二个坑是时间字段的类型转换发票明细里的时间列在Excel里可能显示成“2020/1/6”读进pandas之后要先pd.to_datetime()否则按月份统计时会按字符串排序顺序全乱。第三个坑是名称去空格企业名称前后有空格或者中间有全角空格直接做关联会漏掉大量记录先用strip()和replace(\u3000,)处理。第四个坑是发票金额含税不含税混着算题目附件里有些字段名字容易误导人一定要先确认是价税合计还是不含税金额再汇总。第五个坑是零值和负值发票直接删掉有些退款发票确实是负数代表业务取消合理处理方式是单独统计为票据异常指标而不是简单清洗掉。5.2 建模阶段常见的“过度设计”问题每年都有队伍喜欢把问题搞得特别复杂什么遗传算法、神经网络、多目标优化全部往上堆。2020年C题官方没有给标准答案只要你的模型能自洽解决问题就行。复杂的模型往往参数多、难解释、容易过拟合评委一看你的模型结果对参数特别敏感就会质疑你的结论可靠性。我们组当时的想法很朴素这道题要回答的是“贷不贷、贷多少、信贷利率多少”本质是一个决策优化问题。先用评分模型把企业分成三六九等再用优化模型做资金分配已经足够完整。你不需要用神经网络预测违约概率因为题目根本没有足够的样本标签强行训练出来的模型反而像是在自娱自乐。5.3 时间分配建议三天时间非常紧凑我们组的时间分配可以给你参考。第一天上午读题浏览附件数据量下午做数据清洗和中间表晚上确定指标体系和模型框架。第二天全天集中建模和写代码晚上出完整结果。第三天上午做灵敏度分析和结果可视化下午开始写论文晚上排版打磨摘要和检查附件。这个节奏的关键点在于第一天晚上之前必须定模型否则后面会越来越乱。不要等到第二天还在纠结用层次分析法还是熵权法两个方法都行先把流程跑通再说。比赛比的不是谁的方法更高深而是谁在有限时间内把解决方案落实得更完整。关于那份一等奖论文和代码Excel表格我最想说的其实是“可复现”三个字。很多队伍做出结果之后你问他这个数是怎么算出来的他自己都说不清楚。我们组能拿一等奖很大程度是因为每一步处理都有Excel表格可以追溯每一个结果都能从原始数据重新算出来。最后再分享一个小技巧提交之前把代码从头到尾重新跑一遍。如果从原始CSV到最终结果表只需要按顺序执行几个脚本就能全部生成说明你的附件足够规范这也是评委印象分的重要来源。如果中间任何一步需要手动改Excel这种“手工作坊式”的流程一定要在提交前修复。祝备赛顺利。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询