dnn模型 list index out of range_基于svm的财务预警模型

前言

       本文将我国A股上市公司作为研究对象,选取了A股 2015-2019 年度被 ST 或被 *ST上市公司,剔除了部分非财务原因导致ST或*ST的上市公司。财务指标选择了T-3期的资产负债率、流动比率、应收账款周转率等10个财务指标。

数据收集及预处理

        导入所需要库   

import tushare as tspro = ts.pro_api('*')  #tushre的tokenimport pandas as pdimport time

         通过tushare.pro取得上市公司信息列表 

data_Lcompany=pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol')data_Dcompany=pro.stock_basic(exchange='', list_status='D', fields='ts_code,symbol')data_Pcompany=pro.stock_basic(exchange='', list_status='P', fields='ts_code,symbol')data_company=pd.concat([data_Lcompany,data_Dcompany,data_Pcompany]

        读取CSMAR数据库导出的样本数据并做数据预处理

data_sample=pd.read_excel(r"C:\Users\hasee\Desktop\样本.xlsx")data_sample.columns=data_sample.iloc[0]data_sample.drop(index=0,inplace=True)data_sample.loc[:,"执行日期"]=pd.to_datetime(data_sample.loc[:,"执行日期"])data_sample["年份"]=pd.DatetimeIndex(data_sample.loc[:,"执行日期"]).yeardata_sample=data_sample[["证券代码","年份"]]data_sample.columns=["symbol","年份"]data_sample=pd.merge(data_sample,data_company,how='left',on="symbol"

        对样本数据进一步预处理,与正常公司数据合并,通过tushare.pro读取财务指标并写入csv

year=[2015,2016,2017,2018,2019]createVar = locals()for j in year:    createVar["data_sample_"+str(j)]=data_sample[data_sample["年份"]==j]    createVar["data_origin_"+str(j)]=pd.merge(data_Lcompany,createVar["data_sample_"+str(j)],how='outer')                                         createVar["data_origin_"+str(j)]["label"]=createVar["data_origin_"+str(j)]["年份"].map({j:0})                                            createVar["data_origin_"+str(j)].fillna(1,inplace=True)    print(j)                                              del createVar["data_origin_"+str(j)]["年份"]    for i in range(createVar["data_origin_"+str(j)].shape[0]):        print(i)        if i==0:            createVar["fina_indicator_"+str(j)]=pro.query('fina_indicator', ts_code=createVar["data_origin_"+str(j)]["ts_code"][i], start_date=str(j-3)+"1231", end_date=str(j-3)+"1231")        else:            time.sleep(0.9)            createVar["fina_indicator_"+str(j)]=pd.concat([createVar["fina_indicator_"+str(j)],pro.query('fina_indicator', ts_code=createVar["data_origin_"+str(j)]["ts_code"][i], start_date=str(j-3)+"1231", end_date=str(j-3)+"1231")])     createVar["fina_indicator_"+str(j)].to_csv("fina_indicator_"+str(j)+".csv")      

        读取财务指标 选取财务指标并做数据预处理

fina_indicator_2015=pd.read_csv("fina_indicator_2015.csv")del fina_indicator_2015["Unnamed: 0"]fina_indicator_2016=pd.read_csv("fina_indicator_2016.csv")del fina_indicator_2016["Unnamed: 0"]fina_indicator_2017=pd.read_csv("fina_indicator_2017.csv")del fina_indicator_2017["Unnamed: 0"]fina_indicator_2018=pd.read_csv("fina_indicator_2018.csv")del fina_indicator_2018["Unnamed: 0"]fina_indicator_2019=pd.read_csv("fina_indicator_2019.csv")del fina_indicator_2019["Unnamed: 0"]data_origin_2015=pd.merge(fina_indicator_2015,data_origin_2015,on="ts_code",how='left')data_origin_2016=pd.merge(fina_indicator_2016,data_origin_2016,on="ts_code",how='left')data_origin_2017=pd.merge(fina_indicator_2016,data_origin_2017,on="ts_code",how='left')data_origin_2018=pd.merge(fina_indicator_2016,data_origin_2018,on="ts_code",how='left')data_origin_2019=pd.merge(fina_indicator_2016,data_origin_2019,on="ts_code",how='left')data_origin=pd.concat([data_origin_2015,data_origin_2016,data_origin_2017,data_origin_2018,data_origin_2019])data_origin.index=range(len(data_origin))data_origin=data_origin[["debt_to_assets","fcff","profit_dedt","current_ratio","ar_turn","profit_to_gr","roa","grossprofit_margin","or_yoy","ebt_yoy","assets_yoy","label"]]data_origin["fcff_ratio"]=data_origin["fcff"]/data_origin["profit_dedt"]data_origin.dropna(axis=0, how='any',inplace=True)data_origin.index=range(len(data_origin))label=data_origin["label"]data_origin.drop("fcff", axis=1,inplace=True)data_origin.drop("profit_dedt", axis=1,inplace=True)

模型调参

        导入所需的库

from sklearn.svm import SVCfrom sklearn.model_selection import train_test_splitfrom sklearn.model_selection import cross_val_scorefrom sklearn.metrics import roc_auc_score, recall_scorefrom sklearn.metrics import roc_curvefrom sklearn.metrics import roc_auc_score as AUCfrom time import time import datetimefrom sklearn.preprocessing import StandardScalerimport numpy as npimport matplotlib.pyplot as plt

        划分训练集测试集

Xtrain, Xtest, Ytrain, Ytest = train_test_split(data_origin,label,test_size=0.3,random_state=400)

为什么要划分训练集测试集,请看这里。

https://www.zhihu.com/question/22872584

        数据归一化

ss = StandardScaler()ss = ss.fit(Xtrain)Xtrain = ss.transform(Xtrain)Xtest = ss.transform(Xtest)

         选择核函数

times = time() for kernel in ["linear","poly","rbf","sigmoid"]:    clf = SVC(kernel = kernel              ,gamma="auto"              ,degree = 1              ,cache_size = 3000              ,class_weight = "balanced").fit(Xtrain, Ytrain)    result = clf.predict(Xtest)    score = clf.score(Xtest,Ytest)    recall = recall_score(Ytest, result)    auc = roc_auc_score(Ytest,clf.decision_function(Xtest))    print("%s 's testing accuracy %f, recall is %f', auc is %f" % (kernel,score,recall,auc))    print(datetime.datetime.fromtimestamp(time()-times).strftime("%M:%S:%f"))

      因为训练集中正常公司远远多于非正常公司,所以存在样本不均衡问题。分类模型天生会倾向于多数的类,让多数类更容易被判断正确,少数类被牺牲掉。但是这样对我们的模式是没有意义的,根本无法达到我们的“要识别几年后会处于财务困境的公司”的建模目的。 SVC中class_weight中"balanced"

参数可以比较好地修正我们的样本不均衡情况。

返回结果

f5da6ff158af7b0b289a3e00159aa505.png

     返回了三个指标Accuracy、Recall、AUC面积。

    准确率Accuracy就是所有预测正确的所有样本除以总样本,通常来说越接近1越好。

    召回率Recall又被称为敏感度(sensitivity),真正率,查全率,表示所有真实为1的样本中,被我们预测正确的样本所占的比例。召回率越高,代表我们尽量捕捉出了越多的少数类,召回率越低,代表我们没有捕捉出足够的少数类。

    AUC面积反应了模型捕捉少数类的多数类之间的平衡能力。AUC面积与ROC曲线有关系后面会讲。

     在这里我们选择AUC面积作为选择核函数的指标,rbf核函数auc面积最大,选择rbf核函数(高斯径向基核函数)。

         对Gamma调参

recallall = []aucall = []scoreall = []gamma_range = np.logspace(-10,1,20)for i in gamma_range:    clf = clf = SVC(kernel = "rbf"              ,gamma=i              ,degree = 1              ,cache_size = 3000              ,class_weight = "balanced").fit(Xtrain, Ytrain)    result = clf.predict(Xtest)    score = clf.score(Xtest,Ytest)    recall = recall_score(Ytest, result)    auc = roc_auc_score(Ytest,clf.decision_function(Xtest))    recallall.append(recall)    aucall.append(auc)    scoreall.append(score)print(max(scoreall), gamma_range[scoreall.index(max(scoreall))])print(max(aucall), gamma_range[aucall.index(max(aucall))])print(max(recallall), gamma_range[recallall.index(max(recallall))])plt.plot(gamma_range,scoreall)plt.plot(gamma_range,aucall)plt.plot(gamma_range,recallall)plt.show()

       返回结果

22900e1642d6603da00c981b16686fba.png

       可以看出在Gamma取0.04832930238571752时AUC面积达到了0.757。

         对软间隔指标C调参

recallall = []aucall = []scoreall = []C_range = np.linspace(0.01,30,50)for i in C_range:    clf = SVC(kernel = "rbf",C=i,gamma=0.04832930238571752                  ,cache_size = 3000                  ,class_weight = "balanced").fit(Xtrain, Ytrain)    result = clf.predict(Xtest)    score = clf.score(Xtest,Ytest)    recall = recall_score(Ytest, result)        auc = roc_auc_score(Ytest,clf.decision_function(Xtest))    recallall.append(recall)    aucall.append(auc)    scoreall.append(score)print(max(scoreall), C_range[scoreall.index(max(scoreall))])print(max(aucall), C_range[aucall.index(max(aucall))])print(max(recallall), C_range[recallall.index(max(recallall))])plt.plot(C_range,scoreall)plt.plot(C_range,aucall)plt.plot(C_range,recallall)plt.show()

       返回结果

2b37593f954befbb643c329c39ac00d5.png

         可以看出在C取0.6220408163265306时AUC面积达到了0.758。

        因为Poly核函数可调的参数更多,我还尝试用网格搜索对poly核函数调参,奈何跑了一天出来的结果也不理想。

        绘制ROC曲线

clf_proba = clf = SVC(kernel = "rbf",C=0.6220408163265306,gamma=0.04832930238571752                  ,cache_size = 3000                  ,class_weight = "balanced").fit(Xtrain, Ytrain)FPR, recall, thresholds = roc_curve(Ytest,clf_proba.decision_function(Xtest), pos_label=1)area = AUC(Ytest,clf_proba.decision_function(Xtest))plt.figure()plt.plot(FPR, recall, color='red',         label='ROC curve (area = %0.2f)' % area)plt.plot([0, 1], [0, 1], color='black',linestyle='--')plt.xlim([-0.05, 1.05])plt.ylim([-0.05, 1.05])plt.xlabel('False Positive Rate')plt.ylabel('Recall')plt.title('Receiver operating characteristic example')plt.legend(loc="lower right")plt.show()

       ROC曲线,全称The Receiver Operating Characteristic Curve,译为受试者操作特性曲线。这是一条以不同阈值下的假正率FPR(假正率就是一个模型将多数类判断错误的能力)为横坐标,不同阈值下的召回率Recall为纵坐标的曲线,在我们这个案例中阈值为每个样本到划分数据集的超平面的距离。而AUC面积就是ROC曲线下的面积。

关于ROC曲线更多的知识请看这里:

https://blog.csdn.net/dujiahei/article/details/87932096

        返回结果

25d6191422351168c0524761fa028d5f.png

        绘制最佳阈值在ROC曲线中的位置

max((recall - FPR).tolist())maxindex = (recall - FPR).tolist().index(max(recall - FPR))plt.figure()plt.plot(FPR, recall, color='red',         label='ROC curve (area = %0.2f)' % area)plt.plot([0, 1], [0, 1], color='black', linestyle='--')plt.scatter(FPR[maxindex],recall[maxindex],c="black",s=30)plt.xlim([-0.05, 1.05])plt.ylim([-0.05, 1.05])plt.xlabel('False Positive Rate')plt.ylabel('Recall')plt.title('Receiver operating characteristic example')plt.legend(loc="lower right")plt.show()

       返回结果

dbe20b647be2c0f5fd860a3c885e5707.png

       基于我们选出的最佳阈值,我们来人为确定y_predict,并确定在这个阈值下的recall和准确度的值。

prob = pd.DataFrame(clf_proba.decision_function(Xtest))prob.loc[prob.iloc[:,0] >= thresholds[maxindex],"y_pred"]=1prob.loc[prob.iloc[:,0] < thresholds[maxindex],"y_pred"]=0prob.loc[:,"y_pred"].isnull().sum()times = time()score = AC(Ytest,prob.loc[:,"y_pred"].values)recall = recall_score(Ytest, prob.loc[:,"y_pred"])print("testing accuracy %f,recall is %f" % (score,recall))print(datetime.datetime.fromtimestamp(time()-times).strftime("%M:%S:%f"))

       返回结果

b396ead54652a9d3f28d837e1f735238.png

       在这个最佳阈值下,精确度达到了0.683,召回率达到了0.726。

后记

       总体来说,模型效果真的很一般,很大程度跟特征及样本选择有关系,这方面实在欠考虑,这个后期可以多尝试,模型效果应该还能有一定改善。

       这里还有一个教训就是对量纲不统一的数据一定要归一化处理,第一次调参时没做归一化,线性核函数跑了一天也没出结果(实际上我觉得应该不至于。。也不知道为什么)。

最后

        位我上者灿烂星空,道德律令在我心中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汇编操作显存

【0】README 0.1&#xff09;本文转自&#xff1a; http://www.cnblogs.com/youxin/archive/2012/05/21/2512329.html for relative source code , please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/lib.inc 【1】关于 80*25彩色字符模式显示缓冲区&…

Hibernate中的实体对象的三种状态

对于 Hibernate 而言&#xff0c;实体对象的状态分为三种&#xff1a; 1.暂时态 当对象刚创建&#xff0c;和 Session 没有发生任何关系时&#xff0c;当程序运行完就立刻消失&#xff0c;被称为暂时态。 2.持久态 持久态的对象和 Session 发生了关系&#xff0c;如执行了 ses…

java设计模式之状态模式_Java中的状态设计模式

java设计模式之状态模式在本教程中&#xff0c;我们将探讨另一种流行的行为设计模式-状态设计模式。 当我们使用可以存在于多个状态的对象时&#xff0c;状态设计模式的知识变得非常有用。 当对象的行为取决于其当前状态时&#xff0c;我们应该主要使用它。 这种模式有助于我们…

php概率计算_PHP指定概率算法

PHP指定概率算法&#xff0c;可用于刮刮卡&#xff0c;大转盘等抽奖算法。假设&#xff1a;有一个二维数组&#xff0c;记录了所有本次抽奖的奖项信息&#xff1a;$test_arr array(a>20,b>30,c>50);a奖概率20%&#xff0c;b奖概率30%&#xff0c;c奖概率50%模拟函数执…

os如何处理键盘的所有按键,显示or不显示,显示是如何显示

【0】README 0.1&#xff09; source code and text decription are from orange’s implemention of a os , and for complete code , please visit 我待会上传&#xff1b; 【1】 键盘输入缓冲区 step1&#xff09;缓冲区的数据结构如下&#xff1a; step2&#xff09;对…

Hibernate的缓存机制/会话级缓存机制

Hibernate 中维持了两级缓存。第一级缓存由 Session 实例维护&#xff0c;该缓存区保存着与该 Session 实例有关联的所有实体对象的数据&#xff0c;也称为内部缓存。而第二级缓存则存在于 SessionFactory 实例中&#xff0c;由通过该 SessionFactory 实例获取的所有 Session 实…

orm提取指定列_使用ORM提取数据很容易! 是吗?

orm提取指定列介绍 几乎所有系统都以某种方式与外部数据存储一起运行。 在大多数情况下&#xff0c;它是一个关系数据库&#xff0c;并且通常将数据获取委托给某些ORM实现。 ORM涵盖了很多例程&#xff0c;并且带来了一些新的抽象作为回报。 Martin Fowler写了一篇有关ORM的有…

如何编译文件(gcc + nasm)

【0】README 编译文件(nasm gcc)&#xff0c;特别是编译目标文件的依赖文件&#xff1b;本文旨在回顾 gcc 和 nams 编译器的编译命令&#xff0c;以及如果有多个依赖文件该如何编译&#xff1b; 【1】编译文件 1.1&#xff09;编译 lib/syscall.asm(lib/syscall.asm) nasm …

Hibernate中的Session.load() 和 Session.get() 的区别

文章目录相同点区别懒加载的问题执行语句 session.load(UserInfoBean.class,2) 会先在一级缓存中找 id2 的 UserInfoBean 对象&#xff08;看红色线条&#xff09;&#xff0c;找不到去二级缓存找&#xff0c;还找不到就不找了&#xff0c;直接获取一个代理对象并返回该对象。当…

python 分布式队列_〖Python〗-- Celery分布式任务队列

【Celery分布式任务队列】一、Celery介绍和基本使用Celery 是一个 基于python开发的分布式异步消息任务队列&#xff0c;通过它可以轻松的实现任务的异步处理&#xff0c; 如果你的业务场景中需要用到异步任务&#xff0c;就可以考虑使用celery&#xff0c; 举几个实例场景中可…

最大子序列和问题的解(共4种,层层推进)

【0】README 0.1&#xff09; source code and text description are from data structure and alg analysis &#xff1b; 0.2&#xff09; there are 4 methods solving maximum sum of subsequence&#xff0c; but the fourth proves to be the best one , the 3rd deser…

java设计模式代理模式_Java中的代理设计模式

java设计模式代理模式代理对象或代理对象为另一个对象提供占位符&#xff0c;以控制对该对象的访问。 代理充当原始对象的轻量级版本或简化版本。 它支持与原始对象相同的操作&#xff0c;但可以将那些请求委托给原始对象以实现它们。 代理设计模式是一种结构模式&#xff0c;…

Struts2参数值自动注入到JavaBean对象的属性中和JavaBean对象的属性值展示在页面中

文章目录参数值自动注入示例代码将JavaBean的属性值显示在页面上示例代码参数值自动注入 注意事项&#xff1a; 1.前端界面的表单项的参数命名格式为&#xff1a;Action属性名.JavaBean的属性名 2.Action的属性必须要有setter/getter方法&#xff0c;注入时会调用setter方法 …

ibmmq 通道命令_IBM MQ常用命令

常用命令创建队列管理器crtmqm –q QMgrName-q是指创建缺省的队列管理器删除队列管理器dltmqm QmgrName启动队列管理器strmqm QmgrName如果是启动默认的队列管理器&#xff0c;可以不带其名字停止队列管理器endmqm QmgrName 受控停止endmqm –i QmgrName 立即停止endmqm –p Qm…

算法运行时间中的对数

【0】README 0.1&#xff09; source code and text description are from data structure and alg analysis &#xff1b; 【1】分析算法最混乱的方面大概集中在对数上面&#xff0c; 除分治算法外&#xff0c;可将对数最常出现的规律概括为下列一般法则&#xff1a; 1.1&a…

java项目:永和大王项目_Java项目:书评

java项目:永和大王项目本文是关于这本书的 Peter Verhas撰写的Java Projects Second Edition 我去年写的 这样一篇文章的目的通常是为了促进这本书的销售。 在这种情况下没有什么不同&#xff0c;但是由于这是我写的书&#xff0c;而且我是撰写评论的人&#xff0c;因此赞美这…

Struts2+Hibernate项目中的时间和日期问题

文章目录数据表中的 datetime 的数据如何通过 json 传送给前端仅展示其日期&#xff0c;而不展示时间日期控件日期时间数据展示问题日期时间数据存储问题场景一场景二场景三场景四数据表中的 datetime 的数据如何通过 json 传送给前端仅展示其日期&#xff0c;而不展示时间 数…

把一个人的特点写具体作文_把一个人的特点写具体作文

把一个人的特点写具体作文在日常学习、工作抑或是生活中&#xff0c;大家都跟作文打过交道吧&#xff0c;写作文可以锻炼我们的独处习惯&#xff0c;让自己的心静下来&#xff0c;思考自己未来的方向。那要怎么写好作文呢&#xff1f;下面是小编为大家整理的把一个人的特点写具…

spring boot简介_Spring Boot简介

spring boot简介在本教程中&#xff0c;我们将看一下Spring Boot&#xff0c;看看它与Spring框架有何不同。 我们还将讨论Spring Boot提供的各种功能。 什么是Spring Boot&#xff1f; 在开发企业级应用程序时&#xff0c;Spring是一个功能强大的框架。 它为我们提供了诸如依赖…

C语言的运算符的优先级与结合性+ASCII表

【0】README 0.1&#xff09; 内容来源于 C程序设计语言&#xff0c; 旨在整理出C语言的运算符的优先级与结合性&#xff0c; 如下图所示&#xff08;哥子 记了大半年都没有记住&#xff0c;也是醉了&#xff0c;每次都要去翻&#xff09;&#xff1b; 0.2&#xff09; 再补充…