使用 Python 对股票参数进行特征重要性分析

390 篇文章 2 订阅
182 篇文章 2 订阅
文章介绍了如何使用Python进行特征重要性分析,以股票预测为例,通过RandomForestRegressor构建模型,并利用shap库解释模型预测中各参数的贡献度。代码示例展示了数据预处理、模型训练、预测及特征重要性可视化的过程。
摘要由CSDN通过智能技术生成

前言

特征重要性分析,顾名思义就是要看看这一批参数里面,各个参数对模型预测结果的贡献度分别是多少,对于每一个预测结果来说,哪些参数的贡献度是最大的,哪些参数是无关紧要的。在本文中,我们以预测股票涨跌为例,简要介绍使用 Python 来对股票预测模型的参数进行特征重要性分析的方法,希望对大家能有所帮助。

导入依赖包

import sys
import numpy as np
import csv
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.inspection import permutation_importance
import shap
from matplotlib import pyplot as plt

print("python version: {}".format(sys.version)) 

这里我使用的 Python 版本是:3.9.5 (tags/v3.9.5:0a7dcbd, May 3 2021, 17:27:52)

准备好模型训练所需的数据

要对预测模型的参数进行重要性分析,首先我们得有关于这些参数的数据(如:‘MACD’, ‘MACD_DIF’, ‘MACD_DEA’, ‘DMA_DIF’, ‘PLRC12’, ‘PLRC6’, ‘Price1M’, ‘Price3M’, ‘EMA5’, 'EMAC10’等等)。这些参数我已经事先准备好了,这里我们只需从文件中读取即可。
在这里插入图片描述
使用下面的代码将数据从文件中读取出来:

CSV_FILE_PATH = "./backup/stocks_data_test.csv"

data = pd.read_csv(CSV_FILE_PATH)
row_0 = list(data.loc[0])
row_num = data.iloc[:,0].size

print("data len: {}".format(len(row_0)))
print("row_num: {}".format(row_num))

y_list = []   # 用于存放标签数据
x_list = []   # 用于存放特征数据
for i in range(row_num):
    row_data_list = list(data.loc[i])
    y_list.append(int(row_data_list[0]))
    x_list.append(row_data_list[1:])

# 将数据类型由 list 转换为 array
x_array = np.array(x_list)
y_array = np.array(y_list)

print("x_array shape: {}".format(x_array.shape))
print("y_array shape: {}".format(y_array.shape))
print("==================== Column Name ====================")
print(list(data.columns))
print("----- Finished -----") 

从代码运行的输出结果中可以看到,我们这一批数据总共有 19 个参数以及 6884 个样本:
在这里插入图片描述

划分训练集和测试集

使用如下代码将整个数据划分为两个部分:测试集和训练集。训练集用于模型训练,测试集用于模型验证和测试。

# test_size=0.2   设置测试集的样本数量为全部样呗的 20%
# random_state=12 设置随机种子为 12
# shuffle=True    打乱样本数据的顺序
x_train, x_test, y_train, y_test = train_test_split(x_array, y_array, test_size=0.2, random_state=12, shuffle=True)

print("x_train shape: {}".format(x_train.shape))
print("y_train shape: {}".format(y_train.shape))
print("x_test  shape: {}".format(x_test.shape))
print("y_test  shape: {}".format(y_test.shape))

print("----- Finished -----") 

从代码的运行输出结果可以看到,这里我们划分的训练集样本数量为 5507 个,测试集的样本数量为 1377 个。
在这里插入图片描述
用随机森林回归算法对模型进行训练

# n_estimators:森林中决策树的数量
rf = RandomForestRegressor(n_estimators=100)
rf.fit(x_train, y_train)

print("----- Finished -----") 

模型训练好了之后,我们可以使用如下代码使用模型对测试集中的数据进行预测:

predict_value = rf.predict(x_test)
for idx,value in enumerate(predict_value):
    print("[predict]: idx = {}, label = {}, predict = {}".format(idx, y_test[idx], value))

print("----- Finished -----") 

调用模型解释包 shap 对参数进行特征重要性分析

# 我们记录在文件中的数据的特征参数名称
columns_name_list = [
    'ChangePercent', 'MACD', 'MACD_DIF', 'MACD_DEA', 'DMA_DIF', 'PLRC12', 'PLRC6', 'Price1M',
    'Price3M', 'EMA5', 'EMAC10', 'EMAC12', 'EMAC20', 'EMAC26', 'MAC5', 'MAC10', 'MAC20', 'MAC60', 'MAC120'
]
explainer = shap.TreeExplainer(rf)
shap_values = explainer.shap_values(x_test)
shap.summary_plot(shap_values, x_test, feature_names=columns_name_list)

print("----- Finished -----") 

运行上面的代码,我们就可以看到各个参数对模型预测结果的贡献度了,红色代表正向贡献,蓝色代表负向贡献,参数的贡献度从上往下是由大到小,具体情况如下图所示:
在这里插入图片描述
对单个预测结果的特征贡献度进行可视化显示
这里我们选择测试集中的第 1 个样本和第 5 个样本进行演示:

shap.initjs()
shap.force_plot(explainer.expected_value, shap_values[0,:], x_test[0,:],feature_names=columns_name_list)
shap.initjs()
shap.force_plot(explainer.expected_value, shap_values[4,:], x_test[4,:],feature_names=columns_name_list)

对测试集全部样本预测结果的特征重要性进行可视化

shap.initjs()
shap.force_plot(explainer.expected_value, shap_values, x_test,feature_names=columns_name_list)

结语

以上就是使用 Python 对股票涨跌预测模型的参数进行重要性分析的方法了,如果感觉还不错的话,可以帮忙给个赞哦,感谢各位支持。 需要注意的是,模型预测的准确性和模型以及数据都有关系,要谨慎使用。

在学习python中有任何困难不懂的可以微信扫描下方CSDN官方认证二维码加入python交流学习
多多交流问题,互帮互助,这里有不错的学习教程和开发工具。

👉[[CSDN大礼包:《python安装包&全套学习资料》免费分享]]安全链接,放心点击

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、Python必备开发工具

在这里插入图片描述

四、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。在这里插入图片描述

六、Python练习题

检查学习结果。
在这里插入图片描述

七、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述
最后,千万别辜负自己当时开始的一腔热血,一起变强大变优秀。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值