精华内容
下载资源
问答
  • PAGE 1 互联网征信中的信用评分模型 背景介绍 到了iphone X横空出世的季节那么假设小明是iphone的铁粉想要买iphone X但是却一下子拿不出这么多钱怎么办呢借钱分期没错能够提供这样服务的产品呢也就是消费信贷产品了...
  • 摘要:面向小微商户以及个人消费的小微信贷是当前互联网...本文将通过一个真实的案例出发,进行分析和探讨,针对用户历史行为数据建立信用评分模型,并通过该模型改进信用评估的预测效果。 关键词: 小微信贷;互联...

    摘要:面向小微商户以及个人消费的小微信贷是当前互联网金融的重要发展方向,并且正在经历爆发式增长。在这个增长过程中,如何在没有实物抵押的情况下,通过互联网大数据分析实现快速准确征信是一个非常重要的问题。为此,不同的数据来源将各显神通地为信用评估提供依据。本文将通过一个真实的案例出发,进行分析和探讨,针对用户历史行为数据建立信用评分模型,并通过该模型改进信用评估的预测效果。

    关键词: 小微信贷;互联网征信;信用评分;Logistic回归模型

    一、业务介绍

    1. 行业介绍

    小微信贷,我们定义为金额较小,并且没有抵押担保,完全靠信用的借贷行为。小微信贷可以面向个人(2C),也可以面向小微企业(2B)。对于2C类业务而言,常常是小额短期信用贷款,这是贷款是为解决借款人临时性的消费需要而发放的期限在1年以内、金额在20万元及以下的、毋需提供担保的人民币信用贷款。对于2B类业务而言,由于小微企业的信贷需求特点是 “短、小、频、急”,这种小额、短期、分散的特征更类似于零售贷款,对资金流动性的要求更高。

    小微信贷的产生具有其深刻的市场原因。在2B层面,小微企业受到传统金融机构的歧视和排挤,资金供给严重不足最终导致了小微企业的营养不良。就其原因,主要是小微企业没有足够的抵押物。而传统银行贷款,往往需要企业提供足够的抵押品。小微企业处于发展初级阶段,有限的资金都必须用在刀口上,所以只有少量资金可以用来购买土地房产等固定资产。于是造成传统银行在小微业务方面的产品较少。这造成了小微企业的融资需求与银行产品不匹配。另一方面,很多小微企业的财务报表不完全,从而造成信息不对称,银行对它们没有足够了解的基础上,不敢轻易放贷。而事实上,对银行来说,相对于大企业业务,小微信贷业务成本更高,这也导致银行放贷动力不足。而恰恰相反,在互联网平台上,信息不对称在一定程度上得到降低,而资金的供需双方在降低了交易成本的情况下直接对接,有些电商平台也开始为自己平台上的中小企业提供融资信贷服务。huang_1

    图1 银行的大企业贷款与小微企业贷款

     

    在2C方面,个人信用贷款主要为了购车、房屋装修、旅游等消费使用,但一般不能用于支付购房款。一般来说信用良好、有固定居所以及稳定收入、还贷能力充足的人能够申请信用贷款。传统的信贷审核仍然存在以下缺点:效率低、速度慢、准确性差。由于这些问题存在,使其很难适应互联网信贷的审核模式。另一方面,信用卡对普罗大众来说能够支配的信用额度有限。因此,仅依靠金融领域已有产品并不能满足用户对贷款金额以及时效性的细化需求。网络信贷的出现将更快地撮合这一过程,从而大量地减少了时间成本。

    自余额宝推出以来,互联网金融的产品如雨后春笋般出现。移动互联网正在逐渐渗透到传统金融的各个环节,目标是使金融能够以更低的成本、更多样化的方式、更优质的体验覆盖更多的人群。网络信贷平台将小额信用贷款用互联网的方式进行了改造,从而更多的小微企业和个人有了融资渠道,并且这一过程变得更加便捷。huang_2

    图2 个人信用贷款的用途

     

    1. 业务背景介绍

    由于小微借贷中的借贷并没有抵押和担保,那么唯一依靠的就是个人或者企业的信用,因此征信过程及其重要。而我们关注的要点就在于如何利用互联网平台的海量信息来帮助我们快速准确的完成这一过程。马云在给阿里巴巴员工的一封内部邮件中说,以控制为出发点的IT时代正在走向激活生产力为目的的DT(data technology)数据时代。随着计算机技术的发展,大数据运算变得越来越现实,基于大数据应用服务的公司不断崭露头角。大数据在营销领域的应用将广告变成了“窄告”精准营销,而在互联网金融大热的背景下,大数据在金融业征信方面的应用也在逐渐兴起。

    2015年1月5日,中国人民银行印发《关于做好个人征信业务准备工作的通知》,公布了首批获得个人征信牌照的8家机构名单,这8家机构分别为:腾讯征信有限公司、芝麻信用管理有限公司、深圳前海征信中心股份有限公司、鹏元征信有限公司、中诚信征信有限公司、中智诚征信有限公司、拉卡拉信用管理有限公司、北京华道征信有限公司。而央行的征信中心是一个基础数据库,已获批的个人征信机构将提供一些增值和创新服务。所以在征信的平台上,各路英雄将利用起自家数据各显神通。

    如何能够在B2C或者P2P平台上也能够使用海量的互联网数据帮助完成征信的过程,是我们希望能够在互联网不断颠覆传统的今天看到的事。本项研究的目标就是通过收集到的用户历史行为数据建立预测用户信用评分的模型。本文的数据收集来自一家小贷公司,为了数据隐私考虑,本文将隐去一部分数据信息以及分析结果,但是不影响分析结果的客观性。

    具体而言,我们称提供数据的公司为熊小贷(为公司匿名),熊小贷公司的业务包括2B业务和2C业务。公司已经通过自己的综合数据分析得到了对于2B和2C业务的统一用户信用得分,称为熊得分。但是熊得分广泛针对于公司所有的产品以及所有用户,使得对于特定产品的信用评分对于用户的违约情况预测精度并不高。熊小贷公司希望通过某款产品用户特有信息的数据支持,建立针对该特定产品的用户信用评分模型,预期目标是,通过数据支持建立起的该产品用户信用评分模型对于用户是否违约的预测精确度要高于通用的熊得分。直观了解公司的2B和2C业务可以从图3得出,公司包括针对不同用户的不同产品。例如熊分期是针对熊得分400以上用户的定制产品。在手机客户端下载APP“熊小贷”点击进入即可开始信用生活。之后再点击“熊分期”即可进入产品页面,后续会要求用户进行注册以及填写个人信息等内容。huang_3

    图3 熊小贷公司产品概况

     

    本案例中将针对已收集的用户信息,匹配公司数据库中的用户交易行为信息,以及已采用“熊分期”产品贷款的用户的违约情况,建立信用评分模型。这一信用模型将是从业务目标出发,结合业务背景而建立的。模型将预测用户的信用评分作为参考,并直接指导业务层面的是否可以对用户发放贷款。具体的数据采集以及变量清理过程将在第二章着重介绍,模型建立将在第三章进行介绍。

    二、数据描述

    1. 数据采集

    熊小贷公司的某股东具有第三方支付渠道,故可以收集到独特的用户通过银行卡的交易信息,注册用户只要通过第三方支付渠道进行交易,就能够被记录在案,而通过用户的手机号,就可以搜索到用户的历史交易行为数据。这一数据源具有其独特的优势,直接避免了传统征信行业中用户自填数据存在的重大问题:a. 对个人或者企业进行评级刻画时维度较为单一,不能得到综合全面的立体式评级;b. 财务数据造假的可能性较大,例如工资自填,如果用户为了得到贷款审批而夸大了公司水平,小贷公司很难进行确认; c. 缺乏其他数据进行交叉验证,使得评级的可靠性降低。但是熊小贷公司采集到的数据则比传统数据丰富得多。熊小贷公司共采集了前文提及的产品“熊分期”对应近3万个注册用户信息,自注册APP起的总交易笔数近450万行,以及相对应的其他信息,这些交易信息所处的时间区间跨度超过一年。其中违约用户近1万个,非违约用户近2万个。值得注意的是,此样本为为模型建立抽取的抽样数据并不代表真实注册用户中的违约用户与非违约用户比例。

    具体而言,熊小贷公司的“熊分期”产品所对应的注册用户数据结构主要包括以下四张表格,分别为交易事实表,用户信息表,商户分类信息表,以及银行卡信息表,它们之间的关系如图4所示。这四张表格分别通过不同的关键字连接,具体如下:a. 用户信息表可以通过用户手机号码和交易事实表对应,一个用户手机号码对应多个交易事实记录;b. 商户分类信息表可以通过商户编号和交易事实表对应,多个交易事实可能产生于一个商户编号;c. 银行卡信息表可以通过银行卡的前几位数字(称为卡标首)和交易事实表中的卡号对应。

    四张表格中包含的具体变量信息分别如下:

    • 用户信息表:手机号,注册渠道(手机APP注册,或者网站注册),身份证(提供数据已加密),提取数据前最近一次的登录时间,注册时间等。
    • 商户分类信息表:创建时间,商户号,商户名称,商户1级分类代码,商户1级分类名称,商户2级分类代码,商户2级分类名称,商户3级分类代码,商户3级分类名称,商户4级分类代码,商户4级分类名称等。
    • 银行卡信息表(银行卡卡片类型信息):卡标首(银行卡的前几位数据,决定了属于哪一家银行的哪一种类型的卡片),首长度(例如前6位数字决定了卡片类型,则首长度为6),账户类型,账户类型名称(例如储蓄卡或者信用卡),卡代码,银行代码,银行名称等。
    • 交易事实表:流水号(每一笔交易会被制定一个流水号码),交易手机号,交易时间,商户号,账单号,支付金额(支付金额等于账单金额加手续费的总和),账单金额,手续费等。

    综上所述,上述四张表格可以通过不同的关键字分别进行匹配连接,从而能够对应到一个用户的多行交易信息在下一小节中,我们将详细阐述数据的变量提取过程。

    huang_4

    图4 熊分期产品用户数据结构

    1. 数据清理变量采集

    首先,按照关键字将所有四张表格合并。每一条观测以一个用户的一次交易行为为单位,包含用户个人信息,银行卡信息,商户分类信息等,总观测行数近450万条。直接处理并不是一个好的解决方法,这样产生的数据量太大,且不直观利于分析。我们的目标是将所有的信息汇总到每一个用户,定义关于用户的衍生变量。从而,我们分成两个方向的变量来刻画用户特征,分别是:用户基础信息变量以及用户分类信息变量。接下来,我们将进行详细的定义。

    用户基础信息变量

    此处生成的用户基础信息变量包括直接可以从数据中收集的变量以及衍生变量,如下所示:

    (1) 用户的熊得分:由于目标要对于原始的综合熊得分进行预测精度的改进,我们将“熊得分”作为解释变量纳入模型,“熊得分”是熊小贷公司的业务人员根据实际业务定义的指标体系从而生成的得分,我们认为其具备一定的业务经验以及背景知识,从而也具备较强的预测能力。熊得分越低,越有可能违约。

    (2,3)用户性别,用户年龄:通过用户身份证号可以提取一个用户的性别,年龄信息,这些数据我们通过与熊小贷公司沟通完成,熊小贷公司并不直接提供用户的身份证号。获取的身份证信息均为加密过后的信息。

    (4)用户的注册年龄:即用户从第一次有交易记录开始距离现在的时间长度,以天为单位。

    (5)交易笔数:用户自从第一笔交易记录开始,被记录的交易总笔数。

    (6)所有行为均值:用户被记录的所有交易行为的平均金额。

    (7)所有行为最大值:用户自从第一笔交易开始,所有交易行为的金额的最大值。这个指标可以度量用户的极端行为情况。直观来看,极端行为越大的用户越有可能违约。

    (8)借贷比率:用户所有行为中,采用贷记卡(或称为信用卡)交易的次数占所有采用贷记卡或者借记卡(或称为储蓄卡)交易次数的比率。这个指标衡量的是用户的交易习惯,例如,有些人习惯直接采用储蓄卡进行消费,而也有些人习惯每个月采用信用卡先进行消费,到了还款日再按时还款,这样既可以消费,又不影响每个月的理财计划。这两种消费习惯的用户群体不同。

    (9)银行卡数:我们每个人需要的银行卡数并不多,银行卡太多的用户与正常用户群体不同。例如,如果需要多张信用卡消费,但是却还不上信用卡的人可能更容易违约。

    通过以上信息,我们定义了以上这9个用户基础信息变量。

     用户分类信息变量与RFM模型

    在征信问题中,我们通常会面临一个典型的问题,在本案例中也是如此,当一个用户对应多条行为关系,如何按照一套既定的指标体系汇总到个人呢?在本案例中,每一个用户对应的交易记录小至几十条,大至一千条,通过交易事实对应到商户分类信息表格,我们可以将其归之为不同类型的交易,例如在超市购物,购买游戏点卡,交水电煤气费用等。对应每一种类别的行为,都需要通过一种标准化的方式计算对应每一个人的变量,来衡量对应一系列行为的人的特征。为此,我们引入营销学中经常采用的RFM模型(参见美国数据库营销研究所Arthur Hughes的研究)。

    huang_5

    图5 RFM模型图示

     

    在营销领域,RFM模型是用来衡量客户的价值和客户的创利能力的重要工具和手段。这个模型通过一个客户的近期购买行为、购买的总体频率以及花了多少钱三项指标来描述该客户的综合价值,具体如下:

    (1) R(Recency),最近一次消费,指上一次购买的时间到现在的距离。理论上,上一次消费时间越近的用户应该是相对而言活跃的用户。因此这些用户对于提供即时的商品或是服务也最有可能产生反应。而我们通常也会发现,对于0到6个月用户收到营销人员的沟通信息会多于31至36个月的用户。

    (2) F(Frequency),消费频率,即用户在限定的期间内产生购买的总次数。最常产生购买的用户,忠诚度最高的用户。

    (3) M(Monetary),某个用户所有消费金额的平均值。通过这一指标可以验证“帕雷托法则”(Pareto’s Law),也就是说公司80%的收入来自20%的顾客。

    在此案例中,我们将重新定义这三个指标,并借助这三个指标来概括用户所产生一类行为的特征,如表格1所示。而由于这三个指标并不能够衡量用户产生行为的波动性,所以我们增加一个指标S(Standard Deviation)来衡量用户行为的波动性。例如,对于购买游戏点卡类行为,我们可以定义R为用户最近一次购买游戏点卡距离数据提取时间的时间间隔,F定义为一年内用户购买游戏点卡的次数(考虑到用户注册时间不一样,此处采用的频数需要采用用户年龄进行标准化,即总次数除以用户年龄。用户年龄的定义将在下文中详述),M定义为一年内用户每次购买游戏点卡的平均金额,S定义为用户每次购买游戏点卡金额的标准差。我们将所有变量记作类别名称加指标简称的形式,例如游戏R。

    表1 RFM指标定义

    指标简称 指标定义
    R 一年内用户最后一次产生某类行为距离提取数据的时间
    F 用户在一年内产生某次行为的频数
    M 用户在一年内产生某类行为的平均金额
    S 一年内该类行为产生金额的标准差

    用户行为的分类通过银行卡信息表,以及商户分类信息表,根据业务场景,我们提取了以下类别,每个类别都对应着以上我们已经定义好的RFMS四个指标。类别包括:

    (1)借记类:刻画用户使用储蓄卡的交易行为。不同的用户习惯不同,采用储蓄卡和信用卡的倾向也可能不同。

    (2)消费类:刻画用户的日常消费行为。日常消费行为的金额以及频次不同,用户的还款能力可能不同。

    (3)信贷类:刻画用户之前的小额贷款类行为。用户之前如果有其他消费贷款类行为可能已经习惯进行消费贷款,从而可能具备更良好的信用状况。

    (4)转账类:刻画用户的转账行为。经常通过熊小贷APP转账的用户可能与不转账的用户行为不同。

    (5)话费类:刻画用户的话费充值交易行为。话费充值是否规律与充值金额多少都可能意味着用户群体不同。

    (6)公缴类:刻画用户交水,电,煤气费等交易行为。公缴费用的多少与是否规律也可能说明用户群体的不同。

    (7)游戏类:刻画用户购买游戏点卡的行为。经常玩游戏的用户群体可能与不玩游戏的人不同。

    (8,9)四大行卡类以及中型银行卡类:四大行包括中国银行,中国农业银行,中国工商银行,中国建设银行,中型银行包括招商银行,浦发银行,兴业银行,平安银行等。这个指标的设定有以下两方面原因:a. 不同公司的工资卡不同,小型创业公司一般采用中型银行的银行卡;b. 四大行的信用卡发放较为保守,所以能够申请到四大行信用卡的人可能和采用其他银行信用卡的用户群体不同。

    (10)白金及金卡类:通过卡标首可以对应到银行卡是属于哪家银行的哪种类型的卡,例如招商银行的金葵花卡。我们搜索整理了相应银行的金卡和白金卡卡种名称,并对应到每一个用户。我们初步认为,拥有白金卡和金卡的用户具备更高的还款能力,所以用户群体不同。

    综上所述,我们一共提取了10个类别,每个类别4个指标,共计40个分类信息变量来全方位立体的刻画一个用户的全部交易行为。

    数据预处理与数据汇总

    为了数据质量考虑,我们去掉“用户注册年龄”小于10天的用户,原因在于,这一部分用户的观察行为较少,并不足以代表稳定的用户自身特征。另外,在对数据进行描述分析后,模型建立之前,我们将所有连续数据做对数处理,并进行标准化。由于所有样本均来自于交易行为的归纳汇总,故只要用户有交易行为,分类信息变量就不存在缺失,故此处不需要缺失数据填补。

    最终,我们的数据共包括28816个用户,其中违约用户为9115个,非违约用户19701个;结合9个用户基础信息变量,我们的数据共包括49个解释性变量,这49个变量也包含着对于业务的理解和思考。这对于刻画用户的所有行为而言,只是初步的探索和尝试,但是相较于只采用用户自填信息进行建模而言,已经更为综合和全面。

    三、数据建模

    在建模部分,我们将先通过几个变量的基础描述分析,以说明变量的特征,继而通过建立逻辑回归模型对于预测效果进行阐述。

    1. 描述性分析

    出于数据隐私考虑,我们只针对于其中6个变量作箱线图分析。箱线图能提供有关数据位置和分散情况的关键信息,尤其在比较不同的总体数据时更可表现其差异。此处我们通过对比箱线图对数据进行分析。我们用 0表示违约用户, 1表示非违约用户。

    (1)熊得分与是否违约。从箱线图可以看出,非违约用户与违约用户的箱线图有明显的差别,这表明熊得分对于违约与非违约用户具有较好的区分度。

    (2)交易笔数与是否违约。从箱线图可以看出,非违约用户较违约用户而言,交易笔数更高。

    (3)用户所有行为均值与是否违约。从箱线图可以看出,非违约用户与违约用户相比较,所有行为金额的均值较高。

    (4)借记卡F与是否违约:通过箱线图可以得出,非违约用户的借记卡F平均高于违约用户。表明非违约用户借记卡的使用频数更高。

    (5)四大行M与是否违约:通过箱线图得出,非违约用户的四大行卡的行为平均值较高,这说明非违约用户更多使用四大行的银行卡。

    (6)信贷R与是否违约:从图中能够得出结论,非违约用户通过APP产生借贷行为距离现在的日期,相对于违约用户而言较近。

    通过以上描述分析,我们已经能够观察到在所提取特征中违约用户与非违约用户的不同,通过回归分析,我们将进一步说明通过变量特征的设定带来的预测效果的提升。

    huang_6

    图6 典型变量箱线图

     

    1. 模型设定及估计结果

    本案例中采用逻辑回归进行建模,原因在于,根据逻辑回归结果,我们能够直观看到每一个变量对于因变量是否违约的作用大小,有利于系数解释。但由于变量过多,我们很难对于所有变量进行符合预期的系数解释,进一步地,我们采用BIC的方法选择模型。相比较于AIC而言,BIC模型选择的方法选择的变量个数较少,更有利于模型的估计系数解释。

    BIC选模型的估计系数结果如表2所示,由于系数较多,我们省去估计量的估计误差和P值的具体数值,只用“*”标注P值的大小。但注意,当回归系数过多时我们难以直观展示系数结果,为此,我们根据估计系数的正负将变量分类,再按照绝对值的大小排序整理得到图7和图8。由于模型主要分析“熊得分”之外其他变量带来的预测效果的提升,我们只绘制除“熊得分”之外其他变量的系数。

    我们并不逐一解释每一个系数的大小及其含义。值得注意的是,从图7中我们可以总结归纳得出非违约用户的特征,从图8中可以总结归纳出违约用户的特征,通过这两幅图已经可以总结出较为直观的对于违约与非违约用户的理解。我们通过进一步观察可以直观得出的结论包括但不限于:

    1. 在其他变量控制不变的情况下,借贷比例越高的用户违约可能性越低,这与银行的信用卡额度提升相似,对于经常使用信用卡并按时还款的客户更有可能被银行认为信用良好,从而希望改用户提高信用额度,而如果不经常使用信用卡则无法判断。从而借贷比例越高,表明用户越习惯使用信用卡,进一步越有可能是信用良好的用户。另一方面,用户申请银行的信用卡需要通过银行的信用评估,故有信用卡的用户较没有信用卡的用户会有所不同。

     

    表2 BIC选模型回归系数结果表

    变量名 估计值 p 变量名 估计值 p
    熊得分 26.301 *** 转账R -0.336 ***
    借贷比率 1.752 *** 年龄 -0.254 ***
    借记卡F 0.438 *** 公缴R -0.230  
    用户所有

     

    行为均值

    0.412 *** 四大F -0.175 ***
    交易笔数 0.136 *** 四大R -0.168 ***
    借记卡M 0.083 *** 中型F -0.122 ***
    中型M 0.016 *** 中型R -0.119 **
    四大M 0.014 * 消费F -0.096 **
    信贷R -0.922 *** 金卡F -0.083 ***
    银行卡数 -0.674 *** 转账M -0.082 ***
    信贷F -0.633 *** 公缴M -0.062 **
    用户所有

     

    行为最大值

    -0.474 *** 游戏M -0.059 *
    转账F -0.386 *** 信贷S -0.035 ***
    公缴F -0.370 *      

    注:***表示P<0.01,**表示0.01≤P<0.05,*表示0.05≤P<0.1。

     

    1. 借记卡F越大用户违约可能性越低。这表明其他变量不变,用户使用储蓄卡频数越高,越可能是信用良好的用户。
    2. 在其他变量保持不变的情况下,用户每一次交易行为的平均值越大越可能是非违约用户。
    3. 控制其他变量不变,信贷R越小越可能是非违约用户。这一点与之前观察的箱线图吻合,越近产生消费借贷行为的人,越有可能是非违约用户。注意这里产生的借贷行为与Y对应的是否违约并非同一次借贷行为。
    4. 其他变量水平不变,银行卡数越多,越有可能是违约用户。
    5. 保持其他变量不变,用户行为最大值越大,越可能是违约用户。这也验证了我们之前的结论,用户的极端行为越极端,越有可能是违约用户。huang_7

    图7 BIC选模型结果正系数

     

    huang_8

    图8 BIC选模型结果负系数

    1. 模型预测结果

    我们将对比以下三种模型的预测效果,因变量Y相同,为用户是否违约( 1,用户非违约, 0,用户违约):a. 只根据“熊得分”建立的逻辑回归模型;b. 用所有49个变量,包含用户基础信息变量与用户分类信息变量建立的逻辑回归模型;c. 在b模型的基础上通过BIC模型选择方法建立的模型。

    衡量模型的预测效果可以采用指标ROC(Receiver Operating Characteristic)曲线或者AUC(Area Under Curve)值。其中ROC曲线的横坐标为false positive rate(FPR),也称为Specificity,刻画的是模型预测错了,认为为1但真实为0的观测占所有真实为0的观测的比例。纵坐标为true positive rate(TPR),也称为Sensitivity,刻画的是模型预测所识别出的为1且真实为1的观测占所有真实为1的观测的比例。ROC曲线越贴近左上角,表明模型的预测效果越好。AUC是ROC曲线下的面积,这一指标取值越大表明模型预测的效果越好。通常在计算中也可以考虑如下公式:huang_8_1

    其中 表示 的真实取值为0的集合, 表示 的真实取值为1的集合, 表示 真实取值为0的观测个数, 表示 真实取值为1的观测个数。这一指标可以理解为,真实为1的 的预测非违约可能性不小于真实为0的 的预测非违约可能性的比例。

    为了模型对比,我们随机将所有数据划分为训练数据集(80%)和测试数据集(20%), 在训练集上估计模型的回归系数,将所有系数带入测试数据中进行计算,预测非违约可能性。随机拆分被重复了100次。我们随机抽取其中一次绘制ROC曲线如图9所示。其中,Score表示模型a的预测结果,模型中只包含“熊得分”,Full model表示模型b对应的预测结果,BIC表示模型c对应的预测结果。从图中可以得出结论,在b模型与c模型的预测效果接近,二者都要远远好于a模型的预测效果。进一步地,我们将100次随机拆分计算得到的AUC值取平均。出于行业数据机密,我们此处不汇报AUC的绝对提升结果。但是相对于 a模型而言,b模型和c模型的预测效果将相对提升13.6%。这将直接使得我们能够在实际业务中更精准的判断出用户的信用状况。huang_9

    图9 回归模型对比ROC曲线

    四、业务实施

    对于小贷公司而言,收益是靠收益率体现,而成本则体现在坏账率。也就是说对于现在的市场存在收益和成本的不对等。所以才会有P2P公司如雨后春笋般出现,为了在这个利润丰腴的市场分一杯羹。现在的小贷公司可以通过较为严苛的指标筛选用户,从而保证违约率一直维持在较低的水平,也就是说,现在的网络借贷公司也许并不需要借助纷繁复杂的技术手段就可以获得较高的收益。但是随着市场的饱和,越来越多的公司进入竞争的行列,在可预见的将来,我们可以看到违约率的提高,收益率的下降。到了那时候,拼的不再是跨入市场门槛的勇气,而是谁能够通过技术实力真正的选准用户,稳定住坏账率这一指标。

    在业务层面,首先,我们需要通过更多数据来验证以上模型结果真实可靠。通过熊小贷公司提供的不同数据,我们已经验证了这一结果。而通过以上数据建立模型的预测结果可以直接进行以下两方面的工作:

    (1)利用预测非违约率来辅助判断是否应该批准用户贷款,即进行用户选择。例如,同样的两个用户申请贷款,A用户的预测非违约率为0.85,B用户的预测非违约率为0.27。那么在资金预算有限的条件下,如果只能批准一个用户进行贷款发放,通过模型就会选择发放给非违约可能性更高的用户A用户。也就是说,通过模型的预测能够帮助我们筛选发放贷款的目标用户。而精准的预测将能够降低我们的贷款成本。

    (2)利用预测概率改进APP中的熊得分。例如,通过线性变换可以将预测概率P转化为400至800的用户得分Q,Q=400+400×P。从而能够更新平台上的熊得分,使得熊得分更加准确。

    另外,本案例中的模型证实了用户的交易记录数据对于征信模型的重要作用,对于业务上拓展数据源也有重要的指导意义。

    五、总结讨论

    本文针对互联网征信背景下的信用评估模型进行了探讨,通过具体的案例证明了用户历史行为数据对于用户的信用评估具有重要作用。这其中最值得注意的是,业务背景对于指导建立模型具有不可替代的作用,所有的变量产生都应该建立在对于业务背景知识的透彻了解之上。另外,关于本案例的研究有以下可能的改进方向:

    (1)在数据中我们只考虑违约情况为01变量,即,违约与非违约。其中,如果用户违约天数大于等于7天被定义为违约,否则为非违约。如果能够记录用户真实的违约天数作为连续变量,将可能对于模型预测有进一步的帮助。

    (2)在本案例中收集的数据只是通过某特定第三方支付平台的所有交易数据,并不能代表用户的所有银行卡交易状况,如果能够收集到用户的所有数据,则将对于用户的交易行为做出更全面客观的刻画。

    (3)从本案例的研究中可知,不同平台的数据对于信用评估可能有不同的优势。从央行下发牌照的8家机构看来,不同机构的数据源不同,各具特色,于是如何能够将不同数据源的数据进行统一后,建立综合的信用评估模型,是值得深入探讨的问题。例如,一个用户可能在京东平台和淘宝平台上的信用得分不一样,这与用户的平台偏好有关,但是如果能够根据不同平台的结果综合对用户进行信用评估,则将得到更准确的结果。

     

    参考文献

    [1] 陈文. 网络借贷与中小企业融资[M]. 经济管理出版社, 2014.

    [2] 胡援成, 卢华征. 中小企业融资的调查与思考[J]. 管理世界, 2003(10):11-13.

    [3] 李焰, 高弋君, 李珍妮,等. 借款人描述性信息对投资人决策的影响——基于P2P网络借贷平台的分析[J]. 经济研究, 2014(S1):143-155.

     

    转载于:https://www.cnblogs.com/payton/p/5567736.html

    展开全文
  • 信贷领域征信模型开发全流程 1. 前言 目前国内的金融体系主要由银行、互联网消费金融、助贷机构组成,本人参与过国内外大型银行、消金、助贷机构的征信模型开发,相对而言,对当前国内的征信模型具有一定的发言权。...

    1. 前言

    目前国内的金融体系主要由银行、互联网消费金融、助贷机构组成,本人参与过国内外大型银行、消金、助贷机构的征信模型开发,相对而言,对当前国内的征信模型具有一定的发言权。下面,我将从技术角度全面分析信贷领域征信模型的开发全流程。

    2. 征信模型
    国内最大的征信平台是央行征信报告,其他比较知名的有芝麻分、腾讯分、同盾分等第三方机构征信产品。这类征信产品主要被国内金融机构采用并用来评估个人、机构信贷风险。从我的接触层面分析,目前市面上征信模型主要使用逻辑回归算法,使用逻辑回归算法建模的主要原因为模型简单、可解释下强、稳定性好。下面将着重描述征信模型各环节的操作及意义。

    3. 建模流程
    由于visio软件过期,先不将流程图放上,但会描述下整个过程。
    标准的建模流程为:数据准备->数据清洗->特征工程->IV计算->WOE转换->变量筛选->拟合模型->模型评估->PSI监测->模型部署。

    3.1 数据准备
    这部分内容主要是确定建模样本,并提取相关数据,数据一定要是结构化的,如果不是结构化的则必须要能转换成结构化数据。一般而言,对于类别型特征变量,常见的处理方法有OneHotEncode,LabelEncode,均值编码和WOE转换等方法,更多时候是不会将类别型特征变量代入模型。关于类别型特征变量的挖掘及处理相关内容可参考如下链接:
    类别型特征处理介绍1
    对于样本不平衡问题,我们往往会采用过采样、欠采样、smote等方法重新提取训练样本
    样本不平衡的处理方法详情请看样本极度不平衡处理方案

    3.2 数据清洗
    数据清洗主要是对已准备好的数据做处理,比如某列数值型数据中包含字符串型数据,存在重复的数据等一系列不合理的情况,在我们进行特征工程前必须尽可能的把这些坑给排掉,避免在后续环境发现错误并返工。

    3.3 特征工程
    简单讲就是根据唯一主键构建各个维度的变量,如征信模型中以三要素(身份证、手机号、姓名)或订单号为唯一主键,给出用户的收入数据、消费数据、手机APP数据、APP使用行为数据等,我们可以构建出用户“近3个月的消费总金额”、“近1个月使用消金类APP次数”等特征变量,再根据构建出来的特征变量建模。一般而言,在我们建好特征变量后,会提前删除掉方差为0或缺失率较高的变量。删除方差为0的变量的原因是其在区分“好/坏用户”上无任何价值,删除缺失率高的变量的主要原因是这类变量不稳定,后续可能随着样本的变动导致构建的模型出现较大的偏差,无形中增加了风险。另外,对于时序型特征变量的挖掘往往从用户行为趋势、特定时间段行为等角度思考如何开展特征工程。

    3.4 画变量IV图
    IV(Information Value)从字面上理解为信息价值,从模型的角度理解则是用来衡量特征变量对识别目标变量的作用大小,可以用来衡量特征变量的预测能力。比较常用的IV图绘画方法有等频分箱、等宽分箱、最优分箱三种方法,但在信贷领域中,我们更多使用的是等频分箱,因为这样画出的IV图能直观的表现出特征变量的单调性。逻辑回归模型是线性模型,其优点就是具有可解释下、稳定性强的特点,单调性特征变量具有可解释性,单调递减特征变量图如下:
    图1 单调递减特征变量我们计算特征变量的IV值和画IV图的目的就是为了挑选合适的特征变量建模,挑选特征变量时一般会剔除iv值小于0.02的特征变量,保留缺失率不高且具有单调性的强特征变量。

    3.5 WOE转换
    WOE(Weight of Evidence,证据权重)可以理解为每个分箱里的坏人分布相对于好人分布之间的差异性。它的计算方式如下:
    WOE=ln[Bad distribution/Good distribution]
    需要记住的是,对于i分组,正常和违约的分布分别定义为:
    Good distribution =“第i组好用户数”/“总的好用户数”
    Bad distribution =“第i组坏用户数”/“总的坏用户数”
    WOE计算
    对变量进行WOE转换的目的有:
    1.业务的可解释性,对变量进行WOE转换可以将非严格单调性的线性变量转换成单调线性变量。
    2.能处理缺失值,WOE转换直接把缺失值转换成数值,方便代入模型运算。
    3.处理异常值,当数据中存在离群点时,可以把其通过分箱离散化处理,从而提高变量的鲁棒性(抗干扰能力)。
    缺点:
    1.容易导致模型欠拟合,相较于未WOE转换的模型结果,WOE转换后模型结果对坏用户的排序能力降低(个人理解)。

    3.6 变量筛选
    对经过IV环节挑选后的特征变量做相关性检验的原因有1.减少特征变量的数量,便于模型训练;2.相关性强的两个变量同时放入模型训练时,会影响特征变量的参数,使显著性强的特征变量变得不显著,甚至会使得拟合后的变量系数与实际系数值相反(如正直拟合出负值)。不做相关性剔除对模型的预测结果没有太大影响,剔除会使得模型看起来更简洁,稳定性更强(越复杂的模型稳定性越差)。变量之间的相关性检测一般有VIF检测、P值检测等方法。取值上各家机构都不一致,严格来说,我们会剔除VIF>2或者P>0.5的特征变量。

    1. VIF检测
      VIF(方差膨胀因子)用来衡量变量之间多重共线性的方法,它表示回归系数估计量的方差与假设自变量间不线性相关时方差相比的比值。每个变量都有一个VIF,若单变量VIF超过10,则一定出现多重共线性,若大多数变量VIF在[1,2]之间,少数略超过2,则勉强接受没有多重共线性,若最大的VIF值不超过2,则没有多重共线性。其计算公式如下:
      VIF = 1/(1-R(i)**2)
      其中,R(i)为自变量对其余自变量X(i)作回归分析的负相关系数。
    2. P值检测
      P值(皮尔逊系数)用来衡量两个变量之间的相关程度,两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差和标准差的商:
      P值计算公式
    3. 卡方值检测
      卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,如果卡方值越大,二者偏差程度越大;反之,二者偏差越小,其值计算公式如下:
      X**2 = SUM((Ai-Ti)**2/Ti)
      Ai为实际频数(出现的次数),Ti为理论频数。一般而言,我们会用卡方检验自变量与因变量之间的相关性,保留卡方值大的特征变量。
    4. P>|z|
      逻辑回归变量系数在逻辑回归拟合模型后,我们通常会输出上图表中所示的信息,除了VIF和coef外还值得关注的有P>|z|这列。一般认为,p值小于0.05的自变量是显著的,也就是说,有统计学证据表明该变量会影响因变量为1的概率。概括来说,P值就是判断系数是否显著的一个统计量,P值越小越拒绝0假设。

    3.7 拟合模型
    在传统征信行业一般使用逻辑回归算法拟合模型,主要原因体现在逻辑回归算法简单、可解释下强等特点。逻辑回归算法假设数据服从伯努利分布,采用极大似然估计函数,使用梯度下降方法寻找参数最优解,达到模型二分类的目的。具体的逻辑回归原理、数学公式推导等详情参考如下链接:
    逻辑回归原理及公式推导介绍1
    逻辑回归原理及公式推导介绍2
    一般在逻辑回归算法拟合模型时,当预选入模变量过多时,我们会采用半自动加双向逐步回归的方法挑选模型变量。所谓的半自动加双向逐步回归是指指定某个或某组特征变量作为模型的必选变量,并在此基础上使用双向逐步回归的方法挑选其他特征变量。一般要求添加的新特征变量或新的组合特征变量拟合后的模型效果有所提升。

    3.8 模型评估方法
    通常情况下,我们使用准确率、错误率、精确率、召回率、f1_score,混淆矩阵,AUC/KS等指标作为二元分类模型的评估方法。
    1.精确率和召回率
    精确率和召回率主要用于二分类问题,结合混淆矩阵有:
    混淆矩阵精确率与召回率的定义为:

    精确率(Precision) = TP/(TP+FP)

    召回率(Recall) = TP/(TP+FN)
    一般而言,精确率和召回率值越高,表示模型性能越好。
    2.准确率和错误率
    准确率和错误率既可用于二分类也可用于多分类,其计算公式如下:

    准确率(accuracy) = (TP+TN)/(TP+FP+FN+TN)

    错误率(errorrate) = (FN+FP)/(TP+FP+FN+TN)
    精确率和准确率是比较容易混淆的两个评估指标,两者是有区别的。精确率是一个二分类指标,而准确率能应用于多分类。

    3.f1_score
    F1函数是一个常用指标,F1值是精确率和召回率的调和均值,即
    f1_score描述
    4.AUC
    ROC曲线图
    AUC(Area Under Curve):Roc曲线下的面积,介于0和1之间。首先AUC值是一个概率值,AUC是指随机给定一个正样本和一个负样本,分类器输出该正样本为正的那个概率值比分类器输出该负样本为正的那个概率值要大的可能性,所以AUC反映的是模型对样本的排序能力。

    5.KS
    KS曲线其实数据来源和本质与ROC曲线是一致的,只是ROC曲线是把真正率(TPR)和假正率(FPR)当作横纵轴,而K-S曲线是把真正率和假正率都当作是纵轴,横轴则由选定的阈值来充当。其图形式如下:
    KS曲线图
    KS评估模型风险区分能力,指标衡量的是好坏样本累计分部之间的差值。好坏样本累计差异越大,KS指标越大,那么模型的风险区分能力越强,模型预测效果越好。

    KS的计算步骤如下:
    a. 计算每个评分区间的好坏账户数。
    b. 计算每个评分区间的累计好账户数占总好账户数比率(good%)和累计坏账户数占总坏账户数比率(bad%)。
    c. 计算每个评分区间累计坏账户占比与累计好账户占比差的绝对值(累计good%-累计bad%),然后对这些绝对值取最大值即得此评分卡的KS值。

    AUC与KS区别:AUC用来评估模型对样本的排序能力,KS用来评估模型对样本的风险区分能力。AUC和KS都可以用来评估模型性能好坏,都是值越大模型性能越好,区别在于FPR与TPR曲线是否作为横纵坐标。

    3.9 PSI监测
    群体稳定性指标PSI(Population Stability Index)是衡量模型的预测值与实际值偏差大小的指标,同时也可以用来衡量特征变量的稳定性,一般衡量特征变量稳定性时要在WOE化后计算,直接剔除不稳定的特征变量

    PSI = sum((实际占比-预期占比)* ln(实际占比/预期占比))
    举例:

    比如训练一个logistic回归模型,预测时候会有个概率输出p。

    测试集上的输出设定为p1,将它从小到大排序后10等份,如0-0.1,0.1-0.2,…。

    现在用这个模型去对新的样本进行预测,预测结果叫p2,按p1的区间也划分为10等分。

    实际占比就是p2上在各区间的用户占比,预期占比就是p1上各区间的用户占比。

    意义就是如果模型很稳定,那么p1和p2上各区间的用户应该是相近的,占比不会变动很大,也就是预测出来的概率不会差距很大。

    一般认为PSI小于0.1时候模型稳定性很高,0.1-0.25一般,大于0.25模型稳定性差,建议重做。

    PS:除了按概率值大小等距十等分外,还可以对概率排序后按数量十等分,两种方法计算得到的psi可能有所区别但数值相差不大。
    详细解释链接如下:PSI计算信息

    PSI的计算代码:

    def calculate_psi(expected, actual, buckets=10): # test, base
        '''
        expected:期望占比
        actual:实际占比
        buckets:将预测结果分成多少个Bin,默认Bin=10
        '''
        def psi(expected_array, actual_array, buckets):
            def scale_range(input, min, max):
                input += -(np.min(input))
                input /= np.max(input) / (max - min)
                input += min
                return input
            # 按照概率值分10段
            breakpoints = np.arange(0, buckets + 1) / (buckets) * 100
            breakpoints = scale_range(breakpoints, np.min(expected_array), np.max(expected_array))
            expected_percents = np.histogram(expected_array, breakpoints)[0] / len(expected_array)
            # print(expected_percents)
            actual_percents = np.histogram(actual_array, breakpoints)[0] / len(actual_array)
     
            def sub_psi(test, base): # test,base
                if base == 0:
                    base = 0.0001
                if test == 0:
                    test = 0.0001
     
                value = (test - base) * np.log(test / base)
                return(value)
            psi_value = np.sum(sub_psi(expected_percents[i], actual_percents[i]) for i in range(0, len(expected_percents)))
            return(psi_value)
     
        if len(expected.shape) == 1:
            psi_values = np.empty(len(expected.shape))
        else:
            psi_values = np.empty(expected.shape[0])
     
        for i in range(0, len(psi_values)):
            if len(psi_values) == 1:
                psi_values = psi(expected, actual, buckets)
            else:
                psi_values[i] = psi(expected[:,i], actual[:,i], buckets)
        return(psi_values)
    

    3.10 模型部署
    逻辑回归模型的部署相较于其他机器学习模型来说是最容易的,原因是逻辑回归模型得到的是模型特征变量的参数,我们可以直接将处理后的模型特征变量与模型相关参数、sigmoid函数结合得到预测概率,在征信行业中,我们往往会给预测用户打上评分,打分公式和分数区间可自行定义,但往往会要求高分数低风险,低分数高风险

    4 总结

    本篇文章主要关注的是征信行业模型的开发流程,具体的代码实现等细节可自行寻找,后续也会对文章内容进行修改,希望能帮到您。

    展开全文
  • 百行征信评分卡测试

    2020-08-27 16:44:58
    1.根据评分卡设计测试用例,主要用到边界值分析法 2.根据测试用例修改表中响应的字段 其中“性别,职业,地区,身份证前2位,年龄,月收入”6项是在请求时修改; #post { "userName": "胡珊珊", "userCard": ...

    一、测试流程:

    1.根据评分卡设计测试用例,主要用到边界值分析法

    2.根据测试用例修改表中响应的字段

    其中“性别,职业,地区,身份证前2位,年龄,月收入”6项是在请求时修改;

    #post
    {
     "userName": "胡珊珊",
     "userCard": "42012320280101012X",
     "province": "42",
     "profession": "5",
     "income": "20002",
     "phone": "13966793263"
    }
    

    http://10.139.50.37:8091/swagger-ui.html#!/cro45score45controller/croScoreUsingPOST
    在这里插入图片描述

    剩余6项是在json中修改,json的路径如下:
    未结清贷款笔数:data.reportJson.nonRevolvingLoan.summary.openLoanCount: 2
    未结清总余额*:data.reportJson.revolvingLoan.summary.remainingAmount: 0.0
    累计逾期次数:data.reportJson.nonRevolvingLoan.summary.overdueCount: 2
    未结清总余额1*:data.reportJson.nonRevolvingLoan.summary.remainingAmount: 10924.53
    近30天新增贷款笔数:data.reportJson.nonRevolvingLoan.D30.loanCount: 0
    当前授信总额:data.reportJson.revolvingLoan.summary.creditLimitSum: 3000.0

    3.数据库信息:

    在这里插入图片描述涉及表1/3:用户信息表,json在“result_info”中,user_card即身份证号

    SELECT * FROM td_s_cro_account where ID='36';
    

    在这里插入图片描述涉及表2/3:得分结果表,执行一次会有一条得分总记录,唯一标识“order_id”

    select * from TD_S_CRO_ACCOUNT_SCORE where USER_CARD='42012320280101012X' order by CREATE_TIME desc ;
    

    在这里插入图片描述涉及表3/3:得分明细表,根据order_id可以可以查询得分明细

    select * from TD_S_CRO_ACCOUNT_SCORE_DETAIL where  ORDER_ID='6772178373914660864' order by SCORE desc;
    

    在这里插入图片描述测试需求分析:
    手动操作复杂

    附件:模型文档:
    在这里插入图片描述在这里插入图片描述![在这里插入图片描述](https://img-blog.csdnimg.cn/2020082716211559.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppYW5ncHJfb2s=,size_16,color_FFFFFF,t_70#pic_center

    二、测试用例设计及可执行性分析

    如果并边界值设计出测试用例,没有可执行性,一个一个执行显然不可能
    有效测试用例可执行性规则:一条有效测试用例尽可能多的覆盖有效测试条件
    因此,json与非json规则的验证可以分开进行
    数据库中的默认的有数据
    第一阶段:冒烟测试,两部分都修改,同预期结果相同
    第二阶段:json校验,基本信息还是用数据默认的,并得到各项的得分;修改json部分的字段;需要设计pyton代码块协助测试:
    第三阶段:json部分测试通过后,默认不修改;只修改基本信息并进行测试:
    第四阶段:保留测试数据,进行快速回测,因为每条测试数据,是经过处理的,即使有问题修复后也应该是正确的了,因此在jmeter中保留每条数据,便于后续复测及验收测试。

    可执行测试用例设计

    在这里插入图片描述在这里插入图片描述

    python代码段设计

    使用jupyter notobook,这个好用,很稀罕,整体结构如下,也是做到了测试数据的留痕:
    在这里插入图片描述在这里插入图片描述

    主要涉及json某些字段的修改,及修改后拼接:

    查询默认json值及找到需要修改的值

    import json 
    f='''
    {"msg":"成功","data":{"expireDttm":"2020-04-09 23:59:59","idType":"1","orderId":"1248049206242054144","reportJson":"{\"homeInfo\":[{\"homeAddress\":\"安徽省合肥市店埠**********\",\"date\":\"2020-01-08\"}],\"nonRevolvingLoan\":{\"D180\":{\"applyTenantCount\":-1,\"loanCount\":1,\"loanAmount\":8000.0,\"loanTenantCount\":1,\"maxLoanAmount\":8000.0,\"averageLoanAmount\":8000.0,\"overdueLoanCount\":0},\"D30\":{\"applyTenantCount\":-1,\"loanCount\":0,\"loanAmount\":0.0,\"loanTenantCount\":0,\"maxLoanAmount\":0.0,\"averageLoanAmount\":0.0,\"overdueLoanCount\":0},\"D360\":{\"applyTenantCount\":-1,\"loanCount\":1,\"loanAmount\":8000.0,\"loanTenantCount\":1,\"maxLoanAmount\":8000.0,\"averageLoanAmount\":8000.0,\"overdueLoanCount\":1},\"D90\":{\"applyTenantCount\":-1,\"loanCount\":0,\"loanAmount\":0.0,\"loanTenantCount\":0,\"maxLoanAmount\":0.0,\"averageLoanAmount\":0.0,\"overdueLoanCount\":0},\"summary\":{\"loanCount\":3,\"openLoanCount\":2,\"remainingAmount\":10924.53,\"remainingOverdueLoanCount\":0,\"remainingOverdueAmount\":0.0,\"remainingMaxOverdueStatus\":\"N\",\"overdueCount\":2,\"maxOverdueStatus\":\"M1\"}},\"personalProfile\":{\"pid\":\"364693e917d19fc2c11c3fefde0ed7828c698385280daed0efcd5b8b1b1143ec\",\"name\":\"bdf3b2b74e1f1dcd8eeeffd27d5806a9d7945d252a16f92c2705a80498d6d069\",\"mobileCount\":1},\"queryHistory\":[{\"tenantType\":\"-\",\"tenantName\":\"*\",\"userId\":\"*\",\"date\":\"2020-04-09\",\"reason\":1},{\"tenantType\":\"-\",\"tenantName\":\"*\",\"userId\":\"*\",\"date\":\"2020-04-08\",\"reason\":2},{\"tenantType\":\"-\",\"tenantName\":\"*\",\"userId\":\"*\",\"date\":\"2020-04-08\",\"reason\":1},{\"tenantType\":\"-\",\"tenantName\":\"*\",\"userId\":\"*\",\"date\":\"2020-01-08\",\"reason\":1},{\"tenantType\":\"-\",\"tenantName\":\"*\",\"userId\":\"*\",\"date\":\"2019-10-15\",\"reason\":1}],\"reportHeader\":{\"reportId\":\"BH2004090845308144156529\",\"reportTime\":\"2020-04-09T08:45:30\",\"queryResult\":1},\"revolvingLoan\":{\"D180\":{\"applyTenantCount\":-1,\"lendingAmount\":0.0,\"creditLimitSum\":0.0,\"overdueAccountCount\":1,\"accountCount\":0},\"D30\":{\"applyTenantCount\":-1,\"lendingAmount\":0.0,\"creditLimitSum\":0.0,\"overdueAccountCount\":0,\"accountCount\":0},\"D360\":{\"applyTenantCount\":-1,\"lendingAmount\":3000.0,\"creditLimitSum\":0.0,\"overdueAccountCount\":1,\"accountCount\":0},\"D90\":{\"applyTenantCount\":-1,\"lendingAmount\":0.0,\"creditLimitSum\":0.0,\"overdueAccountCount\":0,\"accountCount\":0},\"summary\":{\"remainingAmount\":0.0,\"remainingOverdueAmount\":0.0,\"remainingMaxOverdueStatus\":\"N\",\"overdueCount\":2,\"maxOverdueStatus\":\"M1\",\"creditLimitSum\":3000.0,\"accountCount\":1,\"validAccountCount\":1,\"maxCreditLimitPerTenant\":3000.0,\"remainingOverdueAccountCount\":0}},\"workInfo\":[]}","idCode":"34012319950319058X","reportDttm":"2020-04-09 08:44:51","custName":"胡珊珊","reportNo":"C12864064883L20200409ylymf","phoneTel":"13966793263"},"code":20000,"periodDate":"2020-04-09","error":"200","reportDttm":"2020-04-09 08:44:51"}
    '''
    # print(type(f),':\n',f)
    
    #开头部分,不需要处理
    f_1=f[0:115] 
    # print(type(f_1),'f_1:\n',f_1)
    
    #中间部分,需要处理
    f_2=f[115:-239] #截取出字段   
    # print(type(f_2),'f_2:\n',f_2)
    
    #结尾部分,不需要处理
    f_3=f[-239:] 
    # print(type(f_3),'f_3:\n',f_3)
    
    #字符串格式转换成字典格式,方便取值
    f_2_dt=json.loads(f_2)
    # print(type(f_2_dt),'f_2_dt:\n',f_2_dt) 
    
    f_a=f_2_dt['nonRevolvingLoan']['summary']
    f_b=f_2_dt['revolvingLoan']['summary']
    f_c=f_2_dt['nonRevolvingLoan']['D30']
    
    # 更新前查询
    print('未结清贷款笔数:data.reportJson.nonRevolvingLoan.summary.openLoanCount:',f_a['openLoanCount'])
    print('未结清总余额*:data.reportJson.revolvingLoan.summary.remainingAmount:',f_b['remainingAmount'])
    print('累计逾期次数:data.reportJson.nonRevolvingLoan.summary.overdueCount:',f_a['overdueCount'])
    print('未结清总余额1*:data.reportJson.nonRevolvingLoan.summary.remainingAmount:',f_a['remainingAmount'])
    print('近30天新增贷款笔数:data.reportJson.nonRevolvingLoan.D30.loanCount:',f_c['loanCount'])
    print('当前授信总额:data.reportJson.revolvingLoan.summary.creditLimitSum:',f_b['creditLimitSum'])
    

    输出结果:
    未结清贷款笔数:data.reportJson.nonRevolvingLoan.summary.openLoanCount: 2
    未结清总余额*:data.reportJson.revolvingLoan.summary.remainingAmount: 0.0
    累计逾期次数:data.reportJson.nonRevolvingLoan.summary.overdueCount: 2
    未结清总余额1*:data.reportJson.nonRevolvingLoan.summary.remainingAmount: 10924.53
    近30天新增贷款笔数:data.reportJson.nonRevolvingLoan.D30.loanCount: 0
    当前授信总额:data.reportJson.revolvingLoan.summary.creditLimitSum: 3000.0

    对json中的目标值进行修改

    # 更新数据的值
    f_a['openLoanCount']=0
    f_b['remainingAmount']=0
    f_a['overdueCount']=0
    f_a['remainingAmount']=3000
    f_c['loanCount']=0
    f_b['creditLimitSum']=2800
    
    # 更新后查询相应数据的值 :
    print('未结清贷款笔数:data.reportJson.nonRevolvingLoan.summary.openLoanCount:',f_a['openLoanCount'])
    print('未结清总余额*:data.reportJson.revolvingLoan.summary.remainingAmount:',f_b['remainingAmount'])
    print('累计逾期次数:data.reportJson.nonRevolvingLoan.summary.overdueCount:',f_a['overdueCount'])
    print('未结清总余额1*:data.reportJson.nonRevolvingLoan.summary.remainingAmount:',f_a['remainingAmount'])
    print('近30天新增贷款笔数:data.reportJson.nonRevolvingLoan.D30.loanCount:',f_c['loanCount'])
    print('当前授信总额:data.reportJson.revolvingLoan.summary.creditLimitSum:',f_b['creditLimitSum'])
    
    # print(type(f_2_dt),'f_2_dt:\n',f_2_dt) 
    f_2_str=str(f_2_dt)
    # print(type(f_2_str),'f_2_dt:\n',f_2_str)  
    
    f0=f_2_str.replace("\'",'\\"')
    # print(type(f0),'f0:\n',f0) 
    
    ff=f_1+f0+f_3
    print('new_json:验证格式正确后粘贴进数据库中\n',ff) 
    

    输出结果:
    未结清贷款笔数:data.reportJson.nonRevolvingLoan.summary.openLoanCount: 0
    未结清总余额*:data.reportJson.revolvingLoan.summary.remainingAmount: 0
    累计逾期次数:data.reportJson.nonRevolvingLoan.summary.overdueCount: 0
    未结清总余额1*:data.reportJson.nonRevolvingLoan.summary.remainingAmount: 3000
    近30天新增贷款笔数:data.reportJson.nonRevolvingLoan.D30.loanCount: 0
    当前授信总额:data.reportJson.revolvingLoan.summary.creditLimitSum: 2800
    new_json:验证格式正确后粘贴进数据库中

    {“msg”:“成功”,“data”:{“expireDttm”:“2020-04-09 23:59:59”,“idType”:“1”,“orderId”:“1248049206242054144”,“reportJson”:"{“homeInfo”: [{“homeAddress”: “安徽省合肥市店埠**********”, “date”: “2020-01-08”}], “nonRevolvingLoan”: {“D180”: {“applyTenantCount”: -1, “loanCount”: 1, “loanAmount”: 8000.0, “loanTenantCount”: 1, “maxLoanAmount”: 8000.0, “averageLoanAmount”: 8000.0, “overdueLoanCount”: 0}, “D30”: {“applyTenantCount”: -1, “loanCount”: 0, “loanAmount”: 0.0, “loanTenantCount”: 0, “maxLoanAmount”: 0.0, “averageLoanAmount”: 0.0, “overdueLoanCount”: 0}, “D360”: {“applyTenantCount”: -1, “loanCount”: 1, “loanAmount”: 8000.0, “loanTenantCount”: 1, “maxLoanAmount”: 8000.0, “averageLoanAmount”: 8000.0, “overdueLoanCount”: 1}, “D90”: {“applyTenantCount”: -1, “loanCount”: 0, “loanAmount”: 0.0, “loanTenantCount”: 0, “maxLoanAmount”: 0.0, “averageLoanAmount”: 0.0, “overdueLoanCount”: 0}, “summary”: {“loanCount”: 3, “openLoanCount”: 0, “remainingAmount”: 3000, “remainingOverdueLoanCount”: 0, “remainingOverdueAmount”: 0.0, “remainingMaxOverdueStatus”: “N”, “overdueCount”: 0, “maxOverdueStatus”: “M1”}}, “personalProfile”: {“pid”: “364693e917d19fc2c11c3fefde0ed7828c698385280daed0efcd5b8b1b1143ec”, “name”: “bdf3b2b74e1f1dcd8eeeffd27d5806a9d7945d252a16f92c2705a80498d6d069”, “mobileCount”: 1}, “queryHistory”: [{“tenantType”: “-”, “tenantName”: “", “userId”: "”, “date”: “2020-04-09”, “reason”: 1}, {“tenantType”: “-”, “tenantName”: “", “userId”: "”, “date”: “2020-04-08”, “reason”: 2}, {“tenantType”: “-”, “tenantName”: “", “userId”: "”, “date”: “2020-04-08”, “reason”: 1}, {“tenantType”: “-”, “tenantName”: “", “userId”: "”, “date”: “2020-01-08”, “reason”: 1}, {“tenantType”: “-”, “tenantName”: “", “userId”: "”, “date”: “2019-10-15”, “reason”: 1}], “reportHeader”: {“reportId”: “BH2004090845308144156529”, “reportTime”: “2020-04-09T08:45:30”, “queryResult”: 1}, “revolvingLoan”: {“D180”: {“applyTenantCount”: -1, “lendingAmount”: 0.0, “creditLimitSum”: 0.0, “overdueAccountCount”: 1, “accountCount”: 0}, “D30”: {“applyTenantCount”: -1, “lendingAmount”: 0.0, “creditLimitSum”: 0.0, “overdueAccountCount”: 0, “accountCount”: 0}, “D360”: {“applyTenantCount”: -1, “lendingAmount”: 3000.0, “creditLimitSum”: 0.0, “overdueAccountCount”: 1, “accountCount”: 0}, “D90”: {“applyTenantCount”: -1, “lendingAmount”: 0.0, “creditLimitSum”: 0.0, “overdueAccountCount”: 0, “accountCount”: 0}, “summary”: {“remainingAmount”: 0, “remainingOverdueAmount”: 0.0, “remainingMaxOverdueStatus”: “N”, “overdueCount”: 2, “maxOverdueStatus”: “M1”, “creditLimitSum”: 2800, “accountCount”: 1, “validAccountCount”: 1, “maxCreditLimitPerTenant”: 3000.0, “remainingOverdueAccountCount”: 0}}, “workInfo”: []}",“idCode”:“34012319950319058X”,“reportDttm”:“2020-04-09 08:44:51”,“custName”:“胡珊珊”,“reportNo”:“C12864064883L20200409ylymf”,“phoneTel”:“13966793263”},“code”:20000,“periodDate”:“2020-04-09”,“error”:“200”,“reportDttm”:“2020-04-09 08:44:51”}

    判断测试结果是否正确

    性别 0.86
    职业 5.29
    地区 29.51
    身份证前2位 20.68
    年龄 -42.16
    月收入 58.78
    1:未结清贷款笔数:data.reportJson.nonRevolvingLoan.summary.openLoanCount: 5
    2;未结清总余额*:data.reportJson.revolvingLoan.summary.remainingAmount: 15861.21
    3:累计逾期次数:data.reportJson.nonRevolvingLoan.summary.overdueCount: 1
    4:未结清总余额1*:data.reportJson.nonRevolvingLoan.summary.remainingAmount: 4900
    5:近30天新增贷款笔数:data.reportJson.nonRevolvingLoan.D30.loanCount: 1
    6:当前授信总额:data.reportJson.revolvingLoan.summary.creditLimitSum: 9050

    #测试部分
    d1='58.78	5.29	3.71	29.51	20.68	1.92	0.86	0.58	-7.32	-42.16	-3.86	-0.25'
    #Excel测试部分预期结果
    d2='-3.86	-7.32	1.92	0.58	-0.25	3.71'
    #Excel固化部分数据
    d3='0.86	5.29	29.51	20.68	-42.16	58.78'
    lt1=d1.split('	')
    lt2=d2.split('	')
    lt3=d3.split('	')
    print('lt1测试列表:',lt1)
    print('lt2测试预期:',lt2)
    print('lt3测试预期:',lt3)
    print(type(lt1),type(lt2),type(lt3))
    if len(lt1)==12:
        for n in lt3:
    #     print(n)
            if n in lt1:
                lt1.remove(n)
    #             break
            else:
                print('固化信息部分有误,可能为操作错误',n)  
        print(lt1) 
        for i in lt2:
            if i in lt1: 
                print(lt2.index(i),'测试通过:',i) 
            else:
                print(lt2.index(i),'测试部分可能有误,可能为操作错误',i)
        
    else: 
        print('数据行数不对,请查看数据库得分明细表')
            
    

    结果输出:
    lt1测试列表: [‘58.78’, ‘5.29’, ‘3.71’, ‘29.51’, ‘20.68’, ‘1.92’, ‘0.86’, ‘0.58’, ‘-7.32’, ‘-42.16’, ‘-3.86’, ‘-0.25’]
    lt2测试预期: [’-3.86’, ‘-7.32’, ‘1.92’, ‘0.58’, ‘-0.25’, ‘3.71’]
    lt3测试预期: [‘0.86’, ‘5.29’, ‘29.51’, ‘20.68’, ‘-42.16’, ‘58.78’]
    <class ‘list’> <class ‘list’> <class ‘list’>
    [‘3.71’, ‘1.92’, ‘0.58’, ‘-7.32’, ‘-3.86’, ‘-0.25’]
    0 测试通过: -3.86
    1 测试通过: -7.32
    2 测试通过: 1.92
    3 测试通过: 0.58
    4 测试通过: -0.25
    5 测试通过: 3.71

    数据更新

    select sysdate from dual ;
    -- 2062-01-01 04:31:24
    -- 20391201
    
    SELECT * FROM td_s_cro_account where ID='16';--
    select * from TD_S_CRO_ACCOUNT_SCORE where USER_CARD='42012320410701013X'
    select * from TD_S_CRO_ACCOUNT_SCORE_DETAIL where  ORDER_ID='6771505807558447104' order by SCORE desc;
    SELECT * FROM td_s_cro_account where ID='17';--43012320411201013X
    select * from TD_S_CRO_ACCOUNT_SCORE where USER_CARD='43012320411201013X' and rownum=1 ;
    select * from TD_S_CRO_ACCOUNT_SCORE_DETAIL where  ORDER_ID='6771515959586066432' order by SCORE desc;
    select sum(SCORE) from TD_S_CRO_ACCOUNT_SCORE_DETAIL where  ORDER_ID='6771515959586066432' ;--71.66+750=821.66
    SELECT * FROM td_s_cro_account where ID='18';--50012320391201012X
    select * from TD_S_CRO_ACCOUNT_SCORE where USER_CARD='50012320381201012X' order by CREATE_TIME desc ;
    select * from TD_S_CRO_ACCOUNT_SCORE_DETAIL where  ORDER_ID='6772156785320267776' order by SCORE desc;
    select sum(SCORE) from TD_S_CRO_ACCOUNT_SCORE_DETAIL where  ORDER_ID='6771517509490446336' ;--742.98  --750-7.02=742.98
    
    SELECT * FROM td_s_cro_account where ID='19';--50012320391201012X
    select * from TD_S_CRO_ACCOUNT_SCORE where USER_CARD='11012320381201012X' order by CREATE_TIME desc ;
    select * from TD_S_CRO_ACCOUNT_SCORE_DETAIL where  ORDER_ID='6772173983753441280' order by SCORE desc;
    
    SELECT * FROM td_s_cro_account where ID='20';--50012320391201012X
    select * from TD_S_CRO_ACCOUNT_SCORE where USER_CARD='61012320380101012X' order by CREATE_TIME desc ;
    select * from TD_S_CRO_ACCOUNT_SCORE_DETAIL where  ORDER_ID='6772174605101830144' order by SCORE desc;
    
    SELECT * FROM td_s_cro_account where ID='21';--50012320391201012X
    select * from TD_S_CRO_ACCOUNT_SCORE where USER_CARD='23012320380101012X' order by CREATE_TIME desc ;
    select * from TD_S_CRO_ACCOUNT_SCORE_DETAIL where  ORDER_ID='6772175256246554624' order by SCORE desc;
    
    SELECT * FROM td_s_cro_account where ID='22';--50012320391201012X
    select * from TD_S_CRO_ACCOUNT_SCORE where USER_CARD='99012320370101012X' order by CREATE_TIME desc ;
    select * from TD_S_CRO_ACCOUNT_SCORE_DETAIL where  ORDER_ID='6772222296955555840' order by SCORE desc;
    
    SELECT * FROM td_s_cro_account where ID='23';--50012320391201012X
    select * from TD_S_CRO_ACCOUNT_SCORE where USER_CARD='42012320300101012X' order by CREATE_TIME desc ;
    select * from TD_S_CRO_ACCOUNT_SCORE_DETAIL where  ORDER_ID='6772213643200434176' order by SCORE desc;
    

    接口请求及测试数据备份

    使用jmeter并保留每条测试用例的数据,方便后续进行回测
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200924140919517.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppYW5ncHJfb2s=,size_16,color_FFFFFF,t_70#pic_center

    总结

    测试方法是用到基本的边界值分析法,在上一步应该考虑对建模报告结果进行测试,以上测试的是根据建模报告的开发的出来的程序进行的测试。

    展开全文
  • 信用评分模型概述

    2018-11-06 15:40:04
    评分模型开发 确定评分目的 建模指标的基本定义 资料准备 变量分析 变量的形态分为连续变量和间断变量; 单因子分析,将变量分组,分组原则为组间差异大,组内差异小。分组占率不低于5%,各组必须同时拥有好坏...

    依发展母体区分

    • 通用性评分
    • 征信机构评分
    • 客制化评分

    依使用时机区分

    • 进件评分
    • 行为评分
    • 催收评分

    评分模型开发

    1. 确定评分目的
    2. 建模指标的基本定义
    3. 资料准备
    4. 变量分析

    变量的形态分为连续变量和间断变量;

    单因子分析,将变量分组,分组原则为组间差异大,组内差异小。分组占率不低于5%,各组必须同时拥有好坏客户。

    WOE迹象全数,ln(正常件占比/违约件占比),违约件占比高时WOE为负数,WOE绝对值越大表示好坏用户区分程度越高。

    IV信息值,\sum (正常件占比-违约件占比)*WOE(正常件占比-违约件占比)* WOE。

    信息值的预测能力
    信息值 解释能力
    <0.03 无预测能力
    0.03~0.09
    0.10~0.29
    0.30~0.49
    >=0.50 极高

    为了提高信息值,需要合并WOE相近的组别。然后将长清单变量经过排除高度相关、趋势异常等操作变为短清单变量集合。

    5.建立模型

    样本不均衡采用采样的方式控制好坏比率在3:1~5:1,通过交叉验证,用逻辑回归建模。

     

     6.婉拒推论

    建模时仅使用核准案件而把婉拒案件排除在外,会造成模型偏误,无法观察其实际绩效表现,也无从得知哪些案件遭到误判,因此需要根据婉拒推论推测婉拒案件的好坏,以进行模型修正,使未来模型的预测更接近真实情况。

    单纯扩充法、分群法

    7.效力验证

    样本外验证、时间外验证

    a.区隔力指标

    K-S value的解释能力
    K-S value 解释能力
    <0.20
    0.21~0.40
    0.41~0.50
    0.51~0.60
    0.61~0.75 极高
    >0.9 太高,可能有问题
    基尼系数的解释能力
    基尼系数 解释能力
    0
    0~0.4
    0.4~0.6
    0.6~0.8
    >0.8 极高

    b.稳定度指标

    PSI稳定度指标
    PSI 模型稳定度
    >0.25
    0.1~0.25
    <0.1

    参考书籍《互联网金融时代消费信贷评分建模与应用》

    展开全文
  • 信用评分模型

    2019-11-14 09:10:29
    信用评分模型
  • 传统个人征信的分析维度包括: 1 )个人基本数据,如年龄、性别、职业、收入、婚姻状况、工作年限、 工作状况等; 2) 信贷情况,主要是信贷和信用卡相关数据; 3)公共数据,包括税务、工商、法院、电信、水电...
  • 全面的信贷评分模型开发流程介绍
  • 不同机构的信用评分模型不尽相同,主要有两类: 金融机构: (1)申请风险评分 (2)行为风险评分/行为收益评分/行为流失倾向评分 (3)申请欺诈评分/交易欺诈评分 征信局: (1)征信局风险/破产/收益评分 (2)市场反应...
  • 个人征信模型预测

    2021-06-22 19:56:24
    一、项目背景 当今社会,个人信贷业务发展迅速,但同时也会暴露较高的信用风险。信息不对称在金融贷款领域突出,表现在过去时期借款一方对自身财务状况、还款能力及还款意愿有着较为全面的...单模型:逻辑回归、决策
  • 信用评分模型python实践——简介

    千次阅读 2018-12-20 00:01:03
    由于之前进行过信用评分模型的学习,并且接触并实践了一小段时间,虽然已经过了一年了,但是为了让这一段经历能够保留,在这里记录下点滴。本次将分多篇文章对信用评分模型的python实践进行阐述,包括简介,概念以及...
  • 信用评分问题中一般使用逻辑回归作为主要的模型。过程主要包括变量分箱、变量的WOE(证据权重)变换和变量选择(IV值)、逻辑回归估算。 一个完整的评分卡流程主要包括以下几个步骤: 数据准备 数据探索性分析 数据...
  • 确立Y值:消费贷信用评分模型一般以历史M3+为坏客户定义标准,作为正类,用1表示,历史未逾期的好客户为负类,用0表示,其他有逾期但未进入M3+的客户作为灰客户,用0.5表示,统计分布,但不作为建模样本。...
  • 信用评分模型11111111

    2018-02-27 18:12:15
    逻辑回归模型:广泛应用在申请评分、行为评分、市场响应、客户流失等建模领域。决策树模型:往往被用来做催收评分和客户盈利模型。神经网络模型:用来防止申请和交易欺诈。信用评分的主要目的是估计消费者的信用情况...
  • 评分模型的检验方法和标准&amp;amp;信用评分及实现 评分模型的检验方法和标准通常有:K-S指标、交换曲线、AR值、Gini数等。例如,K-S指标是用来衡量验证结果是否优于期望值,具体标准为:如果K-S...
  • 我眼中的信用评分模型

    千次阅读 2019-06-21 15:57:24
    关于信用风险 之前工作中涉及到信用风险,接下来几天就分享些我在... 推荐一本比较好的资料书-《信用风险评分卡研究-基于SAS的开发与实施》,书的核心内容为以逻辑回归为基础构建信用评分模型,如果将这本书的内...
  • 李奎元称:根据企业信用管理理论,5C原则是指考察客户信用价值的5个因素,即品行(character)...除了根据5C原则以及客户的财务状况对其资信进行评价以外,企业还可以通过资信分析模型分析客户的资信状况。根据目标和效
  • 欢迎大家,上一篇博客【信用卡评分模型(R语言)】详细的讲解了如何开发评分卡,这片博客就不再详细介绍,为方便开发评分卡,本人根据自己经验写了一个python包,导入此包后仅需一行代码即可成功制作评分卡,默认...
  • 风控评分模型全流程的开发及应用   信用评分卡的应用场景有申请评分卡(A卡)、行为评分卡(B卡)、催收评分卡(C卡)和反欺诈评分卡(F卡)。   用户申请信用贷款的流程依次是基本信息核查、强规则校验、反欺诈审核、...
  • 评分模型介绍

    2020-11-13 09:01:22
    文章目录申请评分卡行为评分卡催收评分卡反欺诈模型 个人信贷中,信用风险评估的关键是: 通过分析借款人的信用信息,评估借款人的偿还能力和意愿量化违约风险 信用评分卡模式是个人信贷风险管理中的重要手段,是...
  • 来源 | 知乎作者 |Carl文章链接 |https://zhuanlan.zhihu.com/p/35284849信用评分模型可用“四张卡”来表示,分别是 A卡(Applica...
  • 金融大数据信用评分模型解析

    千次阅读 2017-11-22 13:52:28
    传统个人征信的分析维度包括: 1 )个人基本数据,如年龄、性别、职业、收入、婚姻状况、工作年限、 工作状况等; 2) 信贷情况,主要是信贷和信用卡相关数据; 3)公共数据,包括税务、工商、法院、电信、水电...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,173
精华内容 469
关键字:

征信评分模型