【手把手教你】使用Python全面分析股票数据特征

导读: 本文主要从股市数据变量的特征分布及特征重要性两个角度对数据进行分析。

通过绘制图表等方法分析特征本身对分布状况或特征间相互关系。通过机器学习模型方法分析出特种重要性排序,选出对结果贡献较大对那几个特征,这对后面建模对模型效果有着不可小觑对效果。

????点击关注|选择星标|干货速递????


数据准备

此处数据获取可参见金融数据准备。

df.info()

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 1260 entries, 2015-12-31 to 2020-12-31
Data columns (total 6 columns):#   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  0   Open       1260 non-null   float641   High       1260 non-null   float642   Low        1260 non-null   float643   Close      1260 non-null   float644   Adj Close  1260 non-null   float645   Volume     1260 non-null   int64  
dtypes: float64(5), int64(1)
memory usage: 68.9 KB

特征构造

df['H-L'] = df['High'] - df['Low']
df['O-C'] = df['Adj Close'] - df['Open']
df['3day MA'] = df['Adj Close'].shift(1).rolling(window=3).mean()
df['10day MA'] = df['Adj Close'].shift(1).rolling(window=10).mean()
df['30day MA'] = df['Adj Close'].shift(1).rolling(window=30).mean()
df['Std_dev'] = df['Adj Close'].rolling(5).std()
df.dtypes

描述性统计

df.describe().T

缺失值分析

检查缺失值

df.isnull().sum() 
Open          0
High          0
Low           0
Close         0
Adj Close     0
Volume        0
H-L           0
O-C           0
3day MA       3
10day MA     10
30day MA     30
Std_dev       4
dtype: int64

缺失值可视化

这里使用Series的属性plot直接绘制条形图。

df_missing_count = df.isnull().sum() 
# -1表示缺失数据
# 另一个不常见的设置画布的方法
plt.rcParams['figure.figsize'] = (15,8)
df_missing_count.plot.bar()
plt.show()
for column in df:print("column nunique  NaN")print("{0:15} {1:6d} {2:6}".format(column, df[column].nunique(), (df[column] == -1).sum()))
column            nunique   NaN
Open              1082      0
High              1083      0
Low               1025      0
Close             1098      0
Adj Close         1173      0
Volume            1250      0
H-L                357      0
O-C               1237      2
3day MA           1240      0
10day MA          1244      0
30day MA          1230      0
Std_dev           1252      0

特征间相关性分析

import seaborn as sns
# 一个设置色板的方法
# cmap = sns.diverging_palette(220, 10,as_cmap=True)
sns.heatmap(df.iloc[:df.shape[0]].corr(),annot = True, cmap = 'Blues')

特征值分布

直方图

columns_multi = [x for x in list(df.columns)]
df.hist(layout = (3,4), column = columns_multi)
# 一种不常用的调整画布大小的方法
fig=plt.gcf()
fig.set_size_inches(20,9)

密度图

names = columns_multi
df.plot(kind='density', subplots=True, layout=(3,4), sharex=False)

特征间的关系

函数可视化探索数据特征间的关系

sns.pairplot(df, size=3, diag_kind="kde")

特征重要性

通过多种方式对特征重要性进行评估,将每个特征的特征重要的得分取均值,最后以均值大小排序绘制特征重要性排序图,直观查看特征重要性。

导入相关模块

from sklearn.feature_selection import RFE,RFECV, f_regression
from sklearn.linear_model import (LinearRegression, Ridge, Lasso,LarsCV)
from stability_selection import StabilitySelection, RandomizedLasso
from sklearn.preprocessing import MinMaxScaler
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVR

线性回归系数大小排序

回归系数(regression coefficient)在回归方程中表示自变量   对因变量   影响大小的参数。回归系数越大表示   对   影响越大。

创建排序函数

df = df.dropna()
Y = df['Adj Close'].values
X = df.values
colnames = df.columns# 定义字典来存储的排名
ranks = {}
# 创建函数,它将特征排名存储到rank字典中
def ranking(ranks, names, order=1):minmax = MinMaxScaler()ranks = minmax.fit_transform(order*np.array([ranks]).T).T[0]ranks = map(lambda x: round(x,2), ranks)res = dict(zip(names, ranks))return res

