AKShare

AKShare是一个开源财经数据接口库,所采集的数据皆来自公开的数据源,本文目的是当上市公司发布财报时,在同花顺上获取其关键指标并输出摘要,可以用来写行研的日报等。

选择AKShare的原因:免费且能迅速获得数据,tushare、baostock等库一般不能获得当天发的财报数据,而AKShare可以获得各大权威财经网站的数据。

安装akshare库后,导入所需库:

import akshare as ak
import tkinter as tk
from tkinter import messagebox

这里只获取同花顺上的关键财务指标数据(akshare关键指标有新浪和同花顺两个网站的,新浪可以获得int数据,但是更新较慢),目标网址:中兴通讯(000063) 财务概况_F10_同花顺金融服务网 (10jqka.com.cn)

注意到数据都是带单位的,不过都保留了两位小数,可以用于摘要,首先写下处理数据的函数:

def remove_unit(money): # 去除单位部分,转化为元if money[-2:] == "万亿":money = float(money.replace("万亿", "")) * 1000000000000elif money[-1] == "亿":money = float(money.replace("亿", "")) * 100000000elif money[-1] == "万":money = float(money.replace("万", "")) * 10000else:money = float(money)return moneydef get_unit(money):  # 将元转为为亿元或万元或万亿元if abs(money) > 1000000000000:scale = 1e-12result = f"{money * scale:,.2f}万亿元"elif abs(money) > 10000000:scale = 1e-8result = f"{money * scale:,.2f}亿元"else:scale = 1e-4result = f"{money * scale:,.2f}万元"return resultdef str2percentage(percentage_string):return float(percentage_string.strip('%'))  # 将字符串形式的涨跌幅转变为小数形式

根据数据生成摘要

函数如下,注意参数和后面的函数要对应。这里的代码稍显麻烦,主要是在描述同比涨跌幅时公司有要求,具体生成的格式大家可按自己的要求进行更改。

def generate_summary(name, period_desc, revenue, revenue_change, profit, profit_change, pre_profit):if revenue_change > 0:revenue_desc = f"同比上升{revenue_change:.2f}%"elif revenue_change < 0:revenue_desc = f"同比下降{abs(revenue_change):.2f}%"else:revenue_desc = "同比持平"if profit >= 0 and pre_profit >= 0:if profit > pre_profit:profit_decs = f"同比上升{profit_change:.2f}%"elif profit < pre_profit:profit_decs = f"同比下降{abs(profit_change):.2f}%"else:profit_decs = "同比持平"elif profit > 0 > pre_profit:profit_decs = "扭亏为盈"elif profit < 0 < pre_profit:profit_decs = "转盈为亏"else:  # 连年亏损if abs(profit) > abs(pre_profit):profit_decs = "亏损扩大"elif abs(profit) < abs(pre_profit):profit_decs = "亏损减少"else:profit_decs = "同比持平"# 转化为亿元、万元的单位revenue = get_unit(revenue)profit = get_unit(profit)summary = f"【{name}】{period_desc}实现营业总收入{revenue},{revenue_desc};" \f"归母净利润{profit},{profit_decs}。"return summary

获取摘要

需要输入报告期和股票代码。(这里只获取营收和利润数据,注意同花顺上这个净利润实际上是指归母净利润)

