最近这两天股民基友们可能很多亏得底裤都没了,该说点什么呢,心态放平吧:
想长期混迹股市,还是要选基本面好的行业和个股,也要关注一些近期行业动态。当然这里面有很多维度和技巧,掌握得越多,驾驭股市的功力就越强。
今天我就来分享一个用pandas, numpy和matplotlib来做简单的行业“成交额”分析的python程序,简单改改就可以变成“成交量”或者“市值”等其他维度的分析。
首先假设我这里用到的输入数据格式为下图, 当然啦,就本程序而言,不是每一列都用得到,但大家如果需要可以自行改进程序利用其它维度,
(可以从这里获取每日excel数据:http://www.gupiaoexcel.com/)
目标是要得到2021-01-28日的各行业成交额情况,期望输出如下图:
下面给出程序全文,在python 3.6下测试通过,如果是python 2,可能略需改动,如需在本地运行,需要自行调整好输入输出文件路径
import pandas as pd
from collections import defaultdict
from matplotlib import pyplot as plt
import numpy as np
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
def def_value():
return 0
amountmap = defaultdict(def_value)
date_str="2021-01-28"
input_file = "/tmp/{0}股票数据.xlsx".format(date_str)
output="/tmp/行业日成交额{0}.png".format(date_str)
def draw_a_pie_chart(input_dict):
industries = []
data = []
for k, v in amountmap.items():
industries.append(k)
data.append(v)
data_np = np.array(data)
industries_np=np.char.array(industries)
_ = plt.figure(figsize=(10, 7))
plt.title(date_str+'日行业成交额',loc='center')
plt.pie(data_np)
# show plot
porcent = 100.*data_np/data_np.sum()
# print(porcent)
patches, _ = plt.pie(data_np, startangle=20, radius=1.2)
labels = ['{0} = {1:1.2f} %, 成交额(万元):{2}'.format(i, j,k) for i, j, k in zip(industries_np, porcent,data_np)]
sort_legend = True
if sort_legend:
patches, labels, _ = zip(*sorted(zip(patches, labels, data_np),
key=lambda x: x[2],
reverse=True))
plt.legend(patches, labels, loc='best', bbox_to_anchor=(-0.4, 2.),
fontsize=8)
plt.savefig(output, bbox_inches='tight')
print("文件存储到: {0}".format(output))
# plt.show()
if __name__ == "__main__":
excel_data_df = pd.read_excel(input_file, sheet_name='Sheet1')
df = pd.DataFrame(excel_data_df, columns=['行业', '成交额'])
for index, row in df.iterrows():
industry = row['行业']
if(not isinstance(industry, str) or len(industry) < 1):
continue
amount = row['成交额']
amountmap[industry] = amountmap[industry]+amount
draw_a_pie_chart(amountmap)
程序本身比较简单,就是用pandas读入excel数据的两列,行业和成交额,然后按行业累加得到一个字典数据结构,大概就是:
{'白酒',***成交额},
{'半导体',***成交额},
A股本身就4000多支,数据量不大,所以不用担心dict爆掉的情况。
然后用matplotlib把这个字典结构绘制成饼图,当然这个饼图会比较难看,因为被切得太细了,如果有需要,完全可以只显示top N的行业。
从上面的比例看,白酒的成交额还是比我们互联网行业高啊。。
同样的方法统计了下元器件成交额的top 10:
,你妹。。。感觉可以抄底京东方A或者等几天再抄底
简单统计了下近一周稳定在top 10的几个行业:
'证券', '小金属', '半导体', '软件服务', '白酒', '医疗保健', '化工原料'