多个回归模型系数排序

# 使用线性回归
lr = LinearRegression(normalize=True)
lr.fit(X,Y)
ranks["LinReg"] = ranking(np.abs(lr.coef_), colnames)
# 使用 Ridge 
ridge = Ridge(alpha = 7)
ridge.fit(X,Y)
ranks['Ridge'] = ranking(np.abs(ridge.coef_), colnames)
# 使用 Lasso
lasso = Lasso(alpha=.05)
lasso.fit(X, Y)
ranks["Lasso"] = ranking(np.abs(lasso.coef_), colnames)

随机森林特征重要性排序

随机森林得到的特征重要性的原理是我们平时用的较频繁的一种方法,无论是对分类型任务还是连续型任务,都有较好对效果。在随机森林中某个特征X的重要性的计算方法如下:

  1. 对于随机森林中的每一颗决策树, 使用相应的OOB(袋外数据)数据来计算它的袋外数据误差 ,记为 .

  2. 随机地对袋外数据OOB所有样本的特征X加入噪声干扰 (就可以随机的改变样本在特征X处的值), 再次计算它的袋外数据误差 ,记为 .

  3. 假设随机森林中有   棵树,那么对于特征X的重要性,之所以可以用这个表达式来作为相应特征的重要性的度量值是因为:若给某个特征随机加入噪声之后,袋外的准确率大幅度降低,则说明这个特征对于样本的分类结果影响很大,也就是说它的重要程度比较高。

连续型特征重要性

对于连续型任务的特征重要性,可以使用回归模型RandomForestRegressorfeature_importances_属性。

X_1 = dataset[['Open', 'High', 'Low', 'Volume', 'Increase_Decrease','Buy_Sell_on_Open','Buy_Sell', 'Returns']]
y_1 = dataset['Adj Close']# 创建决策树分类器对象
clf = RandomForestRegressor(random_state=0, n_jobs=-1)
# 训练模型
model = clf.fit(X_1, y_1)
# 计算特征重要性
importances = model.feature_importances_
# 按降序排序特性的重要性
indices = np.argsort(importances)[::-1]
# 重新排列特性名称,使它们与已排序的特性重要性相匹配
names = [dataset.columns[i] for i in indices]
# 创建画布
plt.figure(figsize=(10,6))
# 添加标题
plt.title("Feature Importance")
# 添加柱状图
plt.bar(range(X.shape[1]), importances[indices])
# 为x轴添加特征名
plt.xticks(range(X.shape[1]), names, rotation=90)

分类型特征重要性

当该任务是分类型,需要用分类型模型时,可以使用RandomForestClassifier中的feature_importances_属性。

X2 = dataset[['Open', 'High', 'Low','Adj Close','Volume', 'Buy_Sell_on_Open', 'Buy_Sell', 'Returns']]
y2 = dataset['Increase_Decrease']clf = RandomForestClassifier(random_state=0, n_jobs=-1)
model = clf.fit(X2, y2)
importances = model.feature_importances_
indices = np.argsort(importances)[::-1]
names = [dataset.columns[i] for i in indices]
plt.figure(figsize=(10,6))
plt.title("Feature Importance")
plt.bar(range(X2.shape[1]), importances[indices])
plt.xticks(range(X2.shape[1]), names, rotation=90)
plt.show()

本案例中使用回归模型

rf = RandomForestRegressor(n_jobs=-1, n_estimators=50, verbose=3)
rf.fit(X,Y)
ranks["RF"] = ranking(rf.feature_importances_, colnames);

下面介绍两个顶层特征选择算法,之所以叫做顶层,是因为他们都是建立在基于模型的特征选择方法基础之上的,例如回归和SVM,在不同的子集上建立模型,然后汇总最终确定特征得分。

RandomizedLasso

RandomizedLasso的选择稳定性方法排序。

