Python数据分析之股票数据
最近股市比较火,我7月初上车了,现在已经下了。中间虽然吃了点肉,但下车的时候都亏进去了,最后连点汤都没喝着。
这篇文章我们就用python对股票数据做个简单的分析。数据集是从1999年到2016年上海证券交易所的1095只股票。
共1000个文件。
我们的分析思路大致如下:
每年新发股票数 目前市值最大的公司有哪些 股票一段时间的涨跌幅如何 牛市的时候,个股表现如何
首先导入模块
import pandas as pd
import numpy as np
import os
import seaborn as sns
import matplotlib.pyplot as plt
# 绘图显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
用pandas读文件
file_list = os.listdir('./data/a-share/')
pieces = []
for file_name in file_list:
path = './data/a-share/%s' % file_name
file = pd.read_csv(path, encoding ='gb2312')
pieces.append(file)
shares = pd.concat(pieces)
使用read_csv读文件的时候需要指定文件编码encoding ='gb2312'。将各个文件的DataFrame合并后,将索引重置一下,并预览一下数据
shares.reset_index(inplace=True, drop=True)
shares.head()
这里我们最关注的列是日期、代码、简称、收盘价。
按照分析思路,我们首先来看看上市公司的总数
len(shares['代码'].unique())
对股票代码去重、计数可以看到一共有1095家上市公司。那我们再看看每年新增的上市公司有多少家
# 计算每只股票的最早交易时间(即:上市时间)
shares_min_date = shares.groupby('简称').agg({'日期':'min'})
shares_min_date['上市年份'] = shares_min_date['日期'].apply(lambda x: str(x)[:4])
# 每年上市公司的数量
shares_min_date.groupby('上市年份').count().plot()
可以看到,多的时候每年60-80家,而05年-13年这段时间上市后的公司特别少,尤其是13年只有1家,原因是13年暂停了IPO。
下面我们再来看看数据集中最新的时间点(2016-06-08),市值较大的公司有哪些
shares_market_value = shares[shares['日期'] == '2016-06-08'][['简称', '总市值(元)']].sort_values(by='总市值(元)', ascending=False)
# 市值最大的公司 top10
tmp_df = shares_market_value.head(10)
# 画图
sns.barplot(x=tmp_df['总市值(元)'], y=tmp_df['简称'])
截至16年6月8号,工商银行(爱存不存)的市值最高1.5万亿,不愧是宇宙第一大行。并且能发现市值前十的公司大部分是银行。
下面再来看看,从11.06.09 - 16.06.085年时间里个股涨跌情况。起点选11.06.09的原因是这一天包含了900左右只股票,样本较大。然后,我们抽取这两天股票的收盘价,计算涨跌幅
shares_110609 = shares[shares['日期'] == '2011-06-09'][['代码', '简称', '收盘价(元)']]
shares_160609 = shares[shares['日期'] == '2016-06-08'][['代码', '收盘价(元)']]
# 按照股票代码将2天数据关联
shares_price = shares_110609.merge(shares_160609, on='代码')
shares_price
一共有879只股票
# 多少家股票是上涨的
shares_price[shares_price['涨跌幅(%)'] > 0].count()
# 多少家股票是上涨的
shares_price[shares_price['涨跌幅(%)'] < 0].count()
可以看到,上涨的股票627只,占比71%。那我们再来看看,上涨的股票,涨幅分布情况
bins = np.array([0, 40, 70, 100, 1700])
# 股价上涨的公司
shares_up = shares_price[shares_price['涨跌幅(%)'] > 0]
# 按涨幅进行分组
shares_up['label'] = pd.cut(shares_up['涨跌幅(%)'], bins)
# 分组统计
up_label_count = shares_up[['label', '代码']].groupby('label').count()
up_label_count['占比'] = up_label_count['代码'] / up_label_count.sum().values
sns.barplot(x=up_label_count['占比'], y=up_label_count.index)
涨幅分布还是比较极端的,虽然上涨的股票总体比较高,但上涨的股票中有30%只股票涨幅不足40%,也就是平均一年涨8%,如果理财年收益10%算及格的话,8%明显偏低了。再加上跌的股票,收益率低于10%的股票大于50%,所以股市的钱也不是那么好挣的。
当然也有踩狗屎运的时候,比如买到了下面这些股票并且长期持有
# 涨幅最大的公司
tmp_df = shares_up.sort_values(by='涨跌幅(%)', ascending=False)[:8]
sns.barplot(y=tmp_df['简称'], x=tmp_df['涨跌幅(%)'])
像金证股份持有5年后可以翻16倍。
同样的方式,我们可以看看股票跌幅分布
因为代码类似,这里就不贴了。从数据上将近70%的股票5年后跌幅在0-40%的区间。
最后一个有意思的数据,我们看看牛市的时候个股涨跌是怎么样的。我们选择14.06.30和15.06.08这两天个股的涨跌情况。分析思路跟上面类似,我就直接说数据了。
牛市期间99.6%的股票都是涨的,也就是说个股基本都在上涨。来看看涨幅分布
可以看到,86%只股票翻了一番,所以牛市来了,基本上闭着眼选股都能挣钱。也不知道这种大牛市什么时候能再来一次,当然了,牛市来了能不能把握住是个大问题。
我的分析就到这里了,其实分析有意思的数据还有很多,比如结合一些市盈率等其他维度进行分析,有兴趣的朋友可以自行探索,我觉得还有一个更有挑战性的分析是预测个股的走势,虽然实践上不可行,但从学习角度来看还是挺值得研究的,如果大家点赞较多,我下周考虑写一下。
数据和源码已经打包,公众号回复关键字股票即可。
欢迎公众号 「渡码」 输出别地儿看不到的干货。
Python数据分析之股票数据的更多相关文章
- 用Python爬取股票数据,绘制K线和均线并用机器学习预测股价(来自我出的书)
最近我出了一本书,<基于股票大数据分析的Python入门实战 视频教学版>,京东链接:https://item.jd.com/69241653952.html,在其中用股票范例讲述Pyth ...
- python数据分析之pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
1 引言 Pandas是作为Python数据分析著名的工具包,提供了多种数据选取的方法,方便实用.本文主要介绍Pandas的几种数据选取的方法. Pandas中,数据主要保存为Dataframe和Se ...
- Python 数据分析中金融数据的来源库和简单操作
目录 金融数据 pandas-datareader TuShare 金融学图表 案例 金融数据 数据分析离不开数据的获取,这里介绍几种常用的获取金融方面数据的方法. pandas-datareader ...
- Python 数据分析实战 | 用数据带你回顾乔丹的职业生涯
乔丹是联盟上下公认的历史第一人,芝加哥公牛在他带领下几乎统治了上世纪 90 年代 NBA 整整 10 年,包括分别在 91-93 赛季和 96-98 赛季拿下的两次三连冠,要知道,NBA72 年历史上 ...
- 《Python 数据分析》笔记——数据的检索、加工与存储
数据的检索.加工与存储 1.利用Numpy和pandas对CSV文件进行写操作 对CSV文件进行写操作,numpy的savetxt()函数是与loadtxt()相对应的一个函数,他能以诸如CSV之类的 ...
- python数据分析之:数据加载,存储与文件格式
前面介绍了numpy和pandas的数据计算功能.但是这些数据都是我们自己手动输入构造的.如果不能将数据自动导入到python中,那么这些计算也没有什么意义.这一章将介绍数据如何加载以及存储. 首先来 ...
- Python 数据分析—第九章 数据聚合与分组运算
打算从后往前来做笔记 第九章 数据聚合与分组运算 分组 #生成数据,五行四列 df = pd.DataFrame({'key1':['a','a','b','b','a'], 'key2':['one ...
- 【Python 数据分析】pandas数据导入
导入CSV文件数据 环境 C:\Users\Thinkpad\Desktop\Data\信息表.csv 语法 pd.read_csv(filename):从CSV文件导入数据 实现代码 import ...
- 《Python数据分析》笔记——数据可视化
数据可视化 matplotlib绘图入门 为了使用matplotlib来绘制基本图像,需要调用matplotlib.pyplot子库中的plot()函数 import matplotlib.pyplo ...
随机推荐
- 【转】HBase的MapReduce调用
参考: https://blog.csdn.net/u012848709/article/details/83744699 自己照着搭建了下,顺便把坑也踩了下,项目见云盘: 链接:https://pa ...
- EFCore-一对一配置外键小记2
前后两次遇到这样的错误: The property 'xx' on entity type 'xxxx' has a temporary value. Either set a permanent v ...
- .NET Core控制台利用【Options】读取Json配置文件
创建一个 .NET Core控制台程序 添加依赖 Microsoft.Extensions.Configuration Microsoft.Extensions.Configuration.FileE ...
- python简易版微信或QQ轰炸
在讲解代码之前我们先来回忆一下,平时我们发送消息时,先打开微信或QQ的界面,在信息栏中输入你要发送的内容在点击发送或通过快捷键发送.如果要发送表情时,先打开微信或QQ的界面,在点击表情包中你要发送 ...
- Spring Boot注解大全,一键收藏了!
本文首发于微信公众号[猿灯塔],转载引用请说明出处 今天是猿灯塔“365天原创计划”第5天. 今天呢!灯塔君跟大家讲: Spring Boot注解大全 一.注解(annotations)列表 @Spr ...
- MSIL入门(一)C#代码与IL代码对比
基础概念 Microsoft中间语言(MSIL),也成为通用中间语言(CIL),是一组与平台无关的指令,由特定于语言的编译器从源代码生成.MSIL是独立于平台的,因此,他可以在任何公共语言基础架构支持 ...
- JVM零碎知识
JVM常见XX参数 查看JVM默认值 常用基本配置参数 生产环境服务器变慢,如何诊断 生产环境CPU占用过高,如何诊断 JDK自带的JVM监控和性能分析工具 jps(虚拟机进程状况工具) jinfo( ...
- Django---进阶8
目录 前后端传输数据的编码格式(contentType) ajax发送json格式数据 ajax发送文件 django自带的序列化组件(drf做铺垫) ajax结合sweetalert 批量插入 分页 ...
- Django---进阶13
目录 数据库表创建及同步 注册功能 登陆功能 bbs是一个前后端不分离的全栈项目,前端和后端都需要我们自己一步步的完成 表创建及同步 注册功能 forms组件 用户头像前端实时展示 ajax 登陆功能 ...
- docker自动化部署前端项目实战一
docker自动化部署前端项目实战一 本文适用于个人项目,如博客.静态文档,不涉及后台数据交互,以部署文档为例. 思路 利用服务器node脚本,监听github仓库webhook push事件触发po ...