date_mapping_1 = {"03-31": "季度报告:","06-30": "半年度报告:","09-30": "季度报告:","12-31": "年度报告:"
}
date_mapping_2 = {"03-31": "Q1","06-30": "H1","09-30": "前三季度","12-31": "年"
}def get_summary():period = period_entry.get()code_list = code_list_entry.get().split(',')try:results = []  # 输出结果title = date_mapping_1.get(period[5:], "未知")  # 摘要标题if title == "未知":messagebox.showerror("报告期错误")return  # 结束函数的运行quarter = date_mapping_2.get(period[5:], "未知")  # 季度描述# 获取去年同期的报告期字符串year = period[:4]  # 获取前四个字符int_year = int(year) - 1  # 将前四个字符转换为数字并减去1last_year = str(int_year).zfill(4)  # 将得到的数字转换为字符串,补齐至四位yoy_period = period.replace(year, last_year, 1)  # 替换字符串的前四个字符,得到去年同期的报告期period_desc = f"{title}公司{year}{quarter}"# 对每个输入的code取数据for code in code_list:# 检查code能否匹配公司try:company = ak.stock_individual_info_em(symbol=code)name = company.iloc[5][1]except KeyError:results.append(f"{code}:无法匹配\n")continue# 从同花顺获取关键财务指标try:data = ak.stock_financial_abstract_ths(symbol=code, indicator="按报告期")data = data.set_index(data.columns[0])except KeyError:results.append(f"{code}:{name}获取财报数据失败\n")continue# 判断是否存在数据try:revenue = remove_unit(data.loc[period, "营业总收入"])revenue_change = str2percentage(data.loc[period, "营业总收入同比增长率"])profit = remove_unit(data.loc[period, "净利润"])profit_change = str2percentage(data.loc[period, "净利润同比增长率"])# 获取去年归母净利润数据pre_profit = remove_unit(data.loc[yoy_period, "净利润"])except KeyError:results.append(f"{code}:{name}报告未更新\n")continue# 调用函数获取财报摘要,并保存在输出列表中summary = generate_summary(name, period_desc, revenue, revenue_change, profit, profit_change, pre_profit)results.append(f"{summary}\n")result_text.config(state='normal')  # 将输出区域状态更改为可编辑result_text.delete('1.0', tk.END)  # 清空区域result_text.insert(tk.END, "\n".join(results))  # 将输出列表中的内容以换行符分隔,添加到输出区域中result_text.config(state='disabled')  # 将输出区域状态更改为不可编辑except Exception as e:messagebox.showerror("Error", f"获取摘要时出错:{str(e)}")# 创建主窗口
root = tk.Tk()
root.title("日报-财务报告摘要akshare")# 添加标签和输入框
period_label = tk.Label(root, text="请输入报告期(如2023-06-30)")
period_label.pack()period_entry = tk.Entry(root)
period_entry.pack()code_list_label = tk.Label(root, text="请输入公司code(多个则以英文逗号分隔)")
code_list_label.pack()code_list_entry = tk.Entry(root, width=100)
code_list_entry.pack()# 添加按钮
run_button = tk.Button(root, text="运行", command=get_summary)
run_button.pack()# 添加结果显示区域
result_text = tk.Text(root, height=30, width=120, state='disabled')
result_text.pack()# 启动 GUI 循环
root.mainloop()

运行结果示例

(公司发日报后大概3-5分钟能够获得数据)

akshare的打包

首先创建一个干净的虚拟环境,并下载akshare、pyinstaller库。(不用虚拟环境的话打包出的文件可能会非常大)

在你想要创建虚拟环境的目录中打开终端(直接在地址栏键入cmd然后回车),依次输入:

python -m venv akshare-venv      
akshare-venv\Scripts\activate

pip install akshare Pyinstaller

然后将写好的py文件放到创建的文件夹中:

接着就可以开始打包了,但akshare的打包往往会出问题,打包后会缺少两个关键文件,这里可以使用这位博主的方法:使用pyinstaller将akshare打包exe,无法运行终极解决方法_ibearpig的博客-CSDN博客

将源码修改后,在终端中运行:(路径要设置正确)

pyinstaller.exe -F -w akshare-ths.py --add-data D:\Python\akshare-venv\Lib\site-packages\py_mini_racer\mini_racer.dll;.

打包完成后,点开dist文件夹,此时运行exe还是会报错,我们在exe程序的相同目录中创建名为akshare的文件夹,并在其中创建名为file_fold的文件夹,然后在akshare-venv\Lib\site-packages\akshare\file_fold中找到calendar.json这个文件,将它复制到我们创建的file_fold里。

再次运行exe即可成功打开。