稳定性选择是一种基于二次抽样和选择算法相结合较新的方法,选择算法可以是回归、SVM或其他类似的方法。它的主要思想是在不同的数据子集和特征子集上运行特征选择算法,不断的重复,最终汇总特征选择结果,比如可以统计某个特征被认为是重要特征的频率(被选为重要特征的次数除以它所在的子集被测试的次数)。理想情况下,重要特征的得分会接近100%。稍微弱一点的特征得分会是非0的数,而最无用的特征得分将会接近于0。

lambda_grid = np.linspace(0.001, 0.5, num=100)
rlasso = RandomizedLasso(alpha=0.04)
selector = StabilitySelection(base_estimator=rlasso, lambda_name='alpha',lambda_grid=lambda_grid, threshold=0.9, verbose=1)
selector.fit(X, Y)
# 运行随机Lasso的选择稳定性方法
ranks["rlasso/Stability"] = ranking(np.abs(selector.stability_scores_.max(axis=1)), colnames)
print('finished')
{'Open': 1.0, 'High': 1.0, 'Low': 0.76, 
'Close': 1.0, 'Adj Close': 0.99, 'Volume': 0.0, 
'H-L': 0.0, 'O-C': 1.0, '3day MA': 1.0, 
'10day MA': 0.27, '30day MA': 0.75, 'Std_dev': 0.0}
finished

稳定性得分可视化

fig, ax = plot_stability_path(selector)
fig.set_size_inches(15,6)
fig.show()

查看得分超过阈值的变量索引及其得分

# 获取所选特征的掩码或整数索引
selected_variables = selector.get_support(indices=True)
selected_scores = selector.stability_scores_.max(axis=1)
print('Selected variables are:')
print('-----------------------')
for idx, (variable, score) in enumerate(zip(selected_variables, selected_scores[selected_variables])):print('Variable %d: [%d], score %.3f' % (idx + 1, variable, score))
Selected variables are:
-----------------------
Variable 1: [0], score 1.000
Variable 2: [1], score 1.000
Variable 3: [3], score 1.000
Variable 4: [4], score 0.990
Variable 5: [7], score 1.000
Variable 6: [8], score 1.000

RFE递归特征消除特征排序

基于递归特征消除的特征排序。

给定一个给特征赋权的外部评估器(如线性模型的系数),递归特征消除(RFE)的目标是通过递归地考虑越来越小的特征集来选择特征。

主要思想是反复的构建模型(如SVM或者回归模型)然后选出最好的(或者最差的)的特征(可以根据系数来选)。

  1. 首先,在初始特征集上训练评估器,并通过任何特定属性或可调用属性来获得每个特征的重要性。

  2. 然后,从当前的特征集合中剔除最不重要的特征。

  3. 这个过程在训练集上递归地重复,直到最终达到需要选择的特征数。

这个过程中特征被消除的次序就是特征的排序。因此,这是一种寻找最优特征子集的贪心算法。

RFE的稳定性很大程度上取决于在迭代的时候底层用哪种模型。例如,假如RFE采用的普通的回归,没有经过正则化的回归是不稳定的,那么RFE就是不稳定的;假如采用的是Ridge,而用Ridge正则化的回归是稳定的,那么RFE就是稳定的。

sklearn.feature_selection.RFE(estimator,*, n_features_to_select=None,step=1, verbose=0, importance_getter='auto')

estimator Estimator instance
一种带有""拟合""方法的监督学评估器,它提供关于特征重要性的信息(例如"coef_"、"feature_importances_")。

n_features_to_select int or float, default=None
要选择的功能的数量。如果'None',则选择一半的特性。如果为整数,则该参数为要选择的特征的绝对数量。如果浮点数在0和1之间,则表示要选择的特征的分数。

step int or float, default=1
如果大于或等于1,那么'step'对应于每次迭代要删除的(整数)特征数。如果在(0.0,1.0)范围内,则'step'对应于每次迭代中要删除的特性的百分比(向下舍入)。

verbose int, default=0
控制输出的冗长。

