使用Python对股票参数进行特征重要性分析
前言
特征重要性分析,顾名思义就是要看看这一批参数里面,各个参数对模型预测结果的贡献度分别是多少,对于每一个预测结果来说,哪些参数的贡献度是最大的,哪些参数是无关紧要的。在本文中,我们以预测股票涨跌为例,简要介绍使用Python来对股票预测模型的参数进行特征重要性分析的方法,希望对大家能有所帮助。导入依赖包importsysimportnumpyasnpimportcsvimportpandasaspdfromsklearn。modelselectionimporttraintestsplitfromsklearn。ensembleimportRandomForestRegressorfromsklearn。inspectionimportpermutationimportanceimportshapfrommatplotlibimportpyplotaspltprint(pythonversion:{}。format(sys。version))
这里我使用的Python版本是:3。9。5(tagsv3。9。5:0a7dcbd,May32021,17:27:52)准备好模型训练所需的数据
要对预测模型的参数进行重要性分析,首先我们得有关于这些参数的数据(如:MACD,MACDDIF,MACDDEA,DMADIF,PLRC12,PLRC6,Price1M,Price3M,EMA5,EMAC10等等)。这些参数我已经事先准备好了,这里我们只需从文件中读取即可。
使用下面的代码将数据从文件中读取出来:CSVFILEPATH。backupstocksdatatest。csvdatapd。readcsv(CSVFILEPATH)row0list(data。loc〔0〕)rownumdata。iloc〔:,0〕。sizeprint(datalen:{}。format(len(row0)))print(rownum:{}。format(rownum))ylist〔〕用于存放标签数据xlist〔〕用于存放特征数据foriinrange(rownum):rowdatalistlist(data。loc〔i〕)ylist。append(int(rowdatalist〔0〕))xlist。append(rowdatalist〔1:〕)将数据类型由list转换为arrayxarraynp。array(xlist)yarraynp。array(ylist)print(xarrayshape:{}。format(xarray。shape))print(yarrayshape:{}。format(yarray。shape))print(ColumnName)print(list(data。columns))print(Finished)
从代码运行的输出结果中可以看到,我们这一批数据总共有19个参数以及6884个样本:
划分训练集和测试集
使用如下代码将整个数据划分为两个部分:测试集和训练集。训练集用于模型训练,测试集用于模型验证和测试。testsize0。2设置测试集的样本数量为全部样呗的20randomstate12设置随机种子为12shuffleTrue打乱样本数据的顺序xtrain,xtest,ytrain,ytesttraintestsplit(xarray,yarray,testsize0。2,randomstate12,shuffleTrue)print(xtrainshape:{}。format(xtrain。shape))print(ytrainshape:{}。format(ytrain。shape))print(xtestshape:{}。format(xtest。shape))print(ytestshape:{}。format(ytest。shape))print(Finished)
从代码的运行输出结果可以看到,这里我们划分的训练集样本数量为5507个,测试集的样本数量为1377个。
用随机森林回归算法对模型进行训练nestimators:森林中决策树的数量rfRandomForestRegressor(nestimators100)rf。fit(xtrain,ytrain)print(Finished)
模型训练好了之后,我们可以使用如下代码使用模型对测试集中的数据进行预测:predictvaluerf。predict(xtest)foridx,valueinenumerate(predictvalue):print(〔predict〕:idx{},label{},predict{}。format(idx,ytest〔idx〕,value))print(Finished)调用模型解释包shap对参数进行特征重要性分析我们记录在文件中的数据的特征参数名称columnsnamelist〔ChangePercent,MACD,MACDDIF,MACDDEA,DMADIF,PLRC12,PLRC6,Price1M,Price3M,EMA5,EMAC10,EMAC12,EMAC20,EMAC26,MAC5,MAC10,MAC20,MAC60,MAC120〕explainershap。TreeExplainer(rf)shapvaluesexplainer。shapvalues(xtest)shap。summaryplot(shapvalues,xtest,featurenamescolumnsnamelist)print(Finished)
运行上面的代码,我们就可以看到各个参数对模型预测结果的贡献度了,红色代表正向贡献,蓝色代表负向贡献,参数的贡献度从上往下是由大到小,具体情况如下图所示:
对单个预测结果的特征贡献度进行可视化显示shap。initjs()shap。forceplot(explainer。expectedvalue,shapvalues〔0,:〕,xtest〔0,:〕,featurenamescolumnsnamelist)shap。initjs()shap。forceplot(explainer。expectedvalue,shapvalues〔4,:〕,xtest〔4,:〕,featurenamescolumnsnamelist)
对测试集全部样本预测结果的特征重要性进行可视化shap。initjs()shap。forceplot(explainer。expectedvalue,shapvalues,xtest,featurenamescolumnsnamelist)
结语
以上就是使用Python对股票涨跌预测模型的参数进行重要性分析的方法了,如果感觉还不错的话,可以帮忙给个赞哦,感谢各位支持。需要注意的是,模型预测的准确性和模型以及数据都有关系,要谨慎使用。