Python:用AKShare获取上市公司财报关键指标数据、输出日报摘要并打包成exe相关推荐

  1. python用PyQt5实现一个简单的表白软件(代码实现+py文件打包成exe文件)

    1.代码+py文件打包方法 功能说明:除了点击同意按钮外,软件不会关闭,不同意按钮不会被鼠标点击生效,会不断的被鼠标触发移动 2.上代码: 注:使用该程序之前需要安装pyqt5, pip instal ...

  2. 打包可执行包_想把你写的Python程序发给别人用?打包成exe啊!

    前言 大家好,欢迎来到编程教室! 当你学了一段时间Python,终于写出一个小游戏的时候,是不是很想发给你的小伙伴分享一下你的成果?但是,如果直接将xx.py文件发给别人,别人通常是不能直接运行的,他 ...

  3. python打包成exe文件大、执行慢_Pyinstaller打包exe太大,运行太慢

    1.背景 通过python使用pyqt编写了一个界面程序,并使用pyinstaller将其打包成exe文件 2.问题 打包的exe文件非常大,有280M,而且更无法忍受的是打开非常非常的慢!!! 3. ...

  4. 如何用python获取美股财报日历

    自7月份开始,美股迎来二季度财报季,包含微软,特斯拉,AMD在内的行业翘楚纷纷公布了二季度财报,而且都超过市场预期.美股财报是美股投资者非常关注的数据资讯,本文将介绍如何用python获取财报日历. ...

  5. 菜鸟读财报,如何从上市公司财报中挖情报?--微博转载

    [菜鸟读财报,如何从上市公司财报中挖情报?]❶财务数据重点看主营业务收入而不是利润.❷收入.利益要按不同业务类型分别加以分析.❸现金周转情况.折旧情况.年终拥有现金数量等指标同样值得关注.❹纵向.横向 ...

  6. python——生成带logo的二维码图片并且保存、控制打印机打印图片二维码、整合打印(获取输入框的值)、打包成exe文件

    1.生成带logo的二维码图片并且保存 前提条件:在D盘里有logo.png的图片,生成的二维码图片在D盘里的111.png import qrcode from PIL import Image# ...

  7. 把python语言翻译出来_Python语言实现翻译小工具(Python打包成exe文件)

    本文主要向大家介绍了Python语言实现翻译小工具(Python打包成exe文件),通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 1.环境 windows10 python3.5 ...

  8. Python学习之道-打包成exe程序

    Python学习之道-打包成exe程序 一.打包成exe程序 Pyinstaller安装 作用 使用 Pyinstaller相关参数 Pyinstaller使用总结 尽量用from.....impor ...

  9. 用 Python 做个学生管理系统,并打包成exe文件

    由于Python都会了,学校教的确实基础,平时就没怎么去上课,让美女老师天天脑壳痛,这不快毕业了,让我做一个学生管理系统出来,还要打包成exe发给她,她就不追究我不上课的问题了~ 话说这能难倒我吗?赶 ...

  10. 别再问我Python打包成exe了!(终极版)

    大家好,我是小五 <老板又出难题,气得我写了个自动化软件> 上次这篇文章中,评论区有好几条留言都是关心如何将python脚本打包成10多M的? 那今天小五就给大家全面总结一下:Python ...

最新文章

  1. 【错误归纳】selenium.common.exceptions.WebDriverException: Message: unknown error
  2. 报名 | 从滴滴出行数据透视中国城市空间发展讲座
  3. 精通python网络爬虫-精通python网络爬虫
  4. android 串口调试adb,Android系统 debug 技巧(最全最强adb 串口调试命令)
  5. STM32F1笔记(十三)SPI
  6. php 微信分享链接怎么弄,PHP实现 微信--分享朋友链接
  7. html input触发器类型,几种触发器的Verliog语言描述
  8. 轻松看懂概率论与图论基础数学知识
  9. 前向算法(Forward Algorithm)
  10. poj-3034 Whac-a-Mole
  11. 编译安装Nginx以及配置运行Drupal 8,实现上传进度功能
  12. 基于Web的酒店客房管理系统
  13. python根据汉字获得拼音,python获取一组汉字拼音首字母的方法 -电脑资料
  14. 关于删除/卸载win10自带IE 11浏览器后恢复问题
  15. 2015070610 - 看到很多所谓的大牛
  16. easyExcel 复杂表头 动态表头
  17. win10三国志14已停止工作解决方法--win10专业版
  18. index ffs、index fs原理考究
  19. POI利用word模板动态生成word报表以及动态生成word表格
  20. mysql索引类型normal,unique,full text的区别?

热门文章

  1. Matlab-(2)
  2. 数字技术能让古籍“活过来”吗?
  3. Web3D产品建模可视化三维模型,产品如何展示?
  4. 【计算机毕业设计】125四六级报名与成绩查询系统
  5. vant 索引城市不对_vant IndexBar实现的城市列表
  6. ubuntu(18.04)中架设HiGlass docker镜像服务,已尝试mcool、bedpe、wig格式文件
  7. PgSQL · 应用案例 · PostgreSQL flashback(闪回) 功能实现与介绍
  8. 珠海有什么教育机构学计算机,珠海学习计算机,珠海学计算机去哪里,珠海学计算机效果怎么样 - IT教育频道...
  9. 折线图geom_line()参数选项
  10. 【视频】经历五个双11,逼死50个设计师,今年没人肯干,怎么办?