背景:
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/