importance_getter str or callable, default='auto'
如果是'auto',则通过估计器的'coef_'或'feature_importances_'属性使用特征重要性。

lr = LinearRegression(normalize=True)
lr.fit(X,Y)
# 当且仅当剩下最后一个特性时停止搜索
rfe = RFE(lr, n_features_to_select=1, verbose =3)
rfe.fit(X,Y)
ranks["RFE"] = ranking(list(map(float, rfe.ranking_)),colnames, order=-1)
Fitting estimator with 12 features.
...
Fitting estimator with 2 features.

RFECV

递归特征消除交叉验证。

Sklearn提供了 RFE 包,可以用于特征消除,还提供了 RFECV ,可以通过交叉验证来对的特征进行排序。

# 实例化估计器和特征选择器
svr_mod = SVR(kernel="linear")
rfecv = RFECV(svr_mod, cv=5)# 训练模型
rfecv.fit(X, Y)
ranks["RFECV"] = ranking(list(map(float, rfecv.ranking_)), colnames, order=-1)
# Print support and ranking
print(rfecv.support_)
print(rfecv.ranking_)
print(X.columns)

LarsCV

最小角度回归模型(Least Angle Regression)交叉验证。

# 删除第二步中不重要的特征
# X = X.drop('sex', axis=1)
# 实例化
larscv = LarsCV(cv=5, normalize=False)
# 训练模型
larscv.fit(X, Y)
ranks["LarsCV"] = ranking(list(map(float, larscv.ranking_)), colnames, order=-1)
# 输出r方和估计alpha值
print(larscv.score(X, Y))
print(larscv.alpha_)

以上是两个交叉验证,在对特征重要性要求高时可以使用。因运行时间有点长,这里大家可以自行运行得到结果。

创建特征排序矩阵

创建一个空字典来存储所有分数,并求其平均值。

r = {}
for name in colnames:r[name] = round(np.mean([ranks[method][name] for method in ranks.keys()]), 2)
methods = sorted(ranks.keys())
ranks["Mean"] = r
methods.append("Mean")print("\t%s" % "\t".join(methods))
for name in colnames:print("%s\t%s" % (name, "\t".join(map(str, [ranks[method][name] for method in methods]))))
	Lasso	LinReg	RF	RFE	Ridge	rlasso/Stability	Mean
Open	1.0	1.0	0.02	0.91	0.47	1.0	0.73
High	0.14	0.0	0.1	0.36	0.06	1.0	0.28
Low	0.02	0.0	0.08	0.73	0.05	0.76	0.27
Close	0.14	0.0	0.64	0.55	0.32	1.0	0.44
Adj Close	0.02	1.0	1.0	0.82	1.0	0.99	0.8
Volume	0.0	0.0	0.0	0.0	0.0	0.0	0.0
H-L	0.0	0.0	0.0	0.45	0.01	0.0	0.08
O-C	0.85	1.0	0.0	1.0	0.53	1.0	0.73
3day MA	0.0	0.0	0.0	0.27	0.01	1.0	0.21
10day MA	0.0	0.0	0.02	0.09	0.0	0.27	0.06
30day MA	0.0	0.0	0.0	0.18	0.0	0.75	0.16
Std_dev	0.0	0.0	0.0	0.64	0.01	0.0	0.11

绘制特征重要性排序图

将平均得到创建DataFrame数据框,从高到低排序,并利用可视化方法将结果展示出。这样就一目了然,每个特征重要性大小。

meanplot = pd.DataFrame(list(r.items()), columns= ['Feature','Mean Ranking'])
# 排序
meanplot = meanplot.sort_values('Mean Ranking', ascending=False)
g=sns.factorplot(x="Mean Ranking", y="Feature", data = meanplot, kind="bar", size=14, aspect=1.9, palette='coolwarm')

关于Python金融量化

专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取30多g的量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、量化投资前沿分析框架,与博主直接交流、结识圈内朋友等。

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

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

相关文章

使用python进行股票分析

