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.08
5年時間裡個股漲跌情況。起點選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%
只股票翻了一番,所以牛市來了,基本上閉著眼選股都能掙錢。也不知道這種大牛市什麼時候能再來一次,當然了,牛市來了能不能把握住是個大問題。
我的分析就到這裡了,其實分析有意思的數據還有很多,比如結合一些市盈率
等其他維度進行分析,有興趣的朋友可以自行探索,我覺得還有一個更有挑戰性的分析是預測個股的走勢,雖然實踐上不可行,但從學習角度來看還是挺值得研究的,如果大家點贊較多,我下周考慮寫一下。
數據和源碼已經打包,公眾號回復關鍵字股票即可。
歡迎公眾號 「渡碼」 輸出別地兒看不到的乾貨。