
1. 项目概述一次经典赛题的深度复盘又到了一年一度的数学建模竞赛季后台和社群里不少同学开始翻看往年的赛题希望能从中找到一些备赛的灵感和方向。其中2020年高教社杯全国大学生数学建模竞赛的C题——“中小微企业的信贷决策”绝对是一个绕不开的经典案例。这道题之所以被反复提及不仅因为其紧贴当年“普惠金融”、“扶持实体经济”的社会热点更因为它完美地融合了数据分析、综合评价、风险预测和决策优化等多个建模核心环节是一道检验参赛者综合能力的“试金石”。我自己当年作为指导老师带着队伍完整地啃下了这道题后来也反复研究过各种优秀的获奖论文。今天我就以一个“过来人”的视角抛开那些官方、笼统的摘要和大家从头到尾、掰开揉碎地聊聊这道题的核心解题逻辑、那些容易踩进去的“坑”、以及如何构建一个既有创新性又稳健可靠的模型。无论你是正在备赛希望从真题中汲取经验还是单纯对如何用数学工具解决实际金融问题感兴趣相信这篇深度复盘都能给你带来实实在在的启发。这道题给我们的是一批中小微企业的信贷相关数据要求我们根据这些数据建立模型对企业的信贷风险进行量化评估并最终给出具体的信贷策略贷不贷、贷多少、利率多少。听起来很像银行风控部门的工作对不对没错它的本质就是一个基于有限信息的信用评分与决策优化问题。接下来我们就沿着“读懂数据-建立评价体系-预测风险-制定策略”这条主线一步步拆解。2. 核心需求解析与解题总览拿到题目第一步绝不是急着打开MATLAB或Python而是要把题目的每一个字都吃透。我们先把题目的核心要求翻译成“人话”对企业进行量化评价题目附件给出了123家有信贷记录的企业和302家无信贷记录企业的相关数据。我们需要设计一个模型或方法能够对所有这些企业的“实力”或“信用”进行打分或排序。这是所有后续决策的基础。预测信贷风险对于那123家有历史记录的企业题目给出了它们是否“违约”的标签。我们的模型必须能利用这个“训练集”学习到哪些因素会导致违约从而能够预测那302家“未知”企业的违约可能性。制定信贷决策银行的钱不是白给的目标是“在年度信贷总额固定1亿元的前提下最大化总收益同时控制风险”。这直接转化成了一个带有约束条件的优化问题给谁贷款、给多少额度、设定多高的利率这一系列决策的组合要使得总利润最高。所以整个解题的骨架非常清晰综合评价 信用预测 决策优化。三者环环相扣评价结果是预测模型的输入特征之一而预测出的风险概率又是决策优化模型的核心参数。注意很多队伍一开始就陷入一个误区试图用一个“超级模型”解决所有问题。实际上将问题模块化处理是更清晰、更稳健的策略。先分别攻克评价、预测、优化三个子问题再将其有机串联。3. 数据预处理从原始表格到模型“食材”附件中的数据是典型的“脏数据”直接喂给模型效果肯定很差。预处理阶段花的时间往往能决定你模型效果的上限。我们来看看有哪些关键操作3.1 数据清洗与异常值处理原始数据包括企业的进项发票、销项发票、相关评级信息等。发票数据中存在大量噪声比如作废发票必须首先剔除它们不代表真实的交易行为。价税分离发票金额是含税价我们需要根据税率题目一般会给出或需自己合理假设如13%分离出“税额”和“不含税金额”。不含税金额才是反映企业真实经营规模的指标。异常时间戳检查发票日期是否有明显错误如未来日期、极早日期。缺失值与零值对于企业的一些评级指标可能存在缺失。对于数值型特征零值需要区分是“真实为零”还是“缺失”。一个常见的技巧是用同类型企业的中位数或均值进行填充而非简单删除。3.2 特征工程挖掘数据背后的故事这是体现建模者功力的地方。我们需要从原始数据中构造出能够反映企业“健康状况”的特征。可以按维度来构建1. 经营稳定性与规模特征月度/季度交易额均值与波动率计算企业进项和销项不含税金额的月均值以及其标准差或变异系数标准差/均值。均值反映规模波动率反映经营稳定性。一个收入高且稳定的企业显然比收入低且大起大落的企业更可靠。交易频率平均每月开票次数。高频交易可能意味着业务活跃。毛利率的估算这是一个非常关键但题目未直接给出的指标。我们可以用(销项不含税金额 - 进项不含税金额) / 销项不含税金额来近似估算毛利率。毛利率高且稳定的企业盈利能力强。资金周转情况可以粗略计算“应收账款周转天数”基于销项发票日期模拟或“进销项时间差”。资金回收快的企业流动性好。2. 上下游关系与网络特征上下游集中度计算该企业最大的几个交易对手的金额占比赫芬达尔指数。如果企业严重依赖单一客户或供应商其风险较高。上下游企业质量如果数据允许可以追溯交易对手的实力例如对手方是否是知名大企业。与优质企业交易本身是一种信用背书。3. 静态资质特征题目给出的“信誉评级”、“是否违约”等。对于无信贷记录的企业这些是缺失的需要我们的模型来预测。4. 衍生趋势特征计算交易额、毛利率等关键指标的月度环比、同比增长率。处于上升通道的企业更具潜力。实操心得特征不是越多越好。一定要结合业务逻辑即信贷风控的常识进行筛选。可以先计算一个初步的特征池比如30-40个然后通过相关性分析、基于模型的特征重要性排序如使用随机森林或XGBoost最终保留10-15个最具代表性且相关性不高的特征。避免“维度灾难”。4. 核心模型一企业综合实力评价模型对于302家无信贷记录的企业我们没有任何历史标签第一步就是给它们“画像”打分。这里通常采用多指标综合评价方法。4.1 常用方法对比与选型TOPSIS法优劣解距离法这是当年很多获奖论文的选择。它的思想直观先定义“正理想解”所有指标都最优和“负理想解”所有指标都最差然后计算每个企业到这两个解的距离距离正理想解越近、负理想解越远则评价越高。TOPSIS的优点是原理简单计算方便对数据分布无严格要求。熵权法 TOPSIS/灰色关联单独使用TOPSIS时指标权重的确定比较主观。熵权法是一种客观赋权法它根据各指标数据本身的离散程度熵来确定权重数据差异越大的指标权重越高。“熵权法确定权重再结合TOPSIS进行排序”是一个经典且说服力强的组合。主成分分析PCA当特征间存在较强相关性时PCA可以提取出几个互不相关的主成分用这些主成分的加权得分来评价。但PCA的结果解释性稍弱不如TOPSIS直观。层次分析法AHP如果我们要突出某些业务重点比如认为“稳定性”比“规模”更重要可以结合AHP来设定主观权重。但AHP非常依赖判断矩阵的构建容易引入主观偏差在数模竞赛中如果使用必须详细说明你的判断依据例如引用一些金融风控文献中的观点。我的建议对于这道题熵权-TOPSIS组合是稳健且出彩的首选。它既利用了数据的客观信息熵权又有清晰易懂的评价逻辑TOPSIS。4.2 熵权-TOPSIS建模实操步骤步骤1构建原始评价矩阵假设我们为每家企业选取了m个评价指标共有n家企业。构成一个 n行 × m列 的矩阵X。步骤2数据标准化归一化由于指标量纲不同如金额是万比率是小数必须标准化。对于效益型指标越大越好如收入和成本型指标越小越好如波动率需采用不同的公式。常用极差标准化法效益型x (x - min) / (max - min)成本型x (max - x) / (max - min)标准化后得到矩阵Z。步骤3计算熵权计算第j项指标下第i个企业的特征比重p_ij z_ij / sum(z_ij)注意这里需要对z_ij进行平移处理避免出现ln(0)。计算第j项指标的熵值e_j -k * sum(p_ij * ln(p_ij))其中k 1/ln(n)。计算差异系数g_j 1 - e_j。熵值越小差异系数越大指标越重要。计算权重w_j g_j / sum(g_j)。 至此我们得到了一组客观权重w [w1, w2, ..., wm]。步骤4计算加权标准化矩阵将标准化矩阵Z的每一列乘以对应的权重w_j得到加权标准化矩阵V。步骤5确定正负理想解正理想解 V每个指标在V矩阵中的最大值。负理想解 V-每个指标在V矩阵中的最小值。步骤6计算距离与相对贴近度计算每个企业到V和V-的欧氏距离 D_i 和 D_i-。计算相对贴近度C_i D_i- / (D_i D_i-)。C_i的取值范围是[0, 1]值越大表示该企业越接近最优水平。这个C_i就是我们需要的企业综合实力评分。避坑指南在计算熵权时务必检查标准化后的数据是否有零值或负值这会导致对数计算出错。通常的做法是对整个标准化矩阵加上一个很小的正数如0.0001进行平移。此外TOPSIS的结果对指标的正向化即统一为效益型非常敏感务必在标准化前就区分好指标类型。5. 核心模型二企业信贷风险预测模型对于123家有标签的企业我们有了“综合实力评分”这个新特征再加上其他构造的特征目标变量是“是否违约”二分类问题。这就是一个典型的分类预测任务。5.1 模型选型与对比逻辑回归LR线性模型解释性强可以清晰看到每个特征对违约概率的贡献系数。但前提是特征与目标变量间存在线性关系对于复杂非线性关系拟合能力不足。决策树/随机森林RF非线性模型能自动捕捉特征间的交互作用对异常值不敏感且能输出特征重要性。随机森林通过集成多棵树有效防止过拟合是这类问题的“万金油”选择。梯度提升树如XGBoost, LightGBM性能通常优于随机森林预测精度高同样能输出特征重要性。但参数更多调优稍复杂且训练时间可能更长。支持向量机SVM在小样本、高维度数据上有时有奇效但可解释性差且对参数和核函数选择敏感。我的建议在竞赛有限的时间内追求稳健与性能的平衡随机森林是首选。它不容易过拟合结果稳定且提供的特征重要性可以为之前的特征工程提供反馈。如果想冲击更高奖项可以尝试XGBoost并与随机森林的结果进行对比。5.2 基于随机森林的建模流程步骤1数据集划分将123家企业数据按7:3或8:2划分为训练集和测试集。务必使用分层抽样确保训练集和测试集中违约与非违约企业的比例与原数据集大致相同防止因样本不均衡导致评估失真。步骤2模型训练与调参使用训练集训练随机森林。关键参数需要调优n_estimators森林中树的数量。越多越好但计算成本增加。通常从100开始逐步增加观察性能变化。max_depth树的最大深度。控制模型的复杂度防止过拟合。可以通过网格搜索或随机搜索寻找最佳组合。min_samples_split内部节点再划分所需最小样本数。值越大树越简单。class_weight由于违约企业通常远少于非违约企业样本不均衡将class_weight设置为‘balanced’可以让模型更关注少数类提升对违约企业的识别能力。步骤3模型评估在测试集上评估模型性能。对于信贷风控我们不仅看整体的准确率Accuracy更要关注精确率Precision预测为违约的企业中真正违约的比例。这关系到银行误伤好企业的成本。召回率Recall所有真实违约的企业中被模型预测出来的比例。这关系到银行漏掉坏账的风险。F1-Score精确率和召回率的调和平均数是一个综合指标。ROC曲线与AUC值AUC值越接近1模型区分能力越好。这是评估二分类模型非常核心的指标。通常我们需要在精确率和召回率之间做权衡Precision-Recall Trade-off。通过调整模型预测时的概率阈值默认0.5可以绘制P-R曲线根据银行的风险偏好是更怕“贷错”还是更怕“错过”选择一个合适的阈值。步骤4预测与特征重要性分析用训练好的最优模型对302家无标签企业的违约概率进行预测得到P(违约)。 同时输出模型的特征重要性排序这可以反向验证我们特征工程的有效性。如果“综合实力评分”排在重要性前列说明我们第一阶段的评价模型是成功的。实操心得千万不要把所有数据都扔进去训练然后直接预测。必须保留一个独立的测试集来客观评估模型否则你无法知道你的模型在未知数据上表现如何这是建模的大忌。交叉验证如5折交叉验证是更稳健的调参和评估方法。6. 核心模型三信贷额度与利率的决策优化模型这是最后一步也是最考验建模者运筹学功底和商业思维的一步。我们有了每家企业的两项关键输入综合实力评分S_i和预测违约概率P_i。银行有1亿元总资金。目标是制定贷款策略最大化总期望收益。6.1 问题建模定义一个优化问题我们可以将问题定义为一个非线性规划或整数规划问题。决策变量x_i是否给第i家企业贷款0-1变量。l_i给第i家企业的贷款额度连续变量或离散变量。r_i给第i家企业的贷款利率通常在基准利率上浮动。目标函数最大化总期望收益银行从一笔贷款中获得的收益取决于贷款额、利率和对方违约的风险。一笔贷款的期望收益可以近似为期望收益 l_i * r_i * (1 - P_i) - l_i * P_i解释如果企业不违约概率为1-P_i银行获得利息l_i * r_i如果企业违约概率为P_i银行损失本金l_i。简化后的期望收益为l_i * [r_i*(1-P_i) - P_i]。 总期望收益就是所有贷款企业的该值之和Maximize Σ [x_i * l_i * (r_i*(1-P_i) - P_i)]约束条件总额度约束Σ (x_i * l_i) 1亿。额度上下限约束每家企业贷款额度有上下限例如L_min l_i L_max。这个上下限可以根据企业实力评分S_i来设定实力强的企业额度上限可以更高。利率浮动约束利率与风险挂钩风险越高P_i越大利率r_i应该越高以覆盖风险。可以建立函数关系如r_i r_base k * P_i其中r_base是基准利率k是风险溢价系数。同时利率也有上下限。风险控制约束银行通常有整体风险容忍度。例如要求总预期损失不超过某个值Σ (x_i * l_i * P_i) Loss_max。或者要求贷款给“高风险”P_i超过某个阈值企业的总金额不能超过一定比例。6.2 模型求解思路这是一个包含0-1变量和连续变量的混合规划问题规模较大425家企业。直接求精确解可能比较困难。常用的求解思路有简化与分步求解这是一个非常实用的竞赛策略。第一步确定贷款企业白名单。设定一个准入标准例如P_i 阈值T1且S_i 阈值T2。先过滤掉风险过高或实力太差的企业大幅减少决策变量。第二步利率定价。根据风险定价原理直接由违约概率P_i通过一个函数确定利率r_i例如r_i a b * P_i。这样就把决策变量r_i转化成了P_i的函数。第三步额度分配。此时问题简化为在总额度约束下如何给白名单中的企业分配额度l_i以最大化总期望收益。目标函数变为Max Σ [l_i * (r_i*(1-P_i) - P_i)]其中r_i已由第二步确定。这接近于一个线性规划或背包问题求解难度大大降低。可以使用启发式算法如贪心算法按单位额度期望收益从高到低分配或调用优化求解器如Lingo、MATLAB的linprog、Python的PuLP/SciPy求解。智能优化算法如果追求模型的整体性和创新性可以直接用智能算法求解原混合规划模型。例如遗传算法GA。编码将每家企业的(x_i, l_i)或(x_i, l_i, r_i)编码成一条染色体。适应度函数即总期望收益函数。约束处理将总额度约束等作为惩罚项加入适应度函数罚函数法或设计特殊的交叉、变异算子保证解可行。这种方法编程实现复杂耗时长但若能有效求解并得到不错的结果论文会很有亮点。对于绝大多数参赛队我强烈推荐“简化分步求解法”。它在有限时间内更可控逻辑清晰易于在论文中陈述并且结果通常也不差。贪心算法分配额度的思路本身就符合“将资金优先投放给风险调整后收益最高的项目”这一基本金融原理。6.3 输出策略表格最终你的模型应该输出一张清晰的决策表至少包含企业编号是否放贷建议贷款额度万元建议贷款利率综合评分预测违约概率E1是1008.5%0.850.02E2否0-0.450.25..................汇总放贷企业数XX家总贷款额1亿元平均利率X%预期总收益Y万元预期损失Z万元7. 模型检验、灵敏度分析与论文写作点睛7.1 模型检验与稳定性分析一个好的模型不能只给出结果还要证明它是可靠的。预测模型检验除了在测试集上的指标还可以用ROC曲线下的AUC值来说明模型的区分能力。如果AUC大于0.8通常认为模型有较好的预测能力。优化模型灵敏度分析这是加分项分析关键参数变化对结果的影响。如果总信贷额度从1亿变为1.1亿总收益增加多少边际收益如何变化如果风险容忍度收紧预期损失上限降低总收益和贷款企业数量如何变化调整利率定价公式中的参数k观察对最终收益和风险的影响。通过这种分析你可以为银行提供更具深度的决策参考例如“在目前条件下适当提高风险容忍度可以显著提升收益”等。7.2 论文写作的核心要点数模竞赛七分做三分写。论文是展示你们工作的唯一窗口。摘要重中之重采用“总-分”结构。第一段用3-4句话概括整个问题、你们的整体解决方案和最终结果。接着分段简述针对每个问题评价、预测、决策你们用了什么方法、得到了什么关键结论。最后一句总结亮点。摘要里要有核心数据如AUC值、总收益、关键阈值。问题重述与分析不要照抄题目要用自己的话梳理出问题的逻辑脉络、难点和解决思路。画出你们的技术路线图流程图让评委一眼看懂你们的架构。模型假设合理且必要。例如“假设企业提供的发票数据真实有效”、“假设市场基准利率在短期内保持不变”。为你们的简化处理提供依据。符号说明用三线表清晰列出所有主要变量、符号及其含义。模型建立与求解这是论文主体。对应前面几个部分每一节都要有清晰的模型描述、公式、算法步骤可以用伪代码或流程图并配上关键的中间结果图表如特征重要性柱状图、ROC曲线、额度分配散点图。模型评价与推广客观评价自己模型的优点如结合主客观权重、考虑了风险收益平衡和缺点如数据量有限、未考虑宏观经济因素。提出几个可行的改进或推广方向。可视化一图胜千言。企业实力分布直方图、风险-收益散点图横轴风险P_i纵轴单位收益气泡大小表示额度、信贷决策结果可视化图等都能极大提升论文的可读性和专业性。回顾这道2020年的C题它之所以经典是因为它模拟了一个完整的、真实的业务闭环。从数据到信息评价从信息到知识预测再从知识到智慧决策每一步都考验着参赛者的综合能力。备赛时与其泛泛地学习十个模型不如像这样把一道好题吃透把其中涉及的数据处理、特征工程、模型选择、算法实现、结果分析、论文撰写的全流程走通。当你真正理解了这个链条中每一个环节的“为什么”和“怎么办”再遇到新的赛题你就能快速抓住本质构建起属于自己的解题框架。数学建模建模是手段解决实际问题才是目的。希望这篇超详细的复盘能帮你离这个目标更近一步。