千家信息网

Python如何绘制持仓榜单的棒棒糖图

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章给大家分享的是有关Python如何绘制持仓榜单的棒棒糖图的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1. 需求做股票分析的朋友经常会见到类似这种的期货公司持仓榜单
千家信息网最后更新 2025年02月01日Python如何绘制持仓榜单的棒棒糖图

这篇文章给大家分享的是有关Python如何绘制持仓榜单的棒棒糖图的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

1. 需求

做股票分析的朋友经常会见到类似这种的期货公司持仓榜单图:

这种图就是棒棒糖图。也就是我们今天文章的目标:

绘制出期货持仓榜单的棒棒糖图

图中线的两端是圆点或者菱形,旁边都有标注持仓证券商和相对应的持多仓数或持空仓数,且左右线颜色不同。画图思路大体就是:先画水平线图,再用 scatter 散点图画线左右两端的点,然后标注两端名称,以及标题和注解。

Python 中比较常用的两种图表库是 matplotlib 和 plotly。上图就是以 matplotlib 绘制。而 Plotly 交互性更好。

更进一步,如果想让用户可以点击选择交易日期,查看该日期对应的榜单图,这就可以通过一个响应式 web 应用程序来实现。Dash 是一个基于 python 的交互式可视化 web 应用框架,matplotlib 和 Plotly 都可与 Dash 框架结合使用。

Matplotlib 大家比较熟悉。在开始之前,我们先简单介绍下 plotly 和 Dash。

2. Plotly

plotly 库(plotly.py)是一个交互式的开源绘图库,支持40多种独特的图表类型,涵盖各种统计,财务,地理,科学和三维用例,是适用于Python,R 和 JavaScript 的交互式图表库。

plotly.py 建立在 Plotly JavaScript 库(plotly.js)之上,使Python用户可以创建基于 Web 的漂亮交互式可视化效果。这些可视化效果可以显示在 Jupyter 笔记本中,可以保存到独立的 HTML 文件中,也可以作为纯 Python 使用。其官方文档上提供了各种图标的接口说明。

3. Dash

Dash 是用于构建 Web 应用程序的 Python 框架。Dash 建立在 Flask、Plotly.js 和 React.js 基础之上,即 Dash 中的控件和其触发事件都是用 React.js 包装的,Plotly.js 为 Dash 提供强大的交互式数据可视化图库,Flask 为其提供后端框架。这个框架对 python 程序员特别友好,只需要写 python 代码,不需要写 JS 代码,直接拖拽控件来用即可。感兴趣的童鞋可以去 Dash 的官方文档多多了解一下。Dash 是使用纯 Python 构建高度自定义用户界面的数据可视化应用程序的理想选择。它特别适合做数据分析、数据可视化以及仪表盘或者报告展示。可以将 Dash 应用程序部署到服务器,然后通过 URL 共享它们,不受平台和环境的限制。

4. 安装

在画图之前,我们需要装一下 Dash、plotly 相关包。可以用 pip 装:

pip install plotly dash或者也可以用 conda 进行安装。

5. 数据格式和数据处理

测试数据来自东方财富网,用 csv 文件格式保存。

数据的格式如下,header 是日期为第一列,第3列往后为期货公司名字。表格中的负数是上面图中蓝色的空仓,正数是红色的多仓。绘图时,从表格中取出某一日期的一行记录,将持仓数目排序,把对应的数据存入列表中,之后进行画图。

首先对数据进行清洗和处理, pandas读取数据,这里需要去除 000905_SH 列,以及删除全0行。代码如下:

excel_pd = pd.read_excel('data/IC期货商历史数据(1).xlsx', index_col='日期')# 去空excel_pd.dropna()# 去除000905_SH列excel_pd = excel_pd.drop(labels='000905_SH', axis=1)# 去0行excel_pd = excel_pd[~(excel_pd == 0).all(axis=1)]# 取出时间列表,获取最大日期和最小日期,为日历选项做判断date_list = excel_pd.index.values.tolist()min_date = min(date_list)max_date = max(date_list)

接下来我们需要根据输入的日期来筛选某一行记录,分别将持空仓期货公司和持多仓期货公司取出,剔除持仓数为0的期货公司。代码如下:

def get_data_via_date_from_excel(date):    # 筛选日期    sheet1_data = excel_pd.loc[date]    # 去除列值为0    sheet1_data = sheet1_data[sheet1_data != 0]    # 排序 从小到大    sheet1_data = sheet1_data.sort_values()    # 空仓    short_hold = sheet1_data[sheet1_data < 0]    # 多仓    long_hold = sheet1_data[sheet1_data >= 0].sort_values(ascending=False)    return short_hold, long_hold

6. 画图

