學(xué)建模到金融風(fēng)控:信貸決策分析全流程實(shí)戰(zhàn)拆解)
簡介本資源是2020年全國大學(xué)生數(shù)學(xué)建模競賽C題“中小微企業(yè)信貸決策”的完整參賽成果包面向數(shù)學(xué)建模參賽學(xué)生、金融數(shù)據(jù)分析初學(xué)者及畢業(yè)設(shè)計(jì)階段的本科生聚焦小微企業(yè)風(fēng)控建模這一典型商業(yè)實(shí)戰(zhàn)問題。壓縮包共160個(gè)文件含60個(gè)xlsx與csv格式的原始及處理后數(shù)據(jù)集如train.csv、test.csv、42個(gè)txt日志與參數(shù)說明、26個(gè)jpg/png圖表含特征重要性圖、預(yù)測對比圖等、10個(gè)MATLAB核心算法腳本m文件、5個(gè)Word論文文檔含主論文與神經(jīng)網(wǎng)絡(luò)專項(xiàng)說明整體大小248.35MB結(jié)構(gòu)清晰、模塊可溯。已有659人學(xué)習(xí)下載提供從數(shù)據(jù)清洗、特征工程、多模型構(gòu)建線性回歸、決策樹、神經(jīng)網(wǎng)絡(luò)到交叉驗(yàn)證與結(jié)果可視化的全流程實(shí)現(xiàn)附帶可編輯論文與可運(yùn)行代碼便于復(fù)現(xiàn)、調(diào)試與課程設(shè)計(jì)拓展應(yīng)用。1. 項(xiàng)目概述從一道賽題到一套完整的信貸決策分析方案如果你關(guān)注過數(shù)學(xué)建模競賽尤其是國賽那么“中小微企業(yè)信貸決策”這個(gè)題目一定不陌生。2020年全國大學(xué)生數(shù)學(xué)建模競賽C題正是以此為核心要求參賽者基于給定的企業(yè)數(shù)據(jù)構(gòu)建一套量化評估模型為銀行等金融機(jī)構(gòu)提供信貸決策支持。這道題之所以經(jīng)典不僅因?yàn)樗o貼“金融服務(wù)實(shí)體經(jīng)濟(jì)”的時(shí)代脈搏更因?yàn)樗昝廊诤狭藬?shù)據(jù)分析、風(fēng)險(xiǎn)評估、優(yōu)化決策等多個(gè)核心建模技能是檢驗(yàn)參賽者綜合能力的絕佳試金石。我當(dāng)年作為指導(dǎo)老師帶著學(xué)生啃下了這道硬骨頭后來也反復(fù)研究過各種優(yōu)秀論文和開源方案。今天我就以一個(gè)過來人的視角為你徹底拆解這道賽題并分享一套經(jīng)過實(shí)戰(zhàn)檢驗(yàn)、包含完整論文思路和可運(yùn)行源代碼的解決方案。無論你是正在備賽的學(xué)生希望找到高質(zhì)量的參考案例還是對金融風(fēng)控、數(shù)據(jù)分析感興趣的從業(yè)者想了解如何將數(shù)學(xué)模型落地應(yīng)用這篇文章都將為你提供一條清晰的路徑和可直接“抄作業(yè)”的干貨。這道題的核心是解決銀行面對123家有信貸需求的中小微企業(yè)時(shí)如何科學(xué)地分配有限的信貸資金總額1億元并確定每家企業(yè)的信貸額度與利率。題目給出了這些企業(yè)近三年的發(fā)票信息、進(jìn)銷項(xiàng)數(shù)據(jù)、是否違約的標(biāo)簽以及一些靜態(tài)信息。難點(diǎn)在于數(shù)據(jù)是真實(shí)商業(yè)場景的縮影——不完整、有噪聲、量綱不一。你不能簡單地套用某個(gè)現(xiàn)成模型而必須像一個(gè)真正的信貸分析師一樣完成數(shù)據(jù)清洗、特征工程、信用評級(jí)、額度定價(jià)和資產(chǎn)組合優(yōu)化這一整套流程。最終提交的成果通常是一篇邏輯嚴(yán)謹(jǐn)?shù)恼撐暮椭嗡薪Y(jié)論的源代碼多為Python或MATLAB。接下來我將分步拆解這個(gè)過程中的每一個(gè)關(guān)鍵環(huán)節(jié)并附上我基于常見實(shí)踐補(bǔ)充的代碼要點(diǎn)和避坑指南。2. 核心解題思路與整體方案設(shè)計(jì)面對這樣一個(gè)開放性的綜合問題清晰的頂層設(shè)計(jì)是成功的一半。很多隊(duì)伍折戟沉沙不是因?yàn)槟硞€(gè)算法不精通而是從一開始思路就亂了。我們的整體方案可以概括為“一個(gè)核心目標(biāo)兩條分析主線三層模型架構(gòu)”。2.1 核心目標(biāo)與問題界定首先必須明確這不是一個(gè)單純的預(yù)測問題預(yù)測企業(yè)是否違約而是一個(gè)典型的“決策優(yōu)化”問題。銀行的終極目標(biāo)是在風(fēng)險(xiǎn)可控的前提下實(shí)現(xiàn)整體收益的最大化。因此我們的方案必須同時(shí)回答三個(gè)子問題風(fēng)險(xiǎn)評估如何量化每個(gè)企業(yè)的違約風(fēng)險(xiǎn)信用評分額度與利率定價(jià)對于不同風(fēng)險(xiǎn)的企業(yè)應(yīng)該給多少額度、定多高的利率風(fēng)險(xiǎn)定價(jià)資產(chǎn)組合優(yōu)化在總額度固定的約束下如何分配資金使得總收益最高、風(fēng)險(xiǎn)最低組合優(yōu)化這三個(gè)問題環(huán)環(huán)相扣。風(fēng)險(xiǎn)評估是基礎(chǔ)定價(jià)是橋梁優(yōu)化是最終決策。任何試圖跳過前兩步直接做優(yōu)化的嘗試都會(huì)因?yàn)槿狈侠淼妮斎攵 ?.2 兩條分析主線企業(yè)經(jīng)營與信貸行為題目數(shù)據(jù)提供了兩個(gè)維度的信息對應(yīng)兩條分析主線主線一企業(yè)經(jīng)營健康度分析。利用進(jìn)銷項(xiàng)發(fā)票數(shù)據(jù)時(shí)間、金額、對象我們可以構(gòu)建反映企業(yè)生存狀態(tài)的核心指標(biāo)。例如流動(dòng)性指標(biāo)銷售收入波動(dòng)率、月度進(jìn)銷項(xiàng)差額、現(xiàn)金轉(zhuǎn)換周期模擬。盈利性指標(biāo)毛利率模擬、進(jìn)銷項(xiàng)比率。成長性指標(biāo)銷售收入同比增長率、客戶/供應(yīng)商集中度。穩(wěn)定性指標(biāo)交易頻率的規(guī)律性、發(fā)票作廢率。 這些指標(biāo)是從企業(yè)基本面判斷其還款能力的核心尤其適用于那些缺乏抵押物的信用貸款評估。主線二信貸歷史與行為分析。題目給出了“是否違約”的標(biāo)簽這是最直接的信用信息。我們需要利用這部分?jǐn)?shù)據(jù)但要注意處理樣本不平衡違約企業(yè)通常占少數(shù)和潛在的數(shù)據(jù)質(zhì)量問題。此外可以結(jié)合企業(yè)靜態(tài)信息如成立年限、行業(yè)挖掘其與違約率的關(guān)聯(lián)。2.3 三層模型架構(gòu)設(shè)計(jì)基于以上分析我們設(shè)計(jì)一個(gè)三層遞進(jìn)的模型架構(gòu)這是方案的技術(shù)骨架第一層信用評分模型。融合兩條主線的特征使用機(jī)器學(xué)習(xí)算法如邏輯回歸、XGBoost、LightGBM訓(xùn)練一個(gè)分類模型預(yù)測企業(yè)的違約概率PD, Probability of Default。這一層的輸出是一個(gè)0到1之間的數(shù)值代表企業(yè)的風(fēng)險(xiǎn)水平。注意這里有一個(gè)關(guān)鍵技巧——不要只輸出“是否違約”的0/1標(biāo)簽一定要輸出“違約概率”。因?yàn)楹罄m(xù)的風(fēng)險(xiǎn)定價(jià)和優(yōu)化都需要連續(xù)的風(fēng)險(xiǎn)度量二分類標(biāo)簽的信息量不夠。第二層風(fēng)險(xiǎn)定價(jià)模型。根據(jù)第一層輸出的違約概率PD結(jié)合信貸基本原理為每家企業(yè)計(jì)算建議的信貸額度和利率。這里通常采用“風(fēng)險(xiǎn)調(diào)整后的收益最大化”原則。一個(gè)簡化的定價(jià)公式思路是利率 無風(fēng)險(xiǎn)利率 風(fēng)險(xiǎn)溢價(jià) * 違約概率其中風(fēng)險(xiǎn)溢價(jià)需要根據(jù)銀行的風(fēng)險(xiǎn)偏好和資金成本來設(shè)定。額度則可以根據(jù)企業(yè)的資金需求如年均銷項(xiàng)總額的一定比例和風(fēng)險(xiǎn)水平共同決定為高風(fēng)險(xiǎn)企業(yè)設(shè)置額度上限。第三層信貸資產(chǎn)組合優(yōu)化模型。在1億元的總預(yù)算和每家企業(yè)的額度建議約束下以“總期望收益最大化”或“風(fēng)險(xiǎn)調(diào)整后收益如夏普比率最大化”為目標(biāo)建立優(yōu)化模型。決策變量是是否給某家企業(yè)貸款以及貸款多少。這是一個(gè)帶約束的優(yōu)化問題可以用線性規(guī)劃、整數(shù)規(guī)劃或啟發(fā)式算法如遺傳算法求解。這一層的輸出就是最終的信貸決策方案給哪些企業(yè)貸款分別貸多少利率是多少。這個(gè)三層架構(gòu)邏輯清晰層層遞進(jìn)且每一層都有成熟的理論和方法支撐在論文中易于闡述在編程上也易于模塊化實(shí)現(xiàn)。3. 數(shù)據(jù)預(yù)處理與特征工程實(shí)戰(zhàn)詳解好的模型離不開好的數(shù)據(jù)。這道題給出的數(shù)據(jù)看似規(guī)整實(shí)則暗藏玄機(jī)。數(shù)據(jù)預(yù)處理和特征工程階段的工作直接決定了后續(xù)模型的天花板。3.1 數(shù)據(jù)清洗處理真實(shí)世界的“臟數(shù)據(jù)”首先需要加載并審視所有數(shù)據(jù)表企業(yè)信息、進(jìn)項(xiàng)發(fā)票、銷項(xiàng)發(fā)票、違約標(biāo)簽。缺失值處理靜態(tài)信息中的缺失值如某些企業(yè)無行業(yè)分類可以采用眾數(shù)填充或單獨(dú)設(shè)為“未知”類別。對于發(fā)票數(shù)據(jù)中的缺失如關(guān)鍵字段為空通常直接刪除該條記錄因?yàn)闊o法推測。異常值處理這是重中之重。發(fā)票金額會(huì)出現(xiàn)極端大或極端小的值如幾分錢或巨額交易。方法使用箱線圖或3σ原則識(shí)別異常值。對于明顯不符合商業(yè)邏輯的異常值如金額為負(fù)且非退貨、金額極小如0.01元且頻繁出現(xiàn)需要結(jié)合業(yè)務(wù)判斷。一種穩(wěn)妥的做法是將超出行業(yè)常規(guī)交易規(guī)模上下限的數(shù)據(jù)視為異常予以剔除或縮尾處理Winsorization。實(shí)操心得不要武斷地刪除所有統(tǒng)計(jì)上的異常值。有些小額交易可能是測試單或費(fèi)用有些大額交易可能是真實(shí)業(yè)務(wù)。可以嘗試按企業(yè)分組計(jì)算其歷史交易金額的分位數(shù)如99%分位數(shù)將超過該分位數(shù)一定倍數(shù)的交易視為異常這樣更個(gè)性化。數(shù)據(jù)一致性檢查檢查發(fā)票日期是否在合理范圍內(nèi)如不超過當(dāng)前日期進(jìn)項(xiàng)和銷項(xiàng)發(fā)票中的企業(yè)ID是否都在企業(yè)信息表中存在。確保用于關(guān)聯(lián)的鍵是準(zhǔn)確無誤的。3.2 特征構(gòu)建從原始數(shù)據(jù)中提煉“黃金指標(biāo)”這是最體現(xiàn)創(chuàng)造力和業(yè)務(wù)理解的部分。我們需要從時(shí)序交易數(shù)據(jù)中構(gòu)造出能表征企業(yè)健康狀況的靜態(tài)特征。以下是一些經(jīng)過驗(yàn)證的有效特征方向及構(gòu)建方法基于聚合統(tǒng)計(jì)的特征銷售規(guī)模企業(yè)近一年/兩年的銷項(xiàng)總額、月均銷售額。經(jīng)營穩(wěn)定性銷售額的月度變異系數(shù)標(biāo)準(zhǔn)差/均值、月度銷售額的最大回撤連續(xù)下降幅度。盈利能力模擬(銷項(xiàng)總額 - 進(jìn)項(xiàng)總額) / 銷項(xiàng)總額。注意這只是一個(gè)非常粗略的毛利估算因?yàn)檫M(jìn)銷項(xiàng)并非嚴(yán)格成本收入配比但能反映一定的盈利趨勢。資金周轉(zhuǎn)情況計(jì)算每個(gè)月的“凈現(xiàn)金流”月銷項(xiàng)總額 - 月進(jìn)項(xiàng)總額觀察其正負(fù)分布和趨勢?;跁r(shí)序行為的特征交易活躍度每月平均交易次數(shù)、交易天數(shù)的比例。增長趨勢利用線性回歸擬合月度銷售額的時(shí)間序列其斜率可作為增長趨勢的量化指標(biāo)。季節(jié)性計(jì)算銷售額的月度環(huán)比增長率或使用傅里葉變換提取周期性成分的強(qiáng)度。基于復(fù)雜網(wǎng)絡(luò)的特征進(jìn)階將企業(yè)和其交易對手客戶/供應(yīng)商視為節(jié)點(diǎn)交易關(guān)系視為邊可以構(gòu)建一個(gè)交易網(wǎng)絡(luò)??梢杂?jì)算每個(gè)企業(yè)的網(wǎng)絡(luò)中心性指標(biāo)如度中心性交易對手?jǐn)?shù)量、加權(quán)度中心性交易總額。一個(gè)與眾多穩(wěn)定伙伴交易的企業(yè)通常風(fēng)險(xiǎn)更低。還可以分析企業(yè)交易網(wǎng)絡(luò)的聚集系數(shù)反映其交易圈的緊密程度?;谖谋?分類的特征對企業(yè)名稱、交易對手名稱進(jìn)行簡單的文本分析如是否包含“科技”、“貿(mào)易”、“實(shí)業(yè)”等關(guān)鍵詞或利用行業(yè)信息進(jìn)行編碼。3.3 特征選擇與編碼構(gòu)建出大量特征后需要進(jìn)行篩選避免維度災(zāi)難和過擬合。過濾法計(jì)算每個(gè)特征與目標(biāo)變量是否違約的相關(guān)性如方差分析、互信息剔除相關(guān)性極低的特征。包裹法使用遞歸特征消除RFE配合一個(gè)基礎(chǔ)模型如邏輯回歸自動(dòng)選擇最重要的特征子集。嵌入法直接使用L1正則化的模型如Lasso回歸或樹模型如XGBoost訓(xùn)練后根據(jù)特征重要性排序進(jìn)行選擇。對于類別型特征如行業(yè)必須進(jìn)行編碼。最常用的是標(biāo)簽編碼Label Encoding或獨(dú)熱編碼One-Hot Encoding。如果類別數(shù)不多獨(dú)熱編碼更安全如果類別數(shù)多且存在序關(guān)系標(biāo)簽編碼更節(jié)省空間。避坑指南特征工程最容易犯的錯(cuò)誤是“數(shù)據(jù)泄露”。絕對不能在構(gòu)建特征時(shí)使用未來的信息。例如計(jì)算企業(yè)2020年的特征只能使用截至2019年底的數(shù)據(jù)。在代碼中務(wù)必嚴(yán)格按照時(shí)間戳進(jìn)行數(shù)據(jù)切割或者使用滾動(dòng)窗口的方式計(jì)算歷史統(tǒng)計(jì)量。4. 信用評分模型構(gòu)建與實(shí)現(xiàn)信用評分模型是整個(gè)體系的基石。我們的目標(biāo)是得到一個(gè)穩(wěn)定、可解釋、且能輸出概率的模型。4.1 模型選型與理由邏輯回歸Logistic Regression作為基線模型的首選。優(yōu)點(diǎn)在于模型簡單、可解釋性強(qiáng)可以直接得到違約概率??梢酝ㄟ^添加多項(xiàng)式項(xiàng)和交互項(xiàng)來捕捉非線性。在特征經(jīng)過充分篩選和標(biāo)準(zhǔn)化后邏輯回歸往往能有不錯(cuò)的表現(xiàn)且論文中易于闡述其系數(shù)含義如“銷售收入每增加一個(gè)單位違約幾率比降低X%”。集成樹模型XGBoost/LightGBM/CatBoost當(dāng)前風(fēng)控領(lǐng)域的絕對主流。它們能自動(dòng)處理非線性關(guān)系和特征交互對異常值不敏感且通常能獲得更高的預(yù)測精度。LightGBM和CatBoost對類別特征處理更友好訓(xùn)練速度更快。選擇建議在競賽中為了展示技術(shù)全面性可以同時(shí)構(gòu)建邏輯回歸和LightGBM兩個(gè)模型對比其性能。邏輯回歸用于解釋LightGBM用于追求精度。最終可以融合兩者的預(yù)測結(jié)果或直接使用表現(xiàn)更好的那個(gè)。4.2 樣本處理與模型訓(xùn)練由于違約企業(yè)通常是少數(shù)我們需要處理樣本不平衡問題。重采樣技術(shù)過采樣如SMOTE算法在少數(shù)類樣本間合成新樣本。優(yōu)點(diǎn)是能充分利用所有樣本信息但可能引入噪聲。欠采樣隨機(jī)減少多數(shù)類樣本。優(yōu)點(diǎn)是計(jì)算快但會(huì)丟失信息。競賽實(shí)用策略通常使用SMOTE或ADASYN進(jìn)行過采樣或者直接在模型訓(xùn)練時(shí)調(diào)整類別權(quán)重如XGBoost的scale_pos_weight參數(shù)。建議嘗試不同組合在驗(yàn)證集上選擇最佳方案。訓(xùn)練與驗(yàn)證絕對不能使用全部數(shù)據(jù)訓(xùn)練后直接在測試集上評估。必須劃分訓(xùn)練集和驗(yàn)證集如70%-30%或者使用交叉驗(yàn)證如5折交叉驗(yàn)證。交叉驗(yàn)證能更穩(wěn)健地評估模型性能并用于調(diào)參。4.3 模型評估與閾值選擇評估二分類模型不能只看準(zhǔn)確率Accuracy因?yàn)樵诓黄胶鈹?shù)據(jù)上它會(huì)失真。核心評估指標(biāo)AUC-ROC這是最核心的指標(biāo)衡量模型將正例違約排在負(fù)例不違約前面的能力與閾值無關(guān)。AUC越接近1越好0.5相當(dāng)于隨機(jī)猜測。KS值衡量模型區(qū)分度的常用指標(biāo)是TPR與FPR之差的最大值。KS0.3通常認(rèn)為模型有較好的區(qū)分能力。精確率Precision與召回率Recall這是一對權(quán)衡指標(biāo)。在信貸中我們通常更關(guān)注召回率Recall即盡可能多地找出所有潛在的違約客戶寧可錯(cuò)殺不可放過因?yàn)槁┑粢粋€(gè)壞客戶帶來的損失遠(yuǎn)大于拒絕一個(gè)好客戶的損失。但同時(shí)過低的精確率會(huì)導(dǎo)致大量好客戶被拒絕業(yè)務(wù)無法開展。閾值選擇模型輸出的是概率需要設(shè)定一個(gè)閾值如0.5來判斷“違約”與“不違約”。這個(gè)閾值的選擇直接關(guān)系到召回率和精確率的平衡。我們可以通過繪制P-R曲線或根據(jù)業(yè)務(wù)成本來尋找最優(yōu)閾值。例如如果銀行認(rèn)為漏掉一個(gè)壞客戶的損失是拒絕一個(gè)好客戶損失的10倍那么可以通過代價(jià)敏感學(xué)習(xí)來調(diào)整閾值。4.4 代碼實(shí)現(xiàn)要點(diǎn)Python示例import pandas as pd import numpy as np from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.metrics import roc_auc_score, classification_report, confusion_matrix import lightgbm as lgb from imblearn.over_sampling import SMOTE # 導(dǎo)入SMOTE # 假設(shè) df_features 是包含所有特征和標(biāo)簽‘label’的DataFrame X df_features.drop(label, axis1) y df_features[label] # 1. 劃分?jǐn)?shù)據(jù)集 X_train, X_val, y_train, y_val train_test_split(X, y, test_size0.3, random_state42, stratifyy) # 2. 處理樣本不平衡 (在訓(xùn)練集上做) smote SMOTE(random_state42) X_train_res, y_train_res smote.fit_resample(X_train, y_train) # 3. 特征標(biāo)準(zhǔn)化 (對數(shù)值型特征) numeric_cols X_train.select_dtypes(include[np.number]).columns scaler StandardScaler() X_train_res[numeric_cols] scaler.fit_transform(X_train_res[numeric_cols]) X_val[numeric_cols] scaler.transform(X_val[numeric_cols]) # 4. 訓(xùn)練邏輯回歸模型 lr_model LogisticRegression(penaltyl2, C1.0, solverliblinear, random_state42) lr_model.fit(X_train_res, y_train_res) y_val_pred_prob_lr lr_model.predict_proba(X_val)[:, 1] auc_lr roc_auc_score(y_val, y_val_pred_prob_lr) print(f邏輯回歸 AUC: {auc_lr:.4f}) # 5. 訓(xùn)練LightGBM模型 lgb_train lgb.Dataset(X_train_res, y_train_res) lgb_val lgb.Dataset(X_val, y_val, referencelgb_train) params { boosting_type: gbdt, objective: binary, metric: auc, num_leaves: 31, learning_rate: 0.05, feature_fraction: 0.9, bagging_fraction: 0.8, bagging_freq: 5, verbose: -1, random_state: 42, scale_pos_weight: len(y_train_res[y_train_res0]) / len(y_train_res[y_train_res1]) # 設(shè)置類別權(quán)重 } gbm_model lgb.train(params, lgb_train, num_boost_round1000, valid_sets[lgb_val], callbacks[lgb.early_stopping(stopping_rounds50), lgb.log_evaluation(period100)]) y_val_pred_prob_gbm gbm_model.predict(X_val, num_iterationgbm_model.best_iteration) auc_gbm roc_auc_score(y_val, y_val_pred_prob_gbm) print(fLightGBM AUC: {auc_gbm:.4f}) # 6. 模型融合 (簡單加權(quán)平均) final_pred_prob 0.3 * y_val_pred_prob_lr 0.7 * y_val_pred_prob_gbm # 權(quán)重可根據(jù)驗(yàn)證集表現(xiàn)調(diào)整 auc_final roc_auc_score(y_val, final_pred_prob) print(f融合模型 AUC: {auc_final:.4f})5. 風(fēng)險(xiǎn)定價(jià)與額度測算模型得到企業(yè)的違約概率PD后我們需要將其轉(zhuǎn)化為具體的業(yè)務(wù)決策貸多少額度和以什么價(jià)格貸利率。5.1 基于風(fēng)險(xiǎn)的利率定價(jià)原理銀行定價(jià)的核心是覆蓋“預(yù)期損失”并獲取“風(fēng)險(xiǎn)溢價(jià)”。一個(gè)簡化的定價(jià)公式如下貸款利率 資金成本 運(yùn)營成本 預(yù)期損失 風(fēng)險(xiǎn)溢價(jià) 目標(biāo)利潤其中資金成本銀行獲取資金的成本可近似用國債收益率或同業(yè)拆借利率表示。運(yùn)營成本審批、管理等固定成本分?jǐn)?。預(yù)期損失EL 違約概率PD × 違約損失率LGD × 風(fēng)險(xiǎn)暴露EAD。在本題簡化模型中我們可以假設(shè)LGD違約后能收回的比例是一個(gè)固定值如50%EAD就是貸款額度本身。風(fēng)險(xiǎn)溢價(jià)對承擔(dān)非預(yù)期風(fēng)險(xiǎn)的補(bǔ)償。目標(biāo)利潤銀行要求的資本回報(bào)。對于競賽我們可以大幅簡化。一個(gè)常見且合理的簡化模型是利率_i 基準(zhǔn)利率 α × PD_i其中基準(zhǔn)利率包含了資金成本、運(yùn)營成本和基礎(chǔ)利潤α是一個(gè)調(diào)節(jié)系數(shù)反映了銀行的風(fēng)險(xiǎn)厭惡程度。PD_i越高利率越高。我們需要設(shè)定基準(zhǔn)利率和α的值使其在現(xiàn)實(shí)合理范圍內(nèi)例如最終利率分布在5%到15%之間。5.2 信貸額度測算思路額度測算需要平衡企業(yè)需求、銀行風(fēng)險(xiǎn)和監(jiān)管要求。需求側(cè)測算根據(jù)企業(yè)的經(jīng)營規(guī)模估算。一個(gè)常用方法是取企業(yè)近一年年均銷項(xiàng)收入的一個(gè)比例如20%-30%作為其理論資金需求上限。額度需求上限_i 年均銷售額_i × ββ可取0.25風(fēng)險(xiǎn)側(cè)約束根據(jù)PD設(shè)置風(fēng)險(xiǎn)限額??梢詾椴煌L(fēng)險(xiǎn)等級(jí)如根據(jù)PD分箱的企業(yè)設(shè)置不同的最高額度。例如PD0.3的企業(yè)單戶額度不超過50萬。綜合確定最終的建議額度取min(需求側(cè)測算額度 風(fēng)險(xiǎn)側(cè)限額)。同時(shí)所有企業(yè)的額度之和不能超過1億元的總預(yù)算這個(gè)約束留待最后的優(yōu)化模型解決。5.3 實(shí)現(xiàn)代碼片段# 假設(shè)我們已經(jīng)有了所有企業(yè)的違約概率列表 pd_list def calculate_interest_rate(pd, base_rate0.05, alpha0.3): 計(jì)算基于PD的利率 rate base_rate alpha * pd # 設(shè)置利率上下限例如5%到15% rate np.clip(rate, 0.05, 0.15) return rate def calculate_credit_limit(annual_sales, pd, sales_ratio0.25, risk_limits[(0.0, 0.1, 1e7), (0.1, 0.3, 5e6), (0.3, 1.0, 1e6)]): 計(jì)算建議信貸額度 # 基于銷售額的需求額度 demand_limit annual_sales * sales_ratio # 基于PD的風(fēng)險(xiǎn)額度 risk_limit 1e6 # 默認(rèn)值 for low, high, limit in risk_limits: if low pd high: risk_limit limit break # 取兩者最小值 suggested_limit min(demand_limit, risk_limit) return suggested_limit # 應(yīng)用函數(shù) df_companies[PD] final_pred_prob # 假設(shè)這是融合模型預(yù)測的違約概率 df_companies[Annual_Sales] ... # 從特征中獲取的年銷售額 df_companies[Interest_Rate] df_companies[PD].apply(calculate_interest_rate) df_companies[Suggested_Limit] df_companies.apply(lambda row: calculate_credit_limit(row[Annual_Sales], row[PD]), axis1) print(df_companies[[企業(yè)ID, PD, Interest_Rate, Suggested_Limit]].head())6. 信貸資產(chǎn)組合優(yōu)化模型這是最后一步也是決定性的“臨門一腳”。銀行有1個(gè)億但所有企業(yè)的建議額度之和可能遠(yuǎn)超過這個(gè)數(shù)。我們需要科學(xué)地選擇貸款組合。6.1 優(yōu)化問題建模我們可以將其構(gòu)建為一個(gè)0-1整數(shù)規(guī)劃問題決策變量x_i ∈ {0, 1}表示是否給企業(yè)i貸款。為了簡化可以先假設(shè)貸款額度就是之前計(jì)算的建議額度或按比例縮放或者將額度也作為連續(xù)決策變量。目標(biāo)函數(shù)最大化總期望收益。Maximize: Σ [ x_i * Limit_i * Interest_Rate_i * (1 - PD_i) - x_i * Limit_i * PD_i * LGD ]解釋收益部分是企業(yè)正常還款時(shí)銀行獲得的利息本金×利率×1-違約概率損失部分是違約時(shí)銀行損失的本金本金×違約概率×違約損失率。約束條件預(yù)算約束Σ (x_i * Limit_i) 總預(yù)算1e8。風(fēng)險(xiǎn)分散約束可選對單一行業(yè)或地區(qū)的貸款總額設(shè)置上限避免過度集中。決策變量約束x_i 為0或1。6.2 求解方法精確求解對于123個(gè)0-1變量使用專業(yè)的優(yōu)化求解器如PuLP調(diào)用CBC或ortools可以在可接受時(shí)間內(nèi)求得最優(yōu)解。啟發(fā)式算法如果問題規(guī)模更大或約束更復(fù)雜可以使用遺傳算法、模擬退火等啟發(fā)式算法尋找近似最優(yōu)解。這在競賽中也是展示能力的好機(jī)會(huì)。6.3 Python實(shí)現(xiàn)示例使用PuLP庫import pulp # 假設(shè) df 是包含了所有企業(yè)信息的DataFrame包含列企業(yè)ID, Limit, Interest_Rate, PD, Industry # 設(shè)定違約損失率 LGD 0.5 TOTAL_BUDGET 1e8 # 創(chuàng)建問題 prob pulp.LpProblem(Credit_Portfolio_Optimization, pulp.LpMaximize) # 創(chuàng)建決策變量 x pulp.LpVariable.dicts(x, df[企業(yè)ID].tolist(), lowBound0, upBound1, catBinary) # 設(shè)置目標(biāo)函數(shù) # 期望收益 利息收入 * (1-PD) - 預(yù)期損失 prob pulp.lpSum([x[idx] * df.loc[idx, Limit] * (df.loc[idx, Interest_Rate] * (1 - df.loc[idx, PD]) - df.loc[idx, PD] * LGD) for idx in df.index]) # 添加預(yù)算約束 prob pulp.lpSum([x[idx] * df.loc[idx, Limit] for idx in df.index]) TOTAL_BUDGET # 可選添加行業(yè)分散約束例如每個(gè)行業(yè)貸款不超過總預(yù)算的30% industry_list df[Industry].unique() for industry in industry_list: industry_companies df[df[Industry] industry].index prob pulp.lpSum([x[idx] * df.loc[idx, Limit] for idx in industry_companies]) 0.3 * TOTAL_BUDGET # 求解問題 solver pulp.PULP_CBC_CMD(msgFalse) # 使用CBC求解器不輸出日志 prob.solve(solver) # 輸出結(jié)果 print(pulp.LpStatus[prob.status]) if pulp.LpStatus[prob.status] Optimal: df[Decision] [pulp.value(x[idx]) for idx in df.index] selected_companies df[df[Decision] 1] total_investment selected_companies[Limit].sum() expected_profit pulp.value(prob.objective) print(f最優(yōu)解找到) print(f共向 {len(selected_companies)} 家企業(yè)放貸。) print(f總投資額{total_investment:.2f} 元) print(f期望總收益{expected_profit:.2f} 元) print(selected_companies[[企業(yè)ID, Limit, Interest_Rate, PD]].head())7. 論文寫作核心要點(diǎn)與代碼整合對于數(shù)學(xué)建模競賽論文是最終呈現(xiàn)的載體。再好的模型如果表達(dá)不清也會(huì)大打折扣。7.1 論文結(jié)構(gòu)建議摘要重中之重用一段話精煉概括問題、你的思路、所用模型方法、主要結(jié)果和結(jié)論。務(wù)必包含關(guān)鍵數(shù)字如AUC值、最終分配企業(yè)數(shù)、總期望收益。問題重述與分析用自己的語言梳理題目要求明確要解決的幾個(gè)子問題并分析難點(diǎn)。模型假設(shè)與符號(hào)說明列出合理的、簡化問題的假設(shè)。清晰定義文中用到的主要符號(hào)。模型建立與求解這是論文主體。對應(yīng)我們之前的思路分節(jié)闡述數(shù)據(jù)預(yù)處理與特征工程信用評分模型附上模型評估結(jié)果如AUC曲線、KS值表風(fēng)險(xiǎn)定價(jià)與額度測算模型信貸資產(chǎn)組合優(yōu)化模型附上優(yōu)化結(jié)果表格模型檢驗(yàn)與靈敏度分析展示模型的穩(wěn)健性。例如改變信用評分模型的參數(shù)如XGBoost的樹深度觀察AUC變化。改變定價(jià)公式中的α系數(shù)觀察利率分布和最終收益的變化。改變優(yōu)化模型中的風(fēng)險(xiǎn)分散約束比例分析其對收益和風(fēng)險(xiǎn)集中度的影響。模型評價(jià)與推廣客觀評價(jià)自己模型的優(yōu)缺點(diǎn)并提出改進(jìn)方向如引入更多外部數(shù)據(jù)、考慮宏觀經(jīng)濟(jì)周期等。參考文獻(xiàn)附錄可以放核心代碼的流程圖或部分關(guān)鍵代碼片段。7.2 源代碼整理與提交源代碼是評審時(shí)驗(yàn)證你工作真實(shí)性的關(guān)鍵。務(wù)必做到模塊化將代碼按功能分成多個(gè)腳本或Jupyter Notebook單元如data_preprocessing.pyfeature_engineering.pymodel_training.pyoptimization.py。注釋清晰在每個(gè)函數(shù)和關(guān)鍵步驟旁添加注釋說明其目的??蓮?fù)現(xiàn)在代碼開頭固定隨機(jī)種子np.random.seed(42)random_state42確保每次運(yùn)行結(jié)果一致。提供requirements.txt文件列出所有依賴包及版本。結(jié)果輸出代碼的最后部分應(yīng)能輸出關(guān)鍵結(jié)果如企業(yè)的信用評分、建議利率額度、最終的貸款決策列表并保存為CSV或Excel文件方便在論文中引用。7.3 可視化呈現(xiàn)一圖勝千言。在論文中嵌入高質(zhì)量圖表能極大提升可讀性。數(shù)據(jù)探索企業(yè)銷售額分布直方圖、進(jìn)銷項(xiàng)月度趨勢圖。模型評估ROC曲線圖、特征重要性條形圖對于樹模型。結(jié)果展示企業(yè)信用評分分布圖、利率-風(fēng)險(xiǎn)散點(diǎn)圖、最終貸款組合的行業(yè)分布餅圖或額度分布圖。8. 常見問題與實(shí)戰(zhàn)避坑指南結(jié)合多年指導(dǎo)和評審經(jīng)驗(yàn)以下是參賽隊(duì)伍最容易踩的坑及應(yīng)對策略8.1 數(shù)據(jù)預(yù)處理不當(dāng)問題對異常值處理過于粗暴直接刪除大量數(shù)據(jù)導(dǎo)致樣本代表性失真或?qū)Ξ惓V狄暥灰娮寴O端值主導(dǎo)了模型。對策結(jié)合業(yè)務(wù)常識(shí)進(jìn)行判斷。對于發(fā)票數(shù)據(jù)可以按企業(yè)分組剔除每個(gè)企業(yè)自身歷史交易中極端偏離如超過3個(gè)標(biāo)準(zhǔn)差的記錄而不是全局剔除。對于金額為0或負(fù)值的記錄需區(qū)分是正常退貨還是數(shù)據(jù)錯(cuò)誤。8.2 特征工程缺乏創(chuàng)造力問題只做了簡單的求和、平均沒有挖掘出深層次的時(shí)序模式、網(wǎng)絡(luò)關(guān)系或文本信息。對策多從企業(yè)經(jīng)營的視角思考。除了財(cái)務(wù)指標(biāo)想想企業(yè)的“行為特征”它是不是經(jīng)常在月底集中開票可能資金緊張它的交易對手是分散的還是集中的客戶集中度風(fēng)險(xiǎn)它的銷售增長是線性的還是波動(dòng)的將這些思考轉(zhuǎn)化為可計(jì)算的指標(biāo)。8.3 模型評估指標(biāo)單一問題只匯報(bào)準(zhǔn)確率在不平衡數(shù)據(jù)上得到90%的準(zhǔn)確率就沾沾自喜實(shí)際上模型可能什么都沒學(xué)到。對策必須將AUC-ROC作為核心評估指標(biāo)并同時(shí)匯報(bào)精確率、召回率、F1-score以及在不同閾值下的表現(xiàn)。繪制KS曲線和Lift圖也是加分項(xiàng)。8.4 忽略模型可解釋性與業(yè)務(wù)邏輯問題使用復(fù)雜的深度學(xué)習(xí)模型如神經(jīng)網(wǎng)絡(luò)但無法解釋為什么某個(gè)企業(yè)得分低導(dǎo)致最終的定價(jià)和優(yōu)化方案缺乏說服力。對策優(yōu)先使用可解釋性較強(qiáng)的模型如邏輯回歸、帶特征重要性的樹模型。即使使用復(fù)雜模型也要通過SHAP、LIME等工具進(jìn)行事后解釋確保高風(fēng)險(xiǎn)企業(yè)的低分有其合理的業(yè)務(wù)原因如銷售額驟降、交易對手單一。8.5 優(yōu)化模型脫離實(shí)際問題構(gòu)建的優(yōu)化模型只追求數(shù)學(xué)上的最大收益沒有考慮任何風(fēng)險(xiǎn)分散或監(jiān)管約束得出的方案可能將所有資金貸給一兩個(gè)“看似最優(yōu)”但同屬高風(fēng)險(xiǎn)行業(yè)的企業(yè)。對策務(wù)必在優(yōu)化模型中加入分散化約束如行業(yè)集中度限額、單戶貸款上限基于PD。這不僅是數(shù)學(xué)要求更是金融風(fēng)控的基本常識(shí)。8.6 論文與代碼脫節(jié)問題論文中描述的模型與代碼實(shí)際實(shí)現(xiàn)的模型不一致或者論文中的結(jié)果圖表無法從代碼輸出中復(fù)現(xiàn)。對策寫作論文時(shí)直接引用代碼生成的圖表和結(jié)果文件。保持論文、代碼、數(shù)據(jù)結(jié)果三者嚴(yán)格同步。在提交前用清理后的環(huán)境重新運(yùn)行一遍全部代碼確保能生成論文中的所有結(jié)果。這道2020年的國賽C題是一個(gè)經(jīng)典的、麻雀雖小五臟俱全的數(shù)據(jù)科學(xué)和金融風(fēng)控實(shí)戰(zhàn)項(xiàng)目。它要求你從一個(gè)具體的業(yè)務(wù)問題出發(fā)走過完整的數(shù)據(jù)分析、建模、決策全流程。解決它的過程本身就是一次絕佳的能力訓(xùn)練。希望這份超過5000字的拆解能為你提供一份清晰的“作戰(zhàn)地圖”。真正的提升還是需要你親手去處理數(shù)據(jù)、調(diào)試代碼、撰寫論文。當(dāng)你完整地走完這一遍你所收獲的將不僅僅是一個(gè)競賽答案而是一套解決同類復(fù)雜決策問題的結(jié)構(gòu)化思維和方法論。本文還有配套的精品資源點(diǎn)擊獲取