信用评分卡模型开发及评估指标
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
一、信用風(fēng)險(xiǎn)評(píng)級(jí)模型的類型
信用風(fēng)險(xiǎn)計(jì)量體系包括主體評(píng)級(jí)模型和債項(xiàng)評(píng)級(jí)兩部分。主體評(píng)級(jí)和債項(xiàng)評(píng)級(jí)均有一系列評(píng)級(jí)模型組成,其中主體評(píng)級(jí)模型可用“四張卡”來表示,分別是A卡、B卡、C卡和F卡;債項(xiàng)評(píng)級(jí)模型通常按照主體的融資用途,分為企業(yè)融資模型、現(xiàn)金流融資模型和項(xiàng)目融資模型等。 A卡,又稱為申請(qǐng)者評(píng)級(jí)模型,主要應(yīng)用于相關(guān)融資類業(yè)務(wù)中新用戶的主體評(píng)級(jí),適用于個(gè)人和機(jī)構(gòu)融資主體。 B卡,又稱為行為評(píng)級(jí)模型,主要應(yīng)用于相關(guān)融資類業(yè)務(wù)中存量客戶在續(xù)存期內(nèi)的管理,如對(duì)客戶可能出現(xiàn)的逾期、延期等行為進(jìn)行預(yù)測(cè),僅適用于個(gè)人融資主體。 C卡,又稱為催收評(píng)級(jí)模型,主要應(yīng)用于相關(guān)融資類業(yè)務(wù)中存量客戶是否需要催收的預(yù)測(cè)管理,僅適用于個(gè)人融資主體。 F卡,又稱為欺詐評(píng)級(jí)模型,主要應(yīng)用于相關(guān)融資類業(yè)務(wù)中新客戶可能存在的欺詐行為的預(yù)測(cè)管理,適用于個(gè)人和機(jī)構(gòu)融資主體。 我們主要討論主體評(píng)級(jí)模型的開發(fā)過程。
二、信用風(fēng)險(xiǎn)評(píng)級(jí)模型開發(fā)流程概述
典型的評(píng)級(jí)模型開發(fā)流程如圖2.1所示。該流程中各個(gè)步驟的順序可根據(jù)具體情況的不同進(jìn)行適當(dāng)調(diào)整,也可以根據(jù)需要重復(fù)某些步驟。 信用風(fēng)險(xiǎn)評(píng)級(jí)模型的主要開發(fā)流程如下: (1) 數(shù)據(jù)獲取,包括獲取存量客戶及潛在客戶的數(shù)據(jù)。存量客戶是指已經(jīng)在證券公司開展相關(guān)融資類業(yè)務(wù)的客戶,包括個(gè)人客戶和機(jī)構(gòu)客戶;潛在客戶是指未來擬在證券公司開展相關(guān)融資類業(yè)務(wù)的客戶,主要包括機(jī)構(gòu)客戶,這也是解決證券業(yè)樣本較少的常用方法,這些潛在機(jī)構(gòu)客戶包括上市公司、公開發(fā)行債券的發(fā)債主體、新三板上市公司、區(qū)域股權(quán)交易中心掛牌公司、非標(biāo)融資機(jī)構(gòu)等。 (2) EDA(探索性數(shù)據(jù)分析)與數(shù)據(jù)描述,該步驟主要是獲取樣本總體的大概情況,以便制定樣本總體的數(shù)據(jù)預(yù)處理方法。描述樣本總體情況的指標(biāo)主要有缺失值情況、異常值情況、平均值、中位數(shù)、最大值、最小值、分布情況等。 (3) 數(shù)據(jù)預(yù)處理,主要工作包括數(shù)據(jù)清洗、缺失值處理、異常值處理,主要是為了將獲取的原始數(shù)據(jù)轉(zhuǎn)化為可用作模型開發(fā)的格式化數(shù)據(jù)。 (4) 變量選擇,該步驟主要是通過統(tǒng)計(jì)學(xué)的方法,篩選出對(duì)違約狀態(tài)影響最顯著的指標(biāo)。 (5) 模型開發(fā),該步驟主要包括變量分段、變量的WOE(證據(jù)權(quán)重)變換和邏輯回歸估算三部分。 (6) 主標(biāo)尺與模型驗(yàn)證,該步驟主要是開發(fā)某類主體的主標(biāo)尺并進(jìn)行模型的驗(yàn)證與校準(zhǔn)。 (7) 模型評(píng)估,該步驟主要是根據(jù)模型驗(yàn)證和主標(biāo)尺設(shè)計(jì)的結(jié)果,評(píng)估模型的區(qū)分能力、預(yù)測(cè)能力、穩(wěn)定性,并形成模型評(píng)估報(bào)告,得出模型是否可以使用的結(jié)論。 (8) 模型實(shí)施,即模型的部署和應(yīng)用。 (9) 監(jiān)測(cè)與報(bào)告,該步驟主要工作是定期檢測(cè)模型的使用情況,并關(guān)注和定期檢驗(yàn)?zāi)P偷膮^(qū)分能力與預(yù)測(cè)能力的變化及模型穩(wěn)定性的變化,在出現(xiàn)模型可能不能滿足業(yè)務(wù)需求的情況時(shí),反饋至模型開發(fā)團(tuán)隊(duì),及時(shí)進(jìn)行模型更新或重新開發(fā)。
圖2.1 評(píng)級(jí)模型開發(fā)流程
三、基于Logistic回歸的標(biāo)準(zhǔn)評(píng)分卡模型開發(fā)實(shí)現(xiàn)
3.1 明確要解決的問題
在開發(fā)信用風(fēng)險(xiǎn)評(píng)級(jí)模型(包括個(gè)人和機(jī)構(gòu))之前,首先要明確我們需要解決的問題。因?yàn)?#xff0c;個(gè)人信用風(fēng)險(xiǎn)評(píng)級(jí)模型包括申請(qǐng)者評(píng)級(jí)、行為評(píng)級(jí)、催收評(píng)級(jí)、欺詐評(píng)級(jí)等幾類,開發(fā)每一類評(píng)級(jí)模型所需要的數(shù)據(jù)也是不同的,例如開發(fā)個(gè)人申請(qǐng)者評(píng)級(jí)模型需要的是個(gè)人客戶申請(qǐng)融資類業(yè)務(wù)時(shí)提交的數(shù)據(jù),開發(fā)個(gè)人行為評(píng)級(jí)模型需要的是存量個(gè)人客戶的歷史行為數(shù)據(jù),這兩部分?jǐn)?shù)據(jù)及需要解決的問題,也存在較大的差異。因此,在開發(fā)信用風(fēng)險(xiǎn)評(píng)級(jí)模型之前,我們需要明確開發(fā)模型的類型。此處以開發(fā)個(gè)人客戶的申請(qǐng)者評(píng)級(jí)模型為例,來詳細(xì)講述此類模型的開發(fā)過程。 開發(fā)申請(qǐng)者評(píng)分模型所需要的數(shù)據(jù)是個(gè)人客戶申請(qǐng)融資類業(yè)務(wù)時(shí)所需的數(shù)據(jù),包括反映個(gè)人還款意愿的定性數(shù)據(jù),應(yīng)用申請(qǐng)者評(píng)分模型的目的是預(yù)測(cè)該申請(qǐng)客戶在未來一段時(shí)間發(fā)生違約的概率。 我們做預(yù)測(cè)模型的一個(gè)基本原理是用歷史數(shù)據(jù)來預(yù)測(cè)未來,申請(qǐng)者評(píng)分模型需要解決的問題是未來一段時(shí)間(如12個(gè)月)融資人出現(xiàn)違約(如至少一次90天或90天以上逾期)的概率。在這個(gè)需求中,“未來一段時(shí)間”為表現(xiàn)時(shí)間窗口(performance window),“融資人出現(xiàn)至少一次90天或90天以上逾期”為觀察時(shí)間窗口(sample window)。個(gè)人主體的違約跟個(gè)人行為習(xí)慣有很大的相關(guān)性,因此我們可以通過分析個(gè)人樣本總體中客戶的歷史我違約頻率來確定表現(xiàn)時(shí)間窗口和觀察時(shí)間窗口。這兩個(gè)窗口的確定對(duì)于我們要解決的問題,有著非常重要的影響,我們將放在第二步中結(jié)合具體的數(shù)據(jù)來分析,并講述具體的確定方法。
3.2 數(shù)據(jù)描述和探索性數(shù)據(jù)分析
數(shù)據(jù)準(zhǔn)備和數(shù)據(jù)預(yù)處理是整個(gè)信用風(fēng)險(xiǎn)模型開發(fā)過程中最重要也是最耗時(shí)的工作了。通常情況下,數(shù)據(jù)準(zhǔn)備和數(shù)據(jù)預(yù)處理階段消耗的時(shí)間占整個(gè)模型開發(fā)時(shí)間的80%以上,該階段主要的工作包括數(shù)據(jù)獲取、探索性數(shù)據(jù)分析、缺失值處理、數(shù)據(jù)校準(zhǔn)、數(shù)據(jù)抽樣、數(shù)據(jù)轉(zhuǎn)換,還包括離散變量的降維、連續(xù)變量的優(yōu)先分段等工作。 明確了要解決的問題后,接下來我們就要搜集相關(guān)的數(shù)據(jù)了。此處,我們以互聯(lián)網(wǎng)上經(jīng)常被用來研究信用風(fēng)險(xiǎn)評(píng)級(jí)模型的加州大學(xué)機(jī)器學(xué)習(xí)數(shù)據(jù)庫中的german credit data為例,來詳細(xì)講述個(gè)人客戶信用風(fēng)險(xiǎn)評(píng)級(jí)模型的開發(fā)方法。 German credit data 的數(shù)據(jù)來自”klaR”包
install.packages(“klaR”) library(“klaR”) data(GermanCredit) View(GermanCredit) #查看該數(shù)據(jù)集該數(shù)據(jù)集包含了1000個(gè)樣本,每個(gè)樣本包括了21個(gè)變量(屬性),其中包括1個(gè)違約狀態(tài)變量“credit_risk”,剩余20個(gè)變量包括了所有的定量和定性指標(biāo),分別如表3.1所示。
接下來,我們需要檢查數(shù)據(jù)的質(zhì)量,主要包括缺失值情況、異常值情況及其他處理方法。缺失值和異常值處理的基本原則是處理前后的分布總體保持一致。
3.21 用戶數(shù)據(jù)的缺失值處理:
http://blog.csdn.net/lll1528238733/article/details/76599626
3.22 用戶數(shù)據(jù)的異常值處理:
http://blog.csdn.net/lll1528238733/article/details/76599792
需要特別說明的是,在實(shí)際的樣本搜集和數(shù)據(jù)預(yù)處理中,我們應(yīng)該首先對(duì)個(gè)人客戶的違約做出定義,并根據(jù)對(duì)違約的定義對(duì)搜集的樣本進(jìn)行必要的校準(zhǔn)。一般情況下,我們搜集的數(shù)據(jù)為非標(biāo)準(zhǔn)化的數(shù)據(jù),如表3.2所示,該表中假設(shè)搜集的是前10個(gè)客戶在兩年內(nèi)的歷史違約情況。
在表3.2所示的數(shù)據(jù)集中,如果我們假設(shè)連續(xù)出現(xiàn)三個(gè)月逾期可被定義為違約,則客戶6至客戶9可被確認(rèn)為違約。然而,為了明確違約的概念,我們還需要確定基準(zhǔn)時(shí)間和觀察時(shí)間窗口。如果當(dāng)前時(shí)間是2016年7月末,則只有6和7兩個(gè)客戶為違約,其他客戶均屬于正常客戶,如果當(dāng)前時(shí)間是2016年9月末,則只有6、7、8三個(gè)客戶為違約,客戶9已經(jīng)自愈,則再次變成正常客戶。 結(jié)合上述分析,在明確評(píng)分卡要解決的實(shí)際問題時(shí),還應(yīng)該確定表現(xiàn)時(shí)間窗口和觀察時(shí)間窗口,而這兩個(gè)窗口的確定,需要根據(jù)我們搜集的數(shù)據(jù)來具體確定。他們的確定方法,分別如下: 在確定變現(xiàn)時(shí)間窗口的長度時(shí),我們通常需要客戶從開始開立融資類業(yè)務(wù)時(shí)到最近時(shí)間點(diǎn)(或至少兩年以上的歷史逾期情況)的逾期表現(xiàn),用圖形表示,如圖3.7所示。
按照?qǐng)D3.7所示的表現(xiàn)時(shí)間窗口的定義方法,我們對(duì)樣本總體進(jìn)行統(tǒng)計(jì)分析,以逾期90天定義為違約,會(huì)得出表3.3所示的統(tǒng)計(jì)結(jié)果。
表3.3中8月最后一列數(shù)據(jù)3.48%表示,2.1日開立的所有賬戶中,8個(gè)月后出現(xiàn)逾期90天以上的賬戶占樣本的比重為3.48%。我們通過這樣統(tǒng)計(jì)方法,并繪制樣本總體的違約狀態(tài)變化曲線,即可得到如圖3.8所示的曲線。從圖3.8所示的曲線中我們可以看出,在賬戶開立第11個(gè)月到第13個(gè)月時(shí),客戶的違約狀態(tài)達(dá)到穩(wěn)定狀態(tài),曲線變得非常平穩(wěn)。此時(shí),我們可以確定評(píng)分卡的表現(xiàn)時(shí)間窗口為11個(gè)月到13個(gè)月,即我們將違約狀態(tài)變得穩(wěn)定的時(shí)間段確定為表現(xiàn)時(shí)間窗口。這種方法可使我們開發(fā)的評(píng)分卡模型的區(qū)分能力和預(yù)測(cè)能力準(zhǔn)確性均達(dá)到最優(yōu)穩(wěn)定狀態(tài)。
由圖3.8的曲線可以看出,客戶開立融資類業(yè)務(wù)的賬戶的起始階段發(fā)生違約的頻率是不斷增多的,但隨著時(shí)間的推移發(fā)生違約的客戶的占比處于穩(wěn)定狀態(tài)。那么,我們?cè)陂_發(fā)信用風(fēng)險(xiǎn)評(píng)分卡模型時(shí),需要選擇客戶違約處于穩(wěn)定狀態(tài)的時(shí)間點(diǎn)來作為最優(yōu)表現(xiàn)時(shí)間窗口,這樣既可以最大限度地降低模型的不穩(wěn)定性,也可以避免低估最終的違約樣本的比率。例如,當(dāng)我們選擇表現(xiàn)時(shí)間窗口為6個(gè)月時(shí),樣本總體中的違約樣本占比僅為3%左右,而實(shí)際違約樣本占比約為4.5%。 上例中,觀察時(shí)間窗口我們確定為90天,當(dāng)然也可以是60天或30天,但當(dāng)觀察時(shí)間窗口確定為30天時(shí),客戶的違約狀態(tài)將會(huì)更快地達(dá)到穩(wěn)定狀態(tài)。如果我們按照某個(gè)監(jiān)管協(xié)議(如巴塞爾協(xié)議)的要求開發(fā)信用風(fēng)險(xiǎn)評(píng)分卡模型,則觀察時(shí)間窗口也要按照監(jiān)管協(xié)議的要求確定。除此之外,觀察時(shí)間窗口的確定要根據(jù)樣本總體和證券公司的風(fēng)險(xiǎn)偏好綜合考慮確定。但在個(gè)人信用風(fēng)險(xiǎn)評(píng)級(jí)模型開發(fā)領(lǐng)域,大多數(shù)將逾期90天及以上定義為個(gè)人客戶的違約狀態(tài)。 以上講的都是開發(fā)申請(qǐng)者評(píng)分卡模型時(shí)表現(xiàn)時(shí)間窗口的確定方法,在開發(fā)個(gè)人客戶的行為評(píng)分卡和催收評(píng)分卡模型時(shí),表現(xiàn)時(shí)間窗口的確定方法也算是類似的。但開發(fā)這兩類模型時(shí),表現(xiàn)時(shí)間窗口的長度卻跟申請(qǐng)者評(píng)分模型有較大不同,如催收評(píng)分卡模型的表現(xiàn)時(shí)間窗口通常設(shè)定為2周,甚至更短的時(shí)間。因?yàn)閷?shí)際業(yè)務(wù)開展過程中,通常客戶逾期超過2周,就要啟動(dòng)催收程序了。 個(gè)人客戶的信用風(fēng)險(xiǎn)評(píng)級(jí)模型開發(fā)進(jìn)行至此時(shí),我們已經(jīng)得到了沒有缺失值和異常值的樣本總體,違約的定義確定了,表現(xiàn)時(shí)間窗口和觀察時(shí)間窗口也確定了。接下來,我們將進(jìn)入評(píng)分卡模型開發(fā)的第三步數(shù)據(jù)集準(zhǔn)備階段了。
3.3 數(shù)據(jù)集準(zhǔn)備
在缺失值和處理完成后,我們就得到了可用作信用風(fēng)險(xiǎn)評(píng)級(jí)模型開發(fā)的樣本總體。通常為了驗(yàn)證評(píng)級(jí)模型的區(qū)分能力和預(yù)測(cè)準(zhǔn)確性,我們需要將樣本總體分為樣本集和測(cè)試集,這種分類方法被稱為樣本抽樣。常用的樣本抽樣方法包括簡單隨機(jī)抽樣、分層抽樣和整群抽樣三種。
數(shù)據(jù)集準(zhǔn)備: http://blog.csdn.net/lll1528238733/article/details/76599861
3.4 變量篩選
模型開發(fā)的前三步主要講的是數(shù)據(jù)處理的方法,從第四步開始我們將逐步講述模型開發(fā)的方法。在進(jìn)行模型開發(fā)時(shí),并非我們收集的每個(gè)指標(biāo)都會(huì)用作模型開發(fā),而是需要從收集的所有指標(biāo)中篩選出對(duì)違約狀態(tài)影響最大的指標(biāo),作為入模指標(biāo)來開發(fā)模型。接下來,我們將分別介紹定量指標(biāo)和定性指標(biāo)的篩選方法。
3.41 定量指標(biāo)的篩選方法
http://blog.csdn.net/lll1528238733/article/details/76600019
3.42 定性指標(biāo)的篩選方法
http://blog.csdn.net/lll1528238733/article/details/76600147
3.5 WOE值計(jì)算
對(duì)入模的定量和定性指標(biāo),分別進(jìn)行連續(xù)變量分段(對(duì)定量指標(biāo)進(jìn)行分段),以便于計(jì)算定量指標(biāo)的WOE和對(duì)離散變量進(jìn)行必要的降維。對(duì)連續(xù)變量的分段方法通常分為等距分段和最優(yōu)分段兩種方法。等距分段是指將連續(xù)變量分為等距離的若干區(qū)間,然后在分別計(jì)算每個(gè)區(qū)間的WOE值。最優(yōu)分段是指根據(jù)變量的分布屬性,并結(jié)合該變量對(duì)違約狀態(tài)變量預(yù)測(cè)能力的變化,按照一定的規(guī)則將屬性接近的數(shù)值聚在一起,形成距離不相等的若干區(qū)間,最終得到對(duì)違約狀態(tài)變量預(yù)測(cè)能力最強(qiáng)的最優(yōu)分段。 我們首先選擇對(duì)連續(xù)變量進(jìn)行最優(yōu)分段,在連續(xù)變量的分布不滿足最優(yōu)分段的要求時(shí),在考慮對(duì)連續(xù)變量進(jìn)行等距分段。此處,我們講述的連續(xù)變量最優(yōu)分段算法是基于條件推理樹(conditional inference trees, Ctree)的遞歸分割算法,其基本原理是根據(jù)自變量的連續(xù)分布與因變量的二元分布之間的關(guān)系,采用遞歸的回歸分析方法,逐層遞歸滿足給定的顯著性水平,此時(shí)獲取的分段結(jié)果(位于Ctree的葉節(jié)點(diǎn)上)即為連續(xù)變量的最優(yōu)分段。其核心算法用函數(shù)ctree()表示。
評(píng)分卡模型開發(fā)-WOE值計(jì)算: http://blog.csdn.net/lll1528238733/article/details/76600598
3.6 基于邏輯回歸的標(biāo)準(zhǔn)評(píng)分卡實(shí)現(xiàn)
由邏輯回歸的基本原理,我們將客戶違約的概率表示為p,則正常的概率為1-p。因此,可以得到:
此時(shí),客戶違約的概率p可表示為:
評(píng)分卡設(shè)定的分值刻度可以通過將分值表示為比率對(duì)數(shù)的線性表達(dá)式來定義,即可表示為下式:
其中,A和B是常數(shù)。式中的負(fù)號(hào)可以使得違約概率越低,得分越高。通常情況下,這是分值的理想變動(dòng)方向,即高分值代表低風(fēng)險(xiǎn),低分值代表高風(fēng)險(xiǎn)。 邏輯回歸模型計(jì)算比率如下所示:
其中,用建模參數(shù)擬合模型可以得到模型參數(shù)β0,β1,…,βn。β_0,β_1,…,β_n。 式中的常數(shù)A、B的值可以通過將兩個(gè)已知或假設(shè)的分值帶入計(jì)算得到。通常情況下,需要設(shè)定兩個(gè)假設(shè): (1)給某個(gè)特定的比率設(shè)定特定的預(yù)期分值; (2)確定比率翻番的分?jǐn)?shù)(PDO) 根據(jù)以上的分析,我們首先假設(shè)比率為x的特定點(diǎn)的分值為P。則比率為2x的點(diǎn)的分值應(yīng)該為P+PDO。代入式中,可以得到如下兩個(gè)等式:
假設(shè) 設(shè)定評(píng)分卡刻度使得比率為{1:20}(違約正常比)時(shí)的分值為50分,PDO為10分,代入式中求得:B=14.43,A=6.78 則分值的計(jì)算公式可表示為:
評(píng)分卡刻度參數(shù)A和B確定以后,就可以計(jì)算比率和違約概率,以及對(duì)應(yīng)的分值了。通常將常數(shù)A稱為補(bǔ)償,常數(shù)B稱為刻度。 則評(píng)分卡的分值可表達(dá)為:
式中:變量x1…xnx_1…x_n是出現(xiàn)在最終模型中的自變量,即為入模指標(biāo)。由于此時(shí)所有變量都用WOE轉(zhuǎn)換進(jìn)行了轉(zhuǎn)換,可以將這些自變量中的每一個(gè)都寫(βiωij)δij(β_i ω_{ij} ) δ_{ij}的形式:
式中ωijω_{ij} 為第i行第j個(gè)變量的WOE,為已知變量;βiβ_i為邏輯回歸方程中的系數(shù),為已知變量;δijδ_{ij}為二元變量,表示變量i是否取第j個(gè)值。上式可重新表示為:
此式即為最終評(píng)分卡公式。如果x1…xnx_1…x_n變量取不同行并計(jì)算其WOE值,式中表示的標(biāo)準(zhǔn)評(píng)分卡格式,如表3.20所示: 表3.20表明,變量x1有k1行,變量x2有k2行x_1有k_1 行,變量x_2有k_2行,以此類推;基礎(chǔ)分值等于(A?Bβ0)(A-Bβ_0 );由于分值分配公式中的負(fù)號(hào),模型參數(shù)β0,β1,…,βnβ_0,β_1,…,β_n也應(yīng)該是負(fù)值;變量xix_i的第j行的分值取決于以下三個(gè)數(shù)值:
(1)刻度因子B; (2)邏輯回歸方程的參數(shù)βiβ_i; (3)該行的WOE值,ωijω_{ij} 綜上,我們?cè)敿?xì)講述了模型開發(fā)及生成標(biāo)準(zhǔn)評(píng)分卡各步驟的處理結(jié)果,自動(dòng)生成標(biāo)準(zhǔn)評(píng)分卡的R完整代碼:
library(klaR) library(InformationValue) data(GermanCredit) train_kfold<-sample(nrow(GermanCredit),800,replace = F) train_kfolddata<-GermanCredit[train_kfold,] #提取樣本數(shù)據(jù)集 test_kfolddata<-GermanCredit[-train_kfold,] #提取測(cè)試數(shù)據(jù)集 credit_risk<-ifelse(train_kfolddata[,"credit_risk"]=="good",0,1) #將違約樣本用“1”表示,正常樣本用“0”表示。 tmp<-train_kfolddata[,-21] data<-cbind(tmp,credit_risk) quant_vars<-c("duration","amount","installment_rate","present_residence","age","number_credits","people_liable","credit_risk")#獲取定量指標(biāo) quant_GermanCredit<-data[,quant_vars] #提取定量指標(biāo)#逐步回歸法,獲取自變量中對(duì)違約狀態(tài)影響最顯著的指標(biāo) base.mod<-lm(credit_risk~1,data = quant_GermanCredit) #獲取線性回歸模型的截距 all.mod<-lm(credit_risk~.,data = quant_GermanCredit) #獲取完整的線性回歸模型 stepMod<-step(base.mod,scope = list(lower=base.mod,upper=all.mod),direction = "both",trace = 0,steps = 1000) #采用雙向逐步回歸法,篩選變量 shortlistedVars<-names(unlist(stepMod[[1]])) #獲取逐步回歸得到的變量列表 shortlistedVars<-shortlistedVars[!shortlistedVars %in%"(Intercept)"] #刪除逐步回歸的截距 print(shortlistedVars) #輸出逐步回歸后得到的變量 quant_model_vars<-c("duration","amount","installment_rate","age") #完成定量入模指標(biāo) #提取數(shù)據(jù)集中全部的定性指標(biāo) factor_vars<-c("status","credit_history","purpose","savings","employment_duration","personal_status_sex","other_debtors","property","other_installment_plans","housing","job","telephone","foreign_worker")#獲取所有名義變量 all_iv<-data.frame(VARS=factor_vars,IV=numeric(length(factor_vars)),STRENGTH=character(length(factor_vars)),stringsAsFactors = F)#初始化待輸出的數(shù)據(jù)框 for(factor_var in factor_vars) {all_iv[all_iv$VARS==factor_var,"IV"]<-InformationValue::IV(X=data[,factor_var],Y=data$credit_risk) #計(jì)算每個(gè)指標(biāo)的IV值all_iv[all_iv$VARS==factor_var,"STRENGTH"]<-attr(InformationValue::IV(X=data[,factor_var],Y=data$credit_risk),"howgood") #提取每個(gè)IV指標(biāo)的描述 } all_iv<-all_iv[order(-all_iv$IV),] #排序IV qual_model_vars<-subset(all_iv,STRENGTH=="Highly Predictive")[1:5,] qual_model_vars<-c("status","credit_history","savings","purpose","property")#連續(xù)變量分段和離散變量降維 #1.變量duration library(smbinning) result<-smbinning(df=data,y="credit_risk",x="duration",p=0.05) result$ivtableduration_Cutpoint<-c() duration_WoE<-c() duration<-data[,"duration"] for(i in 1:length(duration)) {if(duration[i]<=8){duration_Cutpoint[i]<-"<= 8"duration_WoE[i]<--1.5670}if(duration[i]<=33&duration[i]>8){duration_Cutpoint[i]<-"<= 33"duration_WoE[i]<--0.0924}if(duration[i]> 33){duration_Cutpoint[i]<-"> 33"duration_WoE[i]<-0.7863} } #2.變量amount result<-smbinning(df=data,y="credit_risk",x="amount",p=0.05) result$ivtable amount_Cutpoint<-c() amount_WoE<-c() amount<-data[,"amount"] for(i in 1:length(amount)) {if(amount[i]<= 3913){amount_Cutpoint[i]<-"<= 3913"amount_WoE[i]<--0.2536}if(amount[i]<= 9283&amount[i]> 3913){amount_Cutpoint[i]<-"<= 9283"amount_WoE[i]<-0.4477}if(amount[i]> 9283){amount_Cutpoint[i]<-"> 9283"amount_WoE[i]<-1.3109} } #3.變量age result<-smbinning(df=data,y="credit_risk",x="age",p=0.05) result$ivtable age_Cutpoint<-c() age_WoE<-c() age<-data[,"age"] for(i in 1:length(age)) {if(age[i]<= 34){age_Cutpoint[i]<-"<= 34"age_WoE[i]<-0.2279}if(age[i] > 34){age_Cutpoint[i]<-" > 34"age_WoE[i]<--0.3059} } #4.變量installment_rate等距分段 install_data<-data[,c("installment_rate","credit_risk")] tb1<-table(install_data) total<-list() for(i in 1:nrow(tb1)) {total[i]<-sum(tb1[i,]) } t.tb1<-cbind(tb1,total) goodrate<-as.numeric(t.tb1[,"0"])/as.numeric(t.tb1[,"total"]) badrate<-as.numeric(t.tb1[,"1"])/as.numeric(t.tb1[,"total"]) gb.tbl<-cbind(t.tb1,goodrate,badrate) Odds<-goodrate/badrate LnOdds<-log(Odds) tt.tb1<-cbind(gb.tbl,Odds,LnOdds) WoE<-log((as.numeric(tt.tb1[,"0"])/700)/(as.numeric(tt.tb1[,"1"])/300)) all.tb1<-cbind(tt.tb1,WoE) all.tb1 installment_rate_Cutpoint<-c() installment_rate_WoE<-c() installment_rate<-data[,"installment_rate"] for(i in 1:length(installment_rate)) {if(installment_rate[i]==1){installment_rate_Cutpoint[i]<-"=1"installment_rate_WoE[i]<-0.06252036}if(installment_rate[i]==2){installment_rate_Cutpoint[i]<-"=2"installment_rate_WoE[i]<-0.1459539}if(installment_rate[i]==3){installment_rate_Cutpoint[i]<-"=3"installment_rate_WoE[i]<--0.03937517}if(installment_rate[i]==4){installment_rate_Cutpoint[i]<-"=4"installment_rate_WoE[i]<--0.1657562} } #定性指標(biāo)的降維和WoE discrete_data<-data[,c("status","credit_history","savings","purpose","property","credit_risk")] summary(discrete_data) #對(duì)purpose指標(biāo)進(jìn)行降維 x<-discrete_data[,c("purpose","credit_risk")] d<-as.matrix(x) for(i in 1:nrow(d)) {#合并car(new)、car(used)if(as.character(d[i,"purpose"])=="car (new)") {d[i,"purpose"]<-as.character("car(new/used)")}if(as.character(d[i,"purpose"])=="car (used)"){d[i,"purpose"]<-as.character("car(new/used)")}#合并radio/television、furniture/equipmentif(as.character(d[i,"purpose"])=="radio/television") {d[i,"purpose"]<-as.character("radio/television/furniture/equipment")}if(as.character(d[i,"purpose"])=="furniture/equipment"){d[i,"purpose"]<-as.character("radio/television/furniture/equipment")}#合并others、repairs、businessif(as.character(d[i,"purpose"])=="others"){d[i,"purpose"]<-as.character("others/repairs/business")}if(as.character(d[i,"purpose"])=="repairs"){d[i,"purpose"]<-as.character("others/repairs/business")}if(as.character(d[i,"purpose"])=="business"){d[i,"purpose"]<-as.character("others/repairs/business")}#合并retraining、educationif(as.character(d[i,"purpose"])=="retraining"){d[i,"purpose"]<-as.character("retraining/education")}if(as.character(d[i,"purpose"])=="education"){d[i,"purpose"]<-as.character("retraining/education")} }new_data<-cbind(discrete_data[,c(-4,-6)],d) #替換原數(shù)據(jù)集中的“purpose”指標(biāo)的值 woemodel<-woe(credit_risk~.,data = new_data,zeroadj=0.5,applyontrain=TRUE) woemodel$woe #1.status status<-as.matrix(new_data[,"status"]) colnames(status)<-"status" status_WoE<-c() for(i in 1:length(status)) {if(status[i]=="... < 100 DM"){status_WoE[i]<--0.8671300}if(status[i]=="0 <= ... < 200 DM"){status_WoE[i]<--0.4240681}if(status[i]=="... >= 200 DM / salary for at least 1 year"){status_WoE[i]<-0.4129033}if(status[i]=="no checking account"){status_WoE[i]<-1.2237524} } #2.credit_history credit_history<-as.matrix(new_data[,"credit_history"]) colnames(credit_history)<-"credit_history" credit_history_WoE<-c() for(i in 1:length(credit_history)) {if(credit_history[i]=="no credits taken/all credits paid back duly"){credit_history_WoE[i]<--1.53771824}if(credit_history[i]=="all credits at this bank paid back duly"){credit_history_WoE[i]<--1.00079000}if(credit_history[i]=="existing credits paid back duly till now"){credit_history_WoE[i]<--0.09646414}if(credit_history[i]=="delay in paying off in the past"){credit_history_WoE[i]<--0.01996074}if(credit_history[i]=="critical account/other credits existing"){credit_history_WoE[i]<-0.77276102} } #3.savings savings<-as.matrix(new_data[,"savings"]) colnames(savings)<-"savings" savings_WoE<-c() for(i in 1:length(savings)) {if(savings[i]=="... < 100 DM"){savings_WoE[i]<--0.3051490}if(savings[i]=="100 <= ... < 500 DM"){savings_WoE[i]<--0.2267733}if(savings[i]=="500 <= ... < 1000 DM"){savings_WoE[i]<-0.8340112}if(savings[i]=="... >= 1000 DM"){savings_WoE[i]<-1.1739617}if(savings[i]=="unknown/no savings account"){savings_WoE[i]<-0.7938144} } #4.property property<-as.matrix(new_data[,"property"]) colnames(property)<-"property" property_WoE<-c() for(i in 1:length(property)) {if(property[i]=="real estate"){property_WoE[i]<-0.49346566}if(property[i]=="building society savings agreement/life insurance"){property_WoE[i]<--0.16507975}if(property[i]=="car or other"){property_WoE[i]<-0.08054425}if(property[i]=="unknown/no property"){property_WoE[i]<--0.65586969} } #5.purpose purpose<-as.matrix(new_data[,"purpose"]) colnames(purpose)<-"purpose" purpose_WoE<-c() for(i in 1:length(purpose)) {if(purpose[i]=="car(new/used)"){purpose_WoE[i]<--0.11260594}if(purpose[i]=="domestic appliances"){purpose_WoE[i]<-0.53602528}if(purpose[i]=="others/repairs/business"){purpose_WoE[i]<--0.09146793}if(purpose[i]=="radio/television/furniture/equipment"){purpose_WoE[i]<--0.23035114}if(purpose[i]=="retraining/education"){purpose_WoE[i]<--0.43547619} } #入模定量和定性指標(biāo) model_data<-cbind(data[,quant_model_vars],data[,qual_model_vars]) #入模定量和定性指標(biāo)的WOE credit_risk<-as.matrix(data[,"credit_risk"]) colnames(credit_risk)<-"credit_risk" model_data_WOE<-as.data.frame(cbind(duration_WoE,amount_WoE,age_WoE,installment_rate_WoE,status_WoE,credit_history_WoE,savings_WoE,property_WoE,purpose_WoE,credit_risk)) #入模定量和定性指標(biāo)“分段” model_data_Cutpoint<-cbind(duration_Cutpoint,amount_Cutpoint,age_Cutpoint,installment_rate_Cutpoint,status,credit_history,savings,property,purpose) #邏輯回歸 m<-glm(credit_risk~.,data=model_data_WOE,family = binomial()) alpha_beta<-function(basepoints,baseodds,pdo) {beta<-pdo/log(2)alpha<-basepoints+beta*log(baseodds)return(list(alpha=alpha,beta=beta)) } coefficients<-m$coefficients #通過指定特定比率(1/20)的特定分值(50)和比率翻番的分?jǐn)?shù)(10),來計(jì)算評(píng)分卡的系數(shù)alpha和beta x<-alpha_beta(50,0.05,10) #計(jì)算基礎(chǔ)分值 basepoint<-round(x$alpha-x$beta*coefficients[1]) #1.duration_score duration_score<-round(as.matrix(-(model_data_WOE[,"duration_WoE"]*coefficients["duration_WoE"]*x$beta))) colnames(duration_score)<-"duration_score" #2.amount_score amount_score<-round(as.matrix(-(model_data_WOE[,"amount_WoE"]*coefficients["amount_WoE"]*x$beta))) colnames(amount_score)<-"amount_score" #3.age_score age_score<-round(as.matrix(-(model_data_WOE[,"age_WoE"]*coefficients["age_WoE"]*x$beta))) colnames(age_score)<-"age_score" #4.installment_rate_score installment_rate_score<-round(as.matrix(-(model_data_WOE[,"installment_rate_WoE"]*coefficients["installment_rate_WoE"]*x$beta))) colnames(installment_rate_score)<-"installment_rate_score" #5.status_score status_score<-round(as.matrix(-(model_data_WOE[,"status_WoE"]*coefficients["status_WoE"]*x$beta))) colnames(status_score)<-"status_score" #6.credit_history_score credit_history_score<-round(as.matrix(-(model_data_WOE[,"credit_history_WoE"]*coefficients["credit_history_WoE"]*x$beta))) colnames(credit_history_score)<-"credit_history_score" #7.savings_score savings_score<-round(as.matrix(-(model_data_WOE[,"savings_WoE"]*coefficients["savings_WoE"]*x$beta))) colnames(savings_score)<-"savings_score" #8.property_score property_score<-round(as.matrix(-(model_data_WOE[,"property_WoE"]*coefficients["property_WoE"]*x$beta))) colnames(property_score)<-"property_score" #9.purpose_score purpose_score<-round(as.matrix(-(model_data_WOE[,"purpose_WoE"]*coefficients["purpose_WoE"]*x$beta))) colnames(purpose_score)<-"purpose_score" #輸出最終的CSV格式的打分卡 #1.基礎(chǔ)分值 r1<-c("","basepoint",20) m1<-matrix(r1,nrow = 1) colnames(m1)<-c("Basepoint","Basepoint","Score") #2.duration的分值 duration_scoreCard<-cbind(as.matrix(c("Duration","",""),ncol=1),unique(cbind(duration_Cutpoint,duration_score))) #View(duration_scoreCard) #3.amount的分值 amount_scoreCard<-cbind(as.matrix(c("Amount","",""),ncol=1),unique(cbind(amount_Cutpoint,amount_score))) #View(amount_scoreCard) #4.age的分值 age_scoreCard<-cbind(as.matrix(c("Age",""),ncol=1),unique(cbind(age_Cutpoint,age_score))) #View(age_scoreCard) #5.installment_rate的分值 installment_rate_scoreCard<-cbind(as.matrix(c("Installment_rate","","",""),ncol=1),unique(cbind(installment_rate_Cutpoint,installment_rate_score))) #View(installment_rate_scoreCard) #6.status的分值 status_scoreCard<-cbind(as.matrix(c("Status","","",""),ncol=1),unique(cbind(status,status_score))) #View(status_scoreCard) #7.credit_history的分值 credit_history_scoreCard<-cbind(as.matrix(c("Credit_history","","","",""),ncol=1),unique(cbind(credit_history,credit_history_score))) #View(credit_history_scoreCard) #8.savings的分值 savings_scoreCard<-cbind(as.matrix(c("Savings","","","",""),ncol=1),unique(cbind(savings,savings_score))) #View(savings_scoreCard) #9.property的分值 property_scoreCard<-cbind(as.matrix(c("Property","","",""),ncol=1),unique(cbind(property,property_score))) #View(property_scoreCard) #10.purpose的分值 purpose_scoreCard<-cbind(as.matrix(c("Purpose","","","",""),ncol=1),unique(cbind(purpose,purpose_score))) #View(purpose_scoreCard) scoreCard_CSV<-rbind(m1,duration_scoreCard,amount_scoreCard,age_scoreCard,installment_rate_scoreCard,status_scoreCard,credit_history_scoreCard,savings_scoreCard,property_scoreCard,purpose_scoreCard) #將標(biāo)準(zhǔn)評(píng)分卡輸出到項(xiàng)目文件中,且命名為ScoreCard.CSV,調(diào)整格式即可得到標(biāo)準(zhǔn)評(píng)分卡 write.csv(scoreCard_CSV,"C:/Users/ZL/Desktop/creditcard_model/ScoreCard.CSV")需要特別說明的是,上述開發(fā)的信用風(fēng)險(xiǎn)評(píng)級(jí)模型只包含定量和定性兩部分,在實(shí)際的使用中還要充分考慮到信用風(fēng)險(xiǎn)的特定,增加綜合調(diào)整部分,以應(yīng)對(duì)可能對(duì)客戶信用影響較大的突發(fā)事件,如客戶被刑事起訴、遭遇重大疾病等。完整的信用風(fēng)險(xiǎn)標(biāo)準(zhǔn)評(píng)分卡模型,如表3.21所示:
使用小樣本開發(fā)信用風(fēng)險(xiǎn)評(píng)級(jí)模型時(shí),通常采用交叉驗(yàn)證(如五折交叉驗(yàn)證)的方法以提高模型的穩(wěn)定性。由于上述代碼采用的是隨機(jī)抽樣,每次抽取樣本總體的80%作為樣本集,來進(jìn)行模型開發(fā),剩余樣本總體的20%用作模型測(cè)試。模型開發(fā)過程中,只需要運(yùn)行上述代碼4次,并對(duì)得到的標(biāo)準(zhǔn)評(píng)分卡、模型中每項(xiàng)的分值取平均值,即可得到最終的標(biāo)準(zhǔn)評(píng)分卡模型。
3.7 主標(biāo)尺設(shè)計(jì)及模型驗(yàn)證
在上一節(jié)中開發(fā)的信用風(fēng)險(xiǎn)評(píng)分卡模型,得到的是不同風(fēng)險(xiǎn)等級(jí)客戶對(duì)應(yīng)的分?jǐn)?shù),我們還需要將分?jǐn)?shù)與違約概率和評(píng)級(jí)符號(hào)聯(lián)系起來,以便差異化管理證券公司各面臨信用風(fēng)險(xiǎn)敞口的客戶,這就需要對(duì)證券公司各面臨信用風(fēng)險(xiǎn)敞口業(yè)務(wù)中的個(gè)人客戶開發(fā)一個(gè)一致的主標(biāo)尺。最容易理解、最容易操作的方式就是根據(jù)違約概率從低到高分為不同的區(qū)間,這就相當(dāng)于把違約概率這把尺子標(biāo)上刻度,用這把尺子可以把證券公司需承擔(dān)信用風(fēng)險(xiǎn)敞口的不同業(yè)務(wù)中的個(gè)人客戶劃分到不同的信用等級(jí),這樣各項(xiàng)業(yè)務(wù)中個(gè)人客戶的信用等級(jí)分布差異、信用風(fēng)險(xiǎn)分布高低,就可以一目了然地展現(xiàn)出來了。這種違約概率和信用等級(jí)之間的映射關(guān)系就稱為主尺標(biāo)。 由邏輯回歸方程原理的分析可知,客戶的違約概率p=Odds/(1+Odds),由式 Score=A-Blog(Odds)中得分與違約概率和Odds之間的對(duì)應(yīng)關(guān)系,我們可計(jì)算出客戶得分對(duì)應(yīng)的違約概率。 由信用風(fēng)險(xiǎn)標(biāo)準(zhǔn)評(píng)分卡可知,該評(píng)分卡的最高分是89分,最低分是-41分。因此,我們可以計(jì)算出該評(píng)分卡所有得分范圍對(duì)應(yīng)的違約概率:
根據(jù)表3.22的結(jié)果可見,我們可簡單地將每10分對(duì)應(yīng)一個(gè)信用等級(jí),并用每相鄰得分對(duì)應(yīng)的違約概率(這種方法計(jì)算得出的違約概率只能用作風(fēng)險(xiǎn)排序,而不是客戶的真實(shí)違約概率)的算術(shù)平均值作為該信用風(fēng)險(xiǎn)等級(jí)對(duì)應(yīng)的平均違約概率,得到最終的主尺標(biāo)及其內(nèi)部信用等級(jí)對(duì)照表3.23:
在主標(biāo)尺和內(nèi)部信用等級(jí)確定后,接下來我們需要進(jìn)行模型的區(qū)分能力、預(yù)測(cè)準(zhǔn)確度和穩(wěn)定性等模型的驗(yàn)證工作了。回顧模型開發(fā)的過程,在模型開發(fā)時(shí)我們采用隨機(jī)抽樣的方法將數(shù)據(jù)分為樣本集和測(cè)試集,并用樣本集開發(fā)模型,用測(cè)試集做模型驗(yàn)證。因此,做模型驗(yàn)證時(shí),我們應(yīng)當(dāng)首先用開發(fā)好的模型對(duì)測(cè)試集中的每一個(gè)樣本評(píng)級(jí)一遍,并根據(jù)評(píng)級(jí)結(jié)果來計(jì)算模型的區(qū)分能力和預(yù)測(cè)準(zhǔn)確度。 用已開發(fā)好的模型對(duì)測(cè)試集中所有樣本重新評(píng)級(jí)一遍的代碼如下:
tmp1<-test_kfolddata[,-21] credit_risk1<-ifelse(test_kfolddata[,"credit_risk"]=="good",0,1) data_tmp<-as.matrix(cbind(tmp1,credit_risk1)) ##降維purpose(對(duì)測(cè)試集中的樣本做同樣的降維處理)## for(i in 1:nrow(data_tmp)) {#合并car(new)、car(used)if(as.character(data_tmp[i,"purpose"])=="car (new)") {data_tmp[i,"purpose"]<-as.character("car(new/used)")}if(as.character(data_tmp[i,"purpose"])=="car (used)"){data_tmp[i,"purpose"]<-as.character("car(new/used)")}#合并radio/television、furniture/equipmentif(as.character(data_tmp[i,"purpose"])=="radio/television") {data_tmp[i,"purpose"]<-as.character("radio/television/furniture/equipment")}if(as.character(data_tmp[i,"purpose"])=="furniture/equipment"){data_tmp[i,"purpose"]<-as.character("radio/television/furniture/equipment")}#合并others、repairs、businessif(as.character(data_tmp[i,"purpose"])=="others"){data_tmp[i,"purpose"]<-as.character("others/repairs/business")}if(as.character(data_tmp[i,"purpose"])=="repairs"){data_tmp[i,"purpose"]<-as.character("others/repairs/business")}if(as.character(data_tmp[i,"purpose"])=="business"){data_tmp[i,"purpose"]<-as.character("others/repairs/business")}#合并retraining、educationif(as.character(data_tmp[i,"purpose"])=="retraining"){data_tmp[i,"purpose"]<-as.character("retraining/education")}if(as.character(data_tmp[i,"purpose"])=="education"){data_tmp[i,"purpose"]<-as.character("retraining/education")} } ##purpose變量降維結(jié)束## ###用R代碼實(shí)現(xiàn)打分卡模型### data1<-as.data.frame(data_tmp) tot<-nrow(data1) score<-list() for(i in 1:tot) {lst<-as.matrix(data1[i,])#durationscore_duration<-NAif(lst[,"duration"]<=8){score_duration<-14}elseif(lst[,"duration"]>8&lst[,"duration"]<=33){score_duration<-1}elseif(lst[,"duration"]>33){score_duration<--7}#amountscore_amount<-NAif(lst[,"amount"]<=3913){score_amount<-3}elseif(lst[,"amount"]>3913&lst[,"amount"]<=9283){score_amount<--5}elseif(lst[,"amount"]>9283){score_amount<--14}#agescore_age<-NAif(lst[,"age"]<=34){score_age<--2}elseif(lst[,"age"]>34){score_age<-3}#installment_ratescore_installment_rate<-NAif(lst[,"installment_rate"]==1){score_installment_rate<-2}elseif(lst[,"installment_rate"]==2){score_installment_rate<-5}elseif(lst[,"installment_rate"]==3){score_installment_rate<--1}elseif(lst[,"installment_rate"]==4){score_installment_rate<--6}#statusscore_status<-NAif(lst[,"status"]=="... < 100 DM"){score_status<--10}elseif(lst[,"status"]=="0 <= ... < 200 DM"){score_status<--5}elseif(lst[,"status"]=="... >= 200 DM / salary for at least 1 year"){score_status<-5}elseif(lst[,"status"]=="no checking account"){score_status<-14}#credit_historyscore_credit_history<-NAif(lst[,"credit_history"]=="critical account/other credits existing"){score_credit_history<-8}elseif(lst[,"credit_history"]=="existing credits paid back duly till now"){score_credit_history<--1}elseif(lst[,"credit_history"]=="all credits at this bank paid back duly"){score_credit_history<--10}elseif(lst[,"credit_history"]=="delay in paying off in the past"){score_credit_history<-0}elseif(lst[,"credit_history"]=="no credits taken/all credits paid back duly"){score_credit_history<--16}#savingsscore_savings<-NAif(lst[,"savings"]=="... < 100 DM"){score_savings<--3}elseif(lst[,"savings"]=="... >= 1000 DM"){score_savings<-13}elseif(lst[,"savings"]=="500 <= ... < 1000 DM"){score_savings<-9}elseif(lst[,"savings"]=="unknown/no savings account"){score_savings<-9}elseif(lst[,"savings"]=="100 <= ... < 500 DM"){score_savings<--2}#propertyscore_property<-NAif(lst[,"property"]=="unknown/no property"){score_property<--4}elseif(lst[,"property"]=="real estate"){score_property<-3}elseif(lst[,"property"]=="building society savings agreement/life insurance"){score_property<--1}elseif(lst[,"property"]=="car or other"){score_property<-1}#purposescore_purpose<-NAif(lst[,"purpose"]=="domestic appliances"){score_purpose<-6}elseif(lst[,"purpose"]=="radio/television/furniture/equipment"){score_purpose<--3}elseif(lst[,"purpose"]=="car(new/used)"){score_purpose<--1}elseif(lst[,"purpose"]=="retraining/education"){score_purpose<--5}elseif(lst[,"purpose"]=="others/repairs/business"){score_purpose<--1}score[i]<-sum(20,score_duration,score_amount,score_age,score_installment_rate,score_status,score_credit_history,score_savings,score_property,score_purpose)rm(lst) } ###用R代碼實(shí)現(xiàn)打分卡模型結(jié)束### #合并處理測(cè)試集樣本得分,并輸出到指定的CSV文件中# score_M<-as.matrix(score,ncol=1) score_data<-cbind(data1,score_M) score_risk<-score_data[,c("credit_risk1","score_M")] write.csv(as.matrix(score_risk),"C:/Users/ZL/Desktop/creditcard_model/2.csv")運(yùn)行上述代碼后,我們整理測(cè)試集中200個(gè)樣本的評(píng)級(jí)計(jì)算結(jié)果,如下:
從理論上說,信用評(píng)級(jí)無法給出主體是否違約的判斷,只能給出主體違約的概率,而評(píng)級(jí)符號(hào)對(duì)應(yīng)的就是主體發(fā)生違約的平均違約概率。但對(duì)評(píng)級(jí)結(jié)果的實(shí)際應(yīng)用中,實(shí)在存在評(píng)級(jí)結(jié)果是否“準(zhǔn)確”的質(zhì)疑。那么,通常情況下如果某主體被評(píng)級(jí)為投資級(jí)(BBB及以上),但發(fā)生了違約,則被認(rèn)為“不準(zhǔn)確”或者“誤判”。如果某主體被評(píng)級(jí)為投機(jī)級(jí)(BB及以下),且發(fā)生了違約,則被認(rèn)為“預(yù)測(cè)準(zhǔn)確”。如果被評(píng)級(jí)為投機(jī)級(jí)的主體沒發(fā)生違約事件(并不是每個(gè)被評(píng)級(jí)為投機(jī)級(jí)的主體都會(huì)發(fā)生違約),則可以用概率去解釋,那就是“大概率事件并不一定發(fā)生,小概率事件也并不一定不發(fā)生”。 我們采用ROC作為模型區(qū)分能力的驗(yàn)證指標(biāo),采用AR(accuracy ratio,準(zhǔn)確率)作為模型預(yù)測(cè)準(zhǔn)確性的驗(yàn)證指標(biāo),并且兩者存在AR=2×ROC-1的關(guān)系式。驗(yàn)證模型的穩(wěn)定性需要多年的歷史數(shù)據(jù),由于數(shù)據(jù)原因此處略去。 由內(nèi)部等級(jí)與主尺標(biāo)的對(duì)應(yīng)關(guān)系可知,投資級(jí)和投機(jī)級(jí)的分界點(diǎn)為20分,即大于20分的主體發(fā)生了違約,我們認(rèn)為是“誤判”,小于20分的主體為發(fā)生違約,我們也認(rèn)為是“誤判”。則經(jīng)統(tǒng)計(jì)圖 中的數(shù)據(jù)可知,誤判的主體總數(shù)為50個(gè),則AR=1-50/200=0.75,此時(shí)ROC=(1+AR)/2=0.875。此時(shí)模型的預(yù)測(cè)準(zhǔn)確度和區(qū)分能力均達(dá)到了較好地要求,可以進(jìn)行部署使用。 上述模型的驗(yàn)證方法采用的是將測(cè)試樣本集中的所有樣本在生成的評(píng)分卡中全部評(píng)級(jí)一遍的方法,當(dāng)然也可以采用直接將WOE變量的邏輯回歸方程作為評(píng)級(jí)模型的方法。此時(shí),也需要將測(cè)試樣本集中的所有入模變量計(jì)算其WOE,并代入上述邏輯回歸方程。
3.8 模型實(shí)施
待模型開發(fā)和驗(yàn)證完畢后,緊接著就是模型的實(shí)施了。有條件的券商可借助業(yè)內(nèi)先進(jìn)的信用風(fēng)險(xiǎn)管理系統(tǒng),來實(shí)現(xiàn)整個(gè)公司的信用風(fēng)險(xiǎn)統(tǒng)一管理。在對(duì)客戶做信用評(píng)級(jí)時(shí),應(yīng)當(dāng)遵守一個(gè)最基本的原則,那就是同一個(gè)客戶在不同業(yè)務(wù)部門開展業(yè)務(wù)時(shí),只能對(duì)應(yīng)一個(gè)統(tǒng)一的評(píng)級(jí)結(jié)果。
3.9 模型監(jiān)測(cè)與報(bào)告
在模型部署和實(shí)施完畢后,我們還需要定期監(jiān)測(cè)模型的運(yùn)行情況并形成模型監(jiān)測(cè)報(bào)告。因?yàn)殚_發(fā)的模型是基于某一時(shí)間的特定樣本的,隨著時(shí)間的推移,證券公司的經(jīng)驗(yàn)戰(zhàn)略可能會(huì)發(fā)生變化,這將會(huì)導(dǎo)致樣本發(fā)生變化,從而造成模型的區(qū)分能力和穩(wěn)定性變差。因此,我們需要定期(通常每年至少一次)對(duì)模型的使用情況進(jìn)行檢測(cè)并報(bào)告模型區(qū)分能力和穩(wěn)定性的變化情況,必要時(shí)應(yīng)采取包括修正模型或重建模型等措施。 我們通常使用模型穩(wěn)定性指數(shù)來衡量模型穩(wěn)定性變化的情況,模型穩(wěn)定性指數(shù)是計(jì)算實(shí)際的和預(yù)期的分?jǐn)?shù)分布之間差異的一個(gè)衡量指標(biāo),具體的計(jì)算方法如表3.25所示。
表3.25中,列A(%)表示驗(yàn)證數(shù)據(jù)集中每十分位間距中記錄的百分比,列E(%)表示建模數(shù)據(jù)集中每十分位間距中記錄的百分比。列(A-E)和Ln(A/E)分別表示這兩個(gè)值的差以及這兩個(gè)值的比率的自然對(duì)數(shù),指數(shù)列示(A-E)列和Ln(A/E)列的乘積,模型穩(wěn)定性指數(shù)是最后一列的和。 模型穩(wěn)定性指數(shù)I的定義為:
模型穩(wěn)定性指數(shù)衡量的是兩個(gè)離散變量間的關(guān)聯(lián)性,較低的取值表明這兩個(gè)變量的類別分布相似。有卡方檢驗(yàn)的定義可知,我們可以使用自由度為r-1的卡方分布檢驗(yàn)?zāi)P头€(wěn)定性指數(shù)的顯著性。R語言中可使用pchisq()函數(shù)計(jì)算出兩個(gè)變量分布不同的概率:
pchisq(0.0699,df=9) #模型穩(wěn)定性指數(shù)為0.0699,自由度為9 [1] 5.178963e-09由輸出結(jié)果可知,變量A和變量E分布的不同的概率為5.178963e-09,非常非常小,這說明變量A和變量E的分布是相同的。 為了得到使用模型穩(wěn)定性指數(shù)衡量真實(shí)(變量A)和預(yù)期(變量E)的分值分布之間的顯著性差異的準(zhǔn)則,我們可以使用R函數(shù)qchisq(),即pchisq()函數(shù)的逆,獲取顯著性水平為0.65和0.997時(shí)的指數(shù)水平。結(jié)果如下所示,這兩個(gè)值分別為I=0.10和I=0.25。
qchisq(0.65,df=9) #結(jié)果為百分?jǐn)?shù) [1] 10.006 qchisq(0.997,df=9) #結(jié)果為百分?jǐn)?shù) [1] 24.97407根據(jù)上述計(jì)算,信用風(fēng)險(xiǎn)評(píng)級(jí)模型使用模型穩(wěn)定性指數(shù)的最優(yōu)實(shí)踐準(zhǔn)則如表3.26所示。
表3.26表明,根據(jù)卡方顯著性計(jì)算,穩(wěn)定性指數(shù)高于0.25時(shí),兩個(gè)數(shù)據(jù)集的分值分布顯著不同的概率為99.7%。此時(shí),我們需要對(duì)出現(xiàn)這種變化的原因進(jìn)入深入調(diào)查,甚至需要新建評(píng)分卡。同樣,穩(wěn)定性指數(shù)小于0.1時(shí),連個(gè)數(shù)據(jù)集的分值分布顯著不同的概率為65%。此時(shí),我們不需要采取任何行動(dòng)。穩(wěn)定性指數(shù)在上述兩個(gè)極端值之間時(shí),表明模型的穩(wěn)定性發(fā)生了某些變化,需要對(duì)模型進(jìn)行回歸測(cè)試,并檢查原因。
總結(jié)
以上是生活随笔為你收集整理的信用评分卡模型开发及评估指标的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用logistic回归构建申请信用评级
- 下一篇: 详细申请评分卡模型