背景:
Lending Club是美國最大的P2P網貸交易平臺,利用網絡技術直接連接了個人投資者和個人借貸者,縮短資金流通的細節,繞過傳統的大銀行等金融機構,使得投資者和借貸者都能得到更多實惠。對于投資者來說,可以獲得更好的回報;對于借貸者來說,則可以獲得相對較低的貸款利率。于此,我們就用一個簡單的例子去理解如何利用邏輯回歸預測在P2P網貸的投資回報。
預測目的:
在借貸行業中,投資者向借貸者提供貸款以獲取利息。如果借貸者順利償還貸款,投資者則獲得利息收益。如果借貸者無法償還貸款,投資者則損失貸款本金。因此,對于投資者來說,需要預測借貸者無法償還貸款的風險,最大程度地避免投資損失,最大程度地實現投資回報。
數據來源:
我們將使用Lending Club網站的公開數據,數據集為自2007年5月起至2010年2月LendingClub平臺發放的9578條3年期貸款。
因變量"not.fully.paid"表示不完全支付,要預測這個因變量,如下自變量可供投資者選擇是否投資此項貸款:
Credit Policy:客戶是否滿足Lending Club的授信標準,1為是,0為否;
Purpose:貸款的目的;(例:信用卡還款,債務處理,教育,購買大件,中小企業經營等等);
int.rate:貸款利率;較高的貸款利率意味著較高的風險;
installement:每月分期的金額;
log.annual.inc:借貸者的年收入的自然對數;
dti:借貸者的債務收入比;
fico:借貸者的FICO信用評分;
days.with.cr.line:借貸者有信用額度的天數;
revol.bal:借貸者的賬戶余額(尚未結清的金額);
revol.util:借貸者的信用賬戶利用率(使用的金額/授信的金額);
inq.last.6mths:借貸者在過去6個月被借款者咨詢的次數;
delinq.2yrs:借貸者在過去2年逾期還款超過30天的次數;
pub.rec:借貸者公共事業記錄差評的次數;
第一步: PREPARING THE DATASET
重要處理數據的語法-填充缺少的觀察值 imputation
源數據共有13個自變量,每1個變量都有出現缺少觀察值的情況,所以我們要對源數據進行處理,填充缺少的觀察值;通過如下代碼可以有所觀察:
missing = subset(loans, is.na(log.annual.inc) | is.na(days.with.cr.line) | is.na(revol.util) | is.na(inq.last.6mths) | is.na(delinq.2yrs) | is.na(pub.rec))
填充缺少的觀察值:
library(mice)
set.seed(144)
vars.for.imputation = setdiff(names(loans), "not.fully.paid")
imputed = complete(mice(loans[vars.for.imputation]))
loans[vars.for.imputation] = imputed
第二步: PREDICTION MODEL
采用邏輯回歸算法建立模型:
set.seed(144)
library(caTools)
split = sample.split(loans$not.fully.paid, SplitRatio = 0.7)
train = subset(loans, split == TRUE)
test = subset(loans, split == FALSE)
LoansLog = glm(not.fully.paid ~.,data=train,family=binomial)
summary(LoansLog)
predicted.risk=predict(LoansLog,type="response",newdata=test)
test$predicted.risk=predicted.risk
table(test$not.fully.paid, predicted.risk > 0.5)
library(ROCR)
ROCRpred = prediction(predicted.risk, test$not.fully.paid)
as.numeric(performance(ROCRpred, "auc")@y.values)
觀測在邏輯回歸模型下:
邏輯回歸模型正確率:0.8364
Baseline模型正確率:0.8399
模型AUC:0.672
綜上所述,可以觀測在對所有變量進行邏輯回歸的過程中,模型本身對預測的表現并不理想;
第三步: A SMART BASELINE
Lending Club會根據對貸款風險的預測來分配貸款利率,接下來我們進一步研究int.rate變量對模型預測的影響; 建立bivariate模型,
bivariate = glm(not.fully.paid~int.rate, data=train, family="binomial")
summary(bivariate)
與全變量的邏輯回歸模型相比,int.rate變量的重要性發生了顯著的變化;
接下來,進行變量相關性觀察:
cor(train$int.rate, train$fico)
觀測結果顯示變量int.rate和變量fico存在相關性,全變量模型存在multicollinearity多重共線性;貸款利率和借貸者的信用積分存在相關性;
針對測試集運用bivariate模型:
pred.bivariate = predict(bivariate, newdata=test, type="response")
summary(pred.bivariate)
table(test$not.fully.paid, pred.bivariate > 0.5)
測試結果顯示,測試集中最大可能的貸款違約率約為0.4266。
ROCRpred = prediction(pred.bivariate, test$not.fully.paid)
as.numeric(performance(ROCRpred, "auc")@y.values)
模型AUC:0.624
第四步: COMPUTING THE PROFITABILITY OF AN INVESTMENT
test$profit = exp(test$int.rate*3) - 1
test$profit[test$not.fully.paid == 1] = -1
test[which.max(test$profit),]
第五步:A SIMPLE INVESTMENT STRATEGY
在此處介紹一個簡單的投資思想:投資者選擇投資網貸P2P的時候,會在風險和收益之前尋求平衡; 所以我們的目標即是投資收益較高但風險較低的貸款;
highInterest=subset(test, "int.rate" >= 0.15 )
分出int.rate在15%以上的貸款,
mean(highInterest$profit)
table(highInterest$int.rate>=0.15,highInterest$not.fully.paid)
這部分int.rate較高的貸款平均收益大概在0.23,這部分int.rate較高的貸款違約率大概在0.25;
現在我們在這些highInterest的貸款中選擇風險最低的100只貸款;
cutoff = sort(highInterest$predicted.risk, decreasing=FALSE)[100]
selectedLoans = subset(highInterest, predicted.risk <= cutoff)
sum(selectedLoans$profit)
table(selectedLoans$not.fully.paid)
0.23 0.31
0.25 0.19
通過建立投資模型,發現在違約率僅僅提高了一點(0.19)的情況下,網貸的投資收益回報有了顯著地提高;
需要提醒的是:模型預測的時間相對較短;在實際的投資中,投資者還需要考慮econcomic shock等外部環境因素。
源數據:
https://courses.edx.org/asset-v1:MITx+15.071x_2a+2T2015+type@asset+block/loans.csv
擴展閱讀:
《來認識一下即將上市的全球最大P2P網貸公司Lending Club》,虎嗅網
http://www.huxiu.com/article/41472/1.html
《解析網貸龍頭Lending Club的盈利模式》
http://news.loan.cngold.org/c/2014-12-18/c2944728.html
書籍推薦:
《超越金融》,作者:喬治索羅斯
http://book.douban.com/subject/4244859/