Matplotlib画图

创建一张画布figure和ax画图层,用ax.hlines分别画空仓水平线和多仓水平线。用ax.scatter画左右两边线的散点,使用菱形marker。使用plt.text分别画线两端的标注期货公司和持仓数。plt.annotate画排名标注,分别设置颜色和字体大小。

但这个效果是反的,我们是希望排名最前面的在上,排名最后面的下。这时我们可以设置y轴反置一下ax.invert_yaxis()。添加图例和标题以及设置坐标轴不可见,得到最终效果:

核心代码如下:

def draw_lollipop_graph(short_hold, long_hold, date):    # sheet_major.index.values.tolist()    fig, ax = plt.subplots(figsize=(10, 8))    # 空仓水平线    ax.hlines(y=[i for i in range(len(short_hold))], xmin=list(short_hold), xmax=[0] * len(short_hold.index), color='#1a68cc', label='空')    # 多仓水平线    ax.hlines(y=[i for i in range(len(long_hold))], xmax=list(long_hold), xmin=[0] * len(long_hold.index), color='red', label='多')    # 画散点    ax.scatter(x=list(short_hold), y=[i for i in range(len(short_hold))], s=10, marker='d', edgecolors="#1a68cc", zorder=2, color='white')  # zorder设置该点覆盖线    ax.scatter(x=list(long_hold), y=[i for i in range(len(long_hold))], s=10, marker='d', edgecolors="red", zorder=2, color='white')  # zorder设置该点覆盖线    # 画线两端标注图    for x, y, label in zip(list(short_hold), range(len(short_hold)), short_hold.index):        plt.text(x=x, y=y, s=label+'({}) '.format(abs(x)), horizontalalignment='right', verticalalignment='center', fontsize=10)    for x, y, label in zip(list(long_hold), range(len(long_hold)), long_hold.index):        plt.text(x=x, y=y, s=' '+label+'({})'.format(abs(x)), horizontalalignment='left', verticalalignment='center', fontsize=10)    # 设置排名    size = [17, 16, 15] + [8 for i in range(max(len(short_hold), len(long_hold))-3)]    color = ['#b91818', '#e26012', '#dd9f10'] + ['#404040' for i in range(max(len(short_hold), len(long_hold))-3)]    for i, s, c in zip(range(max(len(short_hold), len(long_hold))+1), size, color):        plt.annotate(s=i+1, xy=(0, i), fontsize=s, ma='center', ha='center', color=c)    # 坐标轴y反置    ax.invert_yaxis()    # 坐标轴不可见    ax.set_xticks([])    ax.set_yticks([])    ax.spines['top'].set_visible(False)  # 去上边框    ax.spines['bottom'].set_visible(False)  # 去下边框    ax.spines['left'].set_visible(False)  # 去左边框    ax.spines['right'].set_visible(False)  # 去右边框    # 设置title    ax.set_title('黄金持仓龙虎榜单({})'.format(date), position=(0.7, 1.07), fontdict=dict(fontsize=20, color='black'))    # 自动获取ax图例句柄及其标签    handles, labels = ax.get_legend_handles_labels()    plt.legend(handles=handles, ncol=2, bbox_to_anchor=(0.75, 1.05), labels=labels, edgecolor='white', fontsize=10)    # 保存fig    image_filename = "lollipop_rank.png"    plt.savefig(image_filename)    encoded_image = base64.b64encode(open(image_filename, 'rb').read())    # plt.show()    return encoded_image

感谢各位的阅读!关于"Python如何绘制持仓榜单的棒棒糖图"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

数据 日期 期货 公司 期货公司 可视化 两端 交互式 代码 框架 水平 程序 应用 棒棒糖 应用程序 效果 水平线 图表 坐标 坐标轴 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 如何查邮箱服务器 总裁小说软件开发 淮安企业产品追溯软件开发 macos 服务器版本 计算机网络技术基础会计学 主题数据库建立方法有哪些 服务器维护是干什么的赚钱吗 初识数据库公开课 戴尔服务器广州总代理 2021大学生网络安全大赛 网络安全法律规定案例分析 java文件上传到服务器在哪 宾县开展网络安全宣传活动 服务器如何挂机赚钱 网络安全心理体会不少于200字 opc服务器软件开发包 软件开发工程师平常做什么 软件开发 国家收费标准 网络安全工程师分哪些岗位 职业发展软件开发岗 网络安全歌曲有哪些 安徽省暨合肥市网络安全展馆 sql判断表是否存在数据库中 服务器二手哪个好 企业服务平台软件开发 网络技术平台搭建 服务器电源市场有多大 文科能报网络安全管理吗 软件开发和人工智能哪个好就业 软件开发中的可行性研究
0