• 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.3015.06.08这两天个股的涨跌情况。分析思路跟上面类似,我就直接说数据了。

    牛市期间99.6%的股票都是涨的,也就是说个股基本都在上涨。来看看涨幅分布

    可以看到,86%只股票翻了一番,所以牛市来了,基本上闭着眼选股都能挣钱。也不知道这种大牛市什么时候能再来一次,当然了,牛市来了能不能把握住是个大问题。

    我的分析就到这里了,其实分析有意思的数据还有很多,比如结合一些市盈率等其他维度进行分析,有兴趣的朋友可以自行探索,我觉得还有一个更有挑战性的分析是预测个股的走势,虽然实践上不可行,但从学习角度来看还是挺值得研究的,如果大家点赞较多,我下周考虑写一下。

    数据和源码已经打包,公众号回复关键字股票即可。

    欢迎公众号 「渡码」 输出别地儿看不到的干货。

  • 相关阅读:
    Flex Charting: Format Your X And Y Axis
    Flex Charting: Format Your Data Tips The Same As Your Axes
    高质量的开源Flex UI组件库项目(FlexLib)
    今天学习Flex3.2嵌入图片,值得说道的是如何嵌入scale9 缩放的图像
    zz[as3 hack技术]垃圾回收机强制执行
    Spark Skinning (including SkinnableComponent) Functional and Design Specification
    Flex DataTransforms类的理解
    关于AS3中弱引用的一点理解
    flex 元字符
    收集整理了一些AS3中常用到的公式
  • 原文地址:https://www.cnblogs.com/duma/p/13382912.html
Copyright © 2020-2023  润新知