分享

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

 禁忌石 2023-01-12 发布于浙江

前言

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

导入依赖包

import sysimport numpy as npimport csvimport pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestRegressorfrom sklearn.inspection import permutation_importanceimport shapfrom matplotlib import pyplot as pltprint('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'等等)。这些参数我已经事先准备好了,这里我们只需从文件中读取即可。

文章图片1

使用下面的代码将数据从文件中读取出来:

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].sizeprint('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 转换为 arrayx_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 个样本:

文章图片2

划分训练集和测试集

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

# 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 个。

文章图片3

用随机森林回归算法对模型进行训练

# 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 -----')

运行上面的代码,我们就可以看到各个参数对模型预测结果的贡献度了,红色代表正向贡献,蓝色代表负向贡献,参数的贡献度从上往下是由大到小,具体情况如下图所示:

文章图片4

对单个预测结果的特征贡献度进行可视化显示

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)
文章图片5

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

shap.initjs()shap.force_plot(explainer.expected_value, shap_values, x_test,feature_names=columns_name_list)
文章图片6

结语

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多