数学建模竞赛实战:基于企业发票数据的信用风险评估与信贷策略优化

数学建模竞赛实战:基于企业发票数据的信用风险评估与信贷策略优化 1. 赛题回顾与核心难点拆解2020年的高教社杯全国大学生数学建模竞赛C题题目是“中小微企业的信贷决策”。这道题当年让很多队伍感到棘手因为它不像传统的物理或工程问题那样有明确的模型可以套用更像是一个融合了数据分析、风险评估和决策优化的“半开放”商业案例。简单来说题目给了你123家有信贷记录的企业数据包括进销项发票、信誉评级、是否违约等信息以及302家无信贷记录企业的进销项发票数据。你的核心任务就是扮演银行信贷部门的角色为这些企业建立信用风险评估模型并据此制定信贷策略。这道题的难点非常典型也是数学建模从“解题”到“解决实际问题”的关键跨越点。首先数据是“脏”的发票信息里存在大量缺失、异常甚至矛盾的数据直接丢进模型里跑结果肯定惨不忍睹。其次目标多元且存在权衡。银行既要追求利润最大化多放贷、高利率又要控制风险减少坏账这两个目标本质上是冲突的。最后题目要求对无信贷记录的企业进行风险评估这属于典型的“冷启动”问题你无法直接使用“是否违约”这个标签来训练模型必须从其他维度挖掘企业的经营特征。很多新手队伍一上来就急着套用逻辑回归、随机森林甚至神经网络但往往忽略了最基础也是最重要的一步理解业务逻辑和数据本身。信贷决策不是纯数学游戏它背后是企业的生存状态。一家企业发票突然中断可能是倒闭了也可能是转型了毛利率极低可能是行业特性也可能是经营不善。如果不带着这些思考去处理数据模型就是空中楼阁。2. 数据预处理从“脏数据”到“有效特征”的实战路径拿到123家企业的数据表第一眼可能会有点懵。进项发票和销项发票是分开的而且每条记录就是一张发票包含了时间、金额、税额、对方企业名称等信息。我们的首要任务不是马上跑模型而是把这些原始的、碎片化的交易流水加工成能够刻画企业健康状况的“特征指标”。2.1 发票数据的清洗与整合这一步是体力活更是技术活。你需要将每个企业的进项和销项发票分别按时间排序进行匹配和计算。核心目标是计算出每个时间窗口比如按月、按季度的关键财务指标。首先处理异常和缺失。发票数据里常会有金额为负可能是退货红冲、交易方名称缺失或为“个人”的情况。对于负金额需要结合前后交易判断是正常退货还是数据错误通常可以取绝对值或与正项抵消。交易方为“个人”或缺失在计算交易集中度时可能需要特殊处理或视为一个类别。其次进行进销项匹配与关键指标计算。这是特征工程的核心。我们不是简单加总金额而是要衍生出有业务含义的变量。以下是一些经过实战检验的核心特征方向我当年指导队伍时要求他们必须逐一计算经营规模与稳定性特征月均销售额/采购额最基础的规模指标。销售额/采购额的变异系数标准差/均值反映业务波动性。波动越大风险可能越高。有效交易月份数在观测期内有多少个月是有交易的。连续多月无交易可能预示经营停滞。盈利能力与效率特征毛利率通过(销项金额 - 进项金额) / 销项金额近似计算。注意这里的“金额”是不含税的且需要时间对齐例如用本月采购的原材料成本对应下个月销售的产品收入但题目数据时间跨度有限通常简化按月计算毛利。进销项占比每月进项总额与销项总额的比值。比值长期过高可能说明成本压力大利润薄比值过低可能说明库存积压或虚开发票销项远大于进项。交易伙伴特征反映企业生态健康度供应商/客户集中度比如最大供应商的采购额占比。占比过高说明供应链依赖单一风险大。供应商/客户数量数量多通常意味着业务结构更分散抗风险能力强。稳定合作方比例有多少交易方是长期如超过3个月有业务往来的。发票行为特征反映财务规范性作废发票率作废发票数占总发票数的比例。过高可能意味着内部管理混乱。大额发票占比单张发票金额超过某个阈值如均值两倍的发票总金额占比。需要结合行业判断可能正常也可能异常。注意计算这些特征时时间窗口的选择很重要。题目数据跨度约2年可以按季度计算得到4-8个时间点的序列数据既能观察趋势又有足够样本。也可以计算整个时间段的统计量如均值、方差、趋势斜率但会损失周期性信息。2.2 标签构建与样本不均衡处理对于123家有信贷记录的企业我们有“信誉评级”和“是否违约”的标签。这里有一个关键点不要只把“是否违约”作为二分类标签。题目中的信誉评级A, B, C, D是一个重要的序数标签它包含了更丰富的风险信息。一个可行的方案是构建多任务学习模型同时预测违约概率和信誉等级。或者将违约企业视为最高风险然后根据信誉评级对未违约企业进行风险分层如A为低风险B为中低风险C为中高风险。另一个无法回避的问题是样本不均衡。违约企业通常是少数。直接训练模型它会倾向于把所有企业都预测为“不违约”也能获得很高的准确率但这对于风险识别毫无用处。我们当时采用了SMOTE合成少数类过采样技术与Edited Nearest Neighbors (ENN)结合的采样方法先通过SMOTE生成违约样本再用ENN清理边界上可能引入的噪声样本效果比单纯过采样或欠采样要好。3. 信用评估模型构建为什么选择集成树模型特征准备好了标签也明确了接下来就是选择模型。当年很多顶尖队伍的方案以及我个人的实战经验都指向同一个结论对于这类表格数据且特征间可能存在复杂非线性关系的情况基于决策树的集成模型如LightGBM, XGBoost, Random Forest是首选而不是神经网络或传统的逻辑回归。为什么对缺失值不敏感树模型在分裂时可以天然处理缺失值无需我们费尽心思去填充。我们预处理后的特征仍难免有缺失比如某个月无交易树模型能很好地应对。捕捉非线性与交互作用企业的风险不是特征的线性组合。例如“高波动性”和“低毛利率”同时出现时风险是指数级上升的树模型能通过多级分裂捕捉这种复杂交互。可解释性相对较好虽然不如线性模型直观但通过特征重要性排序Feature Importance我们能知道哪些指标比如“销项变异系数”、“最大客户占比”对模型判断影响最大这反过来可以验证我们的业务逻辑。效率高LightGBM和XGBoost针对大数据集进行了优化训练速度快这对于比赛有限的时间来说至关重要。具体到模型训练有几个关键技巧特征重要性筛选先训练一个初步的树模型剔除重要性几乎为0的特征防止过拟合和干扰。交叉验证与调参使用网格搜索Grid Search或随机搜索Random Search结合交叉验证来调整核心参数如树的深度max_depth、学习率learning_rate、叶子节点最小样本数min_child_samples等。切记不要追求在训练集上的完美分数要关注验证集的稳定性。输出概率而非类别对于二分类违约/不违约让模型输出违约概率如0.23而不是直接输出0或1。这个概率值将成为后续信贷决策的核心依据。对于多分类信誉评级则可以输出属于每个等级的概率。4. 核心挑战无信贷记录企业的风险评估冷启动这是C题最精彩也最考验建模者思维的部分。302家企业只有发票数据没有“是否违约”的标签。你训练好的模型无法直接用于预测因为模型认识的特征是基于有标签数据学到的分布直接套用可能偏差很大。我们当时采用的策略是“间接推断”与“迁移学习”思想相结合。第一步构建企业画像与聚类分析。利用我们在2.1节中为123家企业计算的所有特征同样地为302家无标签企业计算一套完全相同的特征。这样所有企业425家都被映射到了同一个高维特征空间。然后使用聚类算法如K-Means, DBSCAN或高斯混合模型GMM对所有企业进行聚类。这个步骤的目的找出那些经营模式、财务特征相似的企业群体。我们假设“物以类聚人以群分”经营状况相似的企业其信用风险也应该相近。如果某个聚类中大部分有标签的企业都是高风险的那么落入这个聚类的无标签企业其风险也理应较高。第二步利用有标签数据为聚类打标。对于每一个聚类检查其中包含的有标签企业。我们可以计算该聚类内有标签企业的平均违约概率来自我们已训练好的模型预测值或者统计其违约比例和信誉评级分布。将这个聚类的“整体风险标签”或“风险分布”赋予该聚类内的所有无标签企业。第三步模型预测与结果融合。此时对于无标签企业我们有了两种风险估计直接模型预测值用之前训练的模型直接预测需谨慎可能存在分布偏移。聚类风险标签来自其所属聚类的群体风险。一个稳健的做法是进行加权融合。例如对于聚类非常紧密、内部有标签企业数量较多的无标签企业可以更相信聚类标签对于处于聚类边缘或所属聚类有标签样本很少的企业则可以适当参考直接模型预测值但赋予较低权重。踩坑实录这里最容易犯的错误是直接使用模型预测结果排序。我们曾试过发现一些发票数据非常稀疏交易很少的企业模型会给出非常极端的概率值接近0或1这显然是不靠谱的。引入聚类分析实际上是为预测增加了一个“平滑”和“基于群体常识”的约束使得最终的风险评估更加稳健。5. 信贷策略制定在风险与收益间寻找最优解模型给出了每家企业的违约概率但这只是第一步。银行最终要决定贷不贷贷多少利率多少题目设定了总额度1亿贷款利率范围以及企业有不同信贷需求。这本质上是一个带约束的优化问题。目标函数银行总利润最大化。 总利润 Σ (贷款金额 * 利率 * (1 - 违约概率) - 贷款金额 * 违约概率) 简化理解期望收益 贷款金额 * 利率 * 正常回收概率 - 贷款金额 * 坏账损失。约束条件总贷款额度 ≤ 1亿。给每家企业的贷款金额不能超过其需求。利率要在规定范围内且通常风险越高利率应越高以覆盖风险风险定价。这是一个典型的线性/非线性规划问题。我们可以将每家企业的“贷款金额”和“利率”作为决策变量利率可离散化为几个档次简化问题但这样变量太多。更实用的做法是分两步走第一步企业排序与初筛。根据模型给出的违约概率结合其他规则进行排序。例如规则一违约概率超过某个绝对阈值如0.5的直接拒绝。规则二对剩余企业计算一个“综合得分”。综合得分 (1 - 违约概率) * 企业需求金额。这个得分既考虑了风险违约概率低好也考虑了业务的“量”需求金额大可能利息收入多。按得分从高到低排序。第二步额度分配与利率定价。从排序列表的顶部开始依次满足企业的贷款需求直到总额度用完。这就是一个“贪婪算法”。对于利率可以采用一个简单的风险定价模型基准利率 风险溢价。风险溢价可以与违约概率正相关例如利率 4% 违约概率 * 8%这样违约概率0.1的企业利率是4.8%违约概率0.3的企业利率是6.4%既体现了风险差异又控制了利率在题目要求范围内。更高级的优化你可以将这个问题形式化为一个整数规划问题。定义0-1变量x_i表示是否给企业i贷款决策变量为贷款金额amount_i连续或离散。目标函数是最大化总期望利润约束为总额度和需求上限。用优化求解器如PuLP, Gurobi来求解可以得到理论上的最优解。这在论文中是很大的亮点但需要清晰的数学模型表述和正确的软件使用。6. 模型评价与策略分析如何让你的论文脱颖而出很多队伍做完预测和策略就结束了但优秀的论文会专门开辟一节进行深入的模型评价与策略分析这是拉开差距的关键。首先模型本身的评价。对于有标签的123家企业你的信用评估模型预测效果如何不能只看准确率Accuracy。在极度不均衡的数据中准确率是虚高的。必须报告精确率Precision预测为违约的企业中真正违约的比例。这关系到银行审核成本。召回率Recall所有真正违约的企业中被模型找出来的比例。这关系到风险漏报。F1-Score精确率和召回率的调和平均数。AUC值ROC曲线下的面积衡量模型整体排序能力的好坏对样本不均衡不敏感是金融风控领域的黄金指标。画出ROC曲线和Precision-Recall曲线并计算AUC和AP平均精度你的模型评价部分就非常扎实了。其次信贷策略的敏感性分析。你制定的策略依赖于模型给出的违约概率。但如果模型有误差呢你需要测试策略的稳健性。方法一对模型的预测概率进行扰动。比如将所有概率加上一个小的随机噪声±0.05重新运行额度分配策略看最终的总利润和坏账率变化是否剧烈。如果变化很小说明你的策略对模型误差不敏感很稳健。方法二改变决策规则中的阈值。比如把直接拒绝的违约概率阈值从0.5调到0.4或0.6分析总利润和风险承担的变化。这能说明你的策略在风险偏好上的权衡。最后策略的对比与商业洞见。你可以设计一个简单的基准策略进行对比。例如随机策略随机选择企业放贷。粗放策略只根据企业需求金额大小排序放贷。保守策略只放贷给信誉评级为A的企业。将你的智能模型策略与这些基准策略对比在相同的总额度下比较总利润、坏账率、服务企业数量等指标。用数据和图表清晰地展示你的策略在提升利润、控制风险或扩大服务面上的优越性。并进一步分析你的策略主要拒绝了哪些类型的企业如高波动、低毛利主要扶持了哪些类型的企业如经营稳定、客户分散从而得出一些有价值的商业建议。这部分内容能将你的论文从单纯的“解题报告”提升到“商业分析方案”的层次。7. 论文写作与可视化把复杂工作清晰呈现数学建模竞赛三分靠做七分靠写。再好的模型如果表达不清也难获好评。摘要这是重中之重必须精炼。用一段话概括针对什么问题采用了什么方法数据预处理、特征工程、XX模型、聚类分析、优化模型得到了什么结果风险评估模型性能AUCXX制定了信贷策略在XX亿额度下预期利润为XX优于基准策略最后点明创新点如结合聚类解决冷启动问题进行了稳健性分析。模型假设要合理且必要。例如“假设企业进销项发票数据真实反映其经营状况”、“在观测期外企业风险特征不发生突变”、“银行利率浮动范围足以覆盖风险溢价”等。避免过于理想化或不切实际的假设。可视化一图胜千言。特征相关性热力图展示你构造的特征之间的相关性以及它们与目标变量的相关性说明特征设计的合理性。模型性能曲线ROC曲线和Precision-Recall曲线必须要有。聚类结果可视化使用t-SNE或PCA将高维特征降到2维或3维进行展示用不同颜色标记不同的聚类以及有标签企业的风险等级直观显示“物以类聚”。策略对比图用柱状图或雷达图对比你的策略与多个基准策略在利润、坏账率等多项指标上的表现。企业风险分布图将425家企业的风险评分或违约概率进行分布展示可以直观看出高风险和低风险企业的比例。行文逻辑严格按照“问题重述→问题分析→模型准备→模型建立→模型求解→结果分析→模型评价与推广”的逻辑线来组织。每一部分之间要有承上启下的句子让评委跟着你的思路走。我个人在多次指导中最大的体会是清晰的逻辑和扎实的可视化往往比使用一个极其复杂但解释不清的模型更能打动评委。C题的本质是考察你运用数学工具解决实际商业问题的全过程能力从数据理解、特征构建、模型选择、策略优化到结果分析环环相扣。抓住“风险”和“收益”这对核心矛盾用数据说话用模型论证你的解决方案就成功了一大半。最后一定要留出足够的时间用于写作和检查一篇排版精美、图表规范、语句通顺的论文是获得好名次的最基本保障。