【程序员股民系列】如何用python, pandas, numpy, matplotlib绘制每日行业成交额图

最近这两天股民基友们可能很多亏得底裤都没了,该说点什么呢,心态放平吧:

想长期混迹股市,还是要选基本面好的行业和个股,也要关注一些近期行业动态。当然这里面有很多维度和技巧,掌握得越多,驾驭股市的功力就越强。

今天我就来分享一个用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的几个行业:

 '证券', '小金属', '半导体', '软件服务', '白酒', '医疗保健', '化工原料'

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值