使用python进行股票分析 目录 使用python进行股票分析数据获取数据分析量价关系底部盘整止跌企稳 数据获取 数据获取可以看前一篇文章,各大股票开放接口介绍 数据分析 量价关系 当股价缩量回调时&#xff0c;我们需要进行关注&#xff0c;但是如何找出类似的股票呢&#xf…

使用Python对股票数据进行分析

最近越发痴迷研究金融产品,不仅仅是因为前段时间重新对板块进行了新的布局,也相信如果理财是一生都需要做的事也愿意花时间去好好研究一下.大部分人一致认为定投会受益,说的人多了大家也就不去验证了.今天突然心血来潮看有关金融的书籍发现一种很玄学的手段去买卖股票 也对 &q…

Python进行股票分析

Python进行股票分析 1.准备工作 可以结合视频进行学习&#xff0c;视频链接&#xff1a;视频 2.工具以及所需库 jupyter notebooktushare、pandas、numpy、matplotlib3.库的安装 打开anaconda prompt命令框输入以下命令&#xff1a;conda install pandasconda install numpyc…

我用Python写了个股票大数据分析工具,真香!

近日A股指数大波动&#xff0c;各路股神又纷纷登场&#xff01;但相比个人&#xff0c;通过Python技术来实现的量化交易更值得相信&#xff01; 什么是量化交易&#xff1f; 我们利用计算机技术&#xff0c;通过建模分析、优化参数等手段&#xff0c;从历史金融数据中挖掘出影响…

Python3对股票数据进行分析

目录 一、量化交易概述 1、量化交易&#xff08;投资方法&#xff09; 2、算法交易&#xff08;自动交易、黑盒交易或机器交易&#xff09; 3、量化策略 4、量化选股 5、股票回测 二、股票数据 三、股票数据分析 1、导入股票时间序列数据 2、绘制股票成交量的时间序列…

python股票数据简单分析

一、简单说明 1、需求 2、数据 3、 部分结果 画的图 筛选的股票 二、学习收获 1、如何将DataFrame列的object类型转为自己需要float类型&#xff1f; 这里成交量为例子 转为相应float类型&#xff1f; 具体方法是&#xff1a; 首先先将该字段转换成列表类型&#xff0c;列…

自己动手写股票数据分析软件之数据获取

前言 本文旨在分享编程经验&#xff0c;非炒股指导软件。 一、Tushare数据介绍 Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工 到 数据存储的过程&#xff0c;能够为金融分析人员提供快速、整洁、和多样的便于分析的数据&a…

程序员在群里“匿名”骂老板,第二天被开除,聊天记录曝光

程序员的工作是很辛苦的&#xff0c;不过报酬也是比较丰富&#xff0c;一个经验丰富的程序员&#xff0c;几万的工资很正常&#xff0c;要是有别的收入&#xff0c;兼职写代码&#xff0c;也能赚到不少钱。现在的程序员呢&#xff0c;是越来越多人想要去做了。好多人对程序员似…

百度程序员妻子质疑老公不忠!每天很晚回家!周五下班不回家,说领导带他喝酒!结婚一年就出轨?...

请点击上面  一键关注&#xff01; 前几天我们刚刚爆料了华为工程师因为老加班导致妻子出轨的故事&#xff0c;今天又有一位百度员工的妻子怀疑自己老公出轨.......互联网的世界究竟有多乱&#xff1f; 每天很晚回家&#xff0c;周五晚上说自己跟领导去喝酒......妻子心里忐忑…

AI大模型接管谷歌搜索:一夜之间,整个领域变天了

来源&#xff1a;机器之心 最近几个月&#xff0c;我们已经见识到各种 AI 工具被重新发明&#xff0c;微软先后将 Office 全家桶接入 GPT-4&#xff0c;最近又把必应和 ChatGPT 插件的能力全部注入到 Windows 系统。 与此同时&#xff0c;在搜索领域占据重要地位的谷歌也不甘落…

推荐 - 腾讯云技术社区公众号

今天向各位推荐的是腾讯云技术社区的公众号&#xff0c;是腾讯官方推出的技术知识分享阵地&#xff0c;每周公开腾讯最新的技术工程方案&#xff08;例如微信、健康码、王者荣耀等知名业务的技术架构&#xff09;、ChatGPT 等行业前沿热点解读、研发经验和工作方法等干货&#…

LLM系列 | 13: 如何链接多个Prompt处理复杂任务?以智能客服为例

简介 溪云初起日沉阁&#xff0c;山雨欲来风满楼。 小伙伴们好&#xff0c;我是微信公众号《小窗幽记机器学习》的小编&#xff1a;卖老班章的小女孩。紧接前面几篇ChatGPT Prompt工程和应用系列文章&#xff1a; 04:ChatGPT Prompt编写指南05:如何优化ChatGPT Prompt&…

chatgpt赋能python:Python调用蓝牙:从入门到实战

Python调用蓝牙&#xff1a;从入门到实战 如果你想要通过Python调用蓝牙&#xff0c;以此来读取和操作周围的设备&#xff0c;那么你已经来到了正确的地方。在本篇文章中&#xff0c;我们将探讨如何使用Python编程语言来与周围的蓝牙设备进行通信&#xff0c;为你的应用程序增…

chatgpt赋能python:如何使用Python操作蓝牙——一篇详细的教程

如何使用Python操作蓝牙——一篇详细的教程 蓝牙技术已经成为了我们生活中不可或缺的一部分&#xff0c;它可用于连接各种设备&#xff0c;例如耳机、音箱、手表&#xff0c;甚至是汽车。而Python作为一种广泛应用于各种领域的高级编程语言&#xff0c;也可以用来操作蓝牙设备…

做什么生意是最稳定的呢?

只要做生意就会有风险&#xff0c;钱存在银行最没有风险。 风险的大小取决于你承受能力&#xff0c;如果你只有几万元&#xff0c;那么摆地摊进货对于你来说都是大风险。如果你有几千万上亿&#xff0c;炒个十万的期货都对你来说无关紧要。 房产投资风险最小 投资也可以算是…

教你怎么鉴别发霉大米?

珍宝岛大米是黑龙江省鸡西虎林市的名优土特产&#xff0c;是鸡西市的三大地理标志保护产品之一。黑龙江省虎林市的虎林镇、杨岗镇、虎头镇、迎春镇、宝东镇、东方红镇、伟光乡、新乐乡、忠诚乡、阿北乡、珍宝岛乡等12个乡镇是经过我国农业部门实地考察过亲自验证的名优产地&…

设计模式——命令模式

在软件开发系统中&#xff0c;“方法的请求者”与“方法的实现者”之间经常存在紧密的耦合关系&#xff0c;这不利于软件功能的扩展与维护。例如&#xff0c;想对方法进行“撤销、重做、记录”等处理都很不方便&#xff0c;因此“如何将方法的请求者与实现者解耦&#xff1f;”…

java毕业设计——基于java+JavaBean+jsp的网上零食销售系统设计与实现(毕业论文+程序源码)——网上零食销售系统

基于javaJavaBeanjsp的网上零食销售系统设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于javaJavaBeanjsp的网上零食销售系统设计与实现&#xff0c;文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答…

2021年中国电饭锅(电饭煲)行业现状及前景分析:个性化消费推动市场向高端、智能化发展[图]

一、电饭锅&#xff08;电饭煲&#xff09;产业链 电饭煲又称作电锅&#xff0c;电饭锅。是利用转变为热能的&#xff0c;具有对进行、、炖、煲、煨等多种操作功能&#xff0c;使用方便、安全可靠。它不但能够把食物做熟&#xff0c;而且能够保温&#xff0c;使用起来清洁卫生&…

设计模式 -- 命令模式(14)

目录 前言定义优点与缺点优点缺点 结构与实现实现需求代码 前言 在现实生活中&#xff0c;命令模式的例子也很多。比如看电视时&#xff0c;我们只需要轻轻一按遥控器就能完成频道的切换&#xff0c;这就是命令模式&#xff0c;将换台请求和换台处理完全解耦了。电视机遥控器&…