Python自动获取指定上市公司的所有财务数据(资产负债表,利润表,现金流量表)

案例背景 

很多经管类同学找财务数据都很困难,去找一个个查找特定的公司,然后又要去同花顺或者东方财富网一年一年的去查看报表,一年一年的数据一个个填入...太慢了。

tushare能获取金融数据的接口,他有资产负债表,利润表,现金流量表三个表全部的指标,每一年的年报基本都有,数据变量总共124多个,非常全面,什么净利润,营业收入,资产,负债,所有者权益,活动现金,应付账款等等,全都有。很简单就能获取这样标准整洁的财务数据:

这里就教大家怎么获取指定公司的财务数据。全部源代码都有,制作为程序的过程也有,

这个包的财务数据获取官网API接口示例为:Tushare数据

需要注意获取财务数据的权限需要2k的积分账户才行。

(PS:2k积分要充200RMB,当然有的同学嫌贵了或者不会弄代码,或者觉得后面的过程自己做起来麻烦可以咨询我获取我自己制作的程序来获取数据: 财务数据 )

(程序双击就能运行,自己改一下要获取的上市公司的名称就行,里面的源码嵌入的账号是我自己的,因此有权限获取财务数据)

tushare的财务指标很多很多,很全,下面是官网的资产负债表的部分变量:


代码实现

导入包:

import tushare as ts
import numpy as np
import pandas as pd   #导入第三方库

这里tushare需要获取财务数据,那么你的账户要有2k 的积分,我这里把自己的apikey打码了,同学可以自己去参考这个官网教程,然后注册账号获取自己的apikey:Tushare数据

#Tushare API
api_key = '9cd3***2509********************755**b4'
ts.set_token(api_key)
pro = ts.pro_api()

(ps:使用我做的程序就是我自己的账号,当然程序做了反编译,查看不到我的账户API,但是大家可以自己使用hh,使用很简单,双击就行。可以咨询我获取   财务数据 )


自己把要获取的上市公司的名称写到一个txt文件里面,

这个txt文件的名称命名为“公司名称列表.txt”:,

里面就写你要获取的A股的股票的名称,英文逗号隔开。换行也要英文逗号

然后自定义一个读取文件函数:

def read_file_to_list(file_path):try:with open(file_path, 'r', encoding='utf-8') as file:content = file.read()# 去除换行符content_no_newline = content.replace('\n', '')# 以逗号为分隔符,转换成列表content_list = content_no_newline.split(',')# 去除列表中的空字符串项content_list = [item for item in content_list if item]print('读取关键词成功')return content_listexcept FileNotFoundError:print(f"文件 {file_path} 未找到。")sleep(1)return []except Exception as e:print(f"读取文件时发生错误:{e}")sleep(1)return []

 读取,然后可以作为程序,自然就需要输入,可以输入你需要获取的开始的年份和结束的年份。

codes_names = read_file_to_list('公司名称列表.txt')
print(codes_names)
start_date=input('请输入开始年份(例如:“2016”)')
end_date=input('请输入结束的年份/不要大于当前年份不然可能报错(例如:“2023”)')start_date=start_date+'0101'  ;  end_date=end_date+'1231'
data = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')

获取这些股票的对应的股票代码 

codes=[]
for codes_name in codes_names:try:# 假设data是一个DataFrame,包含股票名称和代码longbai_code = data[data['name'].str.contains(codes_name)]['ts_code'].to_numpy()# 尝试获取第一个匹配的股票代码codes.append(longbai_code[0])print(f'{codes_name}的股票代码是:{longbai_code[0]}')except IndexError:# 当尝试访问longbai_code[0]但longbai_code是空的时候,会触发IndexError异常print(f'无法查询到{codes_name}对应的代码,请检查名称')
print(f"\n获取上述查询到代码的股票从{start_date}开始到{end_date}结束的财务数据")

如果你输入的股票名称是错的会找不到股票代码的。


获取对应股票代码和时间的财务数据:

def get_f(df):return df[df['报告期'].str.contains('1231')].reset_index(drop=True)def Company_Financial_Data(code='',start_date='20160101',end_date='20231231'):columns1=['公告日期','实际公告日期','报告类型 见底部表','公司类型(1一般工商业2银行3保险4证券)','报告期类型']income_data = pro.income(ts_code=code, start_date=start_date, end_date=end_date).rename(columns=variables_dict).iloc[:,:-1].drop_duplicates(['报告期']).drop(columns=columns1)income_data = get_f(income_data)columns2=['公告日期','实际公告日期','报表类型','公司类型(1一般工商业2银行3保险4证券)','报告期类型']balance_sheet = pro.balancesheet(ts_code=code, start_date=start_date, end_date=end_date).rename(columns=variables_dict_2).iloc[:,:-1].drop_duplicates(['报告期']).drop(columns=columns2)balance_sheet = get_f(balance_sheet)columns3=['公告日期','实际公告日期','报表类型','公司类型(1一般工商业2银行3保险4证券)','报告期类型']cash_flow = pro.cashflow(ts_code=code, start_date=start_date, end_date=end_date).rename(columns=variables_dict_3).iloc[:,:-1].drop_duplicates(['报告期']).drop(columns=columns3)cash_flow=get_f(cash_flow)merged_df = pd.merge(cash_flow, balance_sheet, on='报告期', how='inner', suffixes=('', '_balance'))# 再次合并时,对 income_data 使用不同的后缀final_merged_df = pd.merge(merged_df, income_data, on='报告期', how='inner', suffixes=('', '_income'))# 假设你想保留 cash_flow 中的 'TS股票代码' 列,你可以删除其他重复的 'TS股票代码' 列final_merged_df=final_merged_df.drop(columns=['TS股票代码_balance', 'TS股票代码_income']).dropna(axis=1, how='any')return final_merged_df

然后对前面获取的股票代码进行循环:获取成功后就保存到一个excel里面不同的sheet里面。

with pd.ExcelWriter('上市公司财务数据.xlsx', engine='xlsxwriter') as writer:for code in codes:print(f'{code}财务数据储存成功')df = Company_Financial_Data(code=code,start_date=start_date,end_date=end_date)# Write each DataFrame to a different worksheet, using the stock code as the sheet namedf.to_excel(writer, sheet_name=code,index=False)

这样你代码程序运行的文件夹下就会多一个“上市公司财务数据.xlsx”的表格文件了,里面每一个sheet就是一个公司,每一面就是一个公司的制定年份的所有财务数据。

 很整洁,也很好用。然后大家再这个里面挑选自己需要的财务数据取做实证分析或者别的数据分析研究就行。

源代码到这里就结束了,下面是怎么把这个代码变成exe文件。


 代码打包为exe可执行的程序

由于我自己的电脑环境的Python里面没有tushare这个库,所以我需要再anaconda环境里面去对我的脚本代码打包。

我问了一下gpt,需要这样做:
 

  1. 确认 Anaconda 环境:确保你在 Anaconda Prompt 中运行命令。这可以保证你使用的是 Anaconda 的 base 环境。

  2. 在 base 环境中安装 PyInstaller:如果还没有安装 PyInstaller,确保在 base 环境中安装它。可以使用命令 conda install pyinstallerpip install pyinstaller

  3. 使用 Anaconda 环境的 Python 解释器运行 PyInstaller:在 Anaconda 的 base 环境中,你也可以找到 Python 解释器的路径,并使用它来确保运行的是正确的解释器。使用 Anaconda Prompt,可以通过 where python (Windows) 或 which python (Mac/Linux) 来找到 Python 解释器的确切路径。然后,使用该路径直接运行 PyInstaller,例如:

    C:\Users\YourUsername\anaconda3\python.exe -m PyInstaller --onefile your_script.py

    替换上面的路径为你的实际 Python 解释器路径。

  4. 检查环境变量:即使是在 base 环境中,也确保 Anaconda 的安装路径(尤其是包含 Python 解释器的路径)已经添加到了你的系统环境变量中。

通过这些步骤,即使在 Anaconda 的 base 环境中,也能确保 PyInstaller 使用正确的环境进行打包。如果你按照上述步骤操作后仍遇到问题,可能需要检查具体的错误信息,看看是否有其他原因导致的问题。

 我自己在anaconda prompt 里面输入:(先切换到需要储存的路径,找到自己的py解释器的位置where python

D:\Anaconda\python.exe -m PyInstaller --onefile D:\AAA最近要用\接单项目\种子叶绿素\财务数据\行业财务数据.py

 就会在你的前缀后面的文件路径里面生成你需要的exe文件,就在dist里面的,

这个程序双击就能运行,很简单。但是需要你先在和这个程序统一文件夹下面放入自己需要的上市公司名称的txt文件。

我们来看看运行效果:

运行完了在这个文件夹下面就会多了一个Excel表,里面就是需要的公司的数据了。

是不是很简单?如果觉得上面流程很麻烦,可以咨询我获取这个我做好的程序可以参考:  财务数据
双击就能运行,这样大家就可以很容易轻松获取自己需要的上市公司的所有财务数据了。

然后再选出自己需要的变量进行分析。


创作不易,看官觉得写得还不错的话点个关注和赞吧,本人会持续更新python数据分析领域的代码文章~(需要定制类似的代码和数据可私信)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/751486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

upload-labs第一关

上一篇文章中搭建好了upload-labs环境,接下来进行第一关的尝试,我也是第一次玩这个挺有意思。 1、第一关的界面是这样的先不看其他的源码,手动尝试下试试。 2、写一个简单的php一句话木马 3、直接上传,提示必须要照片格式的文…

HarmonyOS(鸿蒙)ArcUI组件

方舟开发框架(简称ArkUI)为HarmonyOS应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能(组件、布局、动画以及交互事件),以及实时界面预览工具等,可以支持开发者进行可视化界面…

蓝桥杯单片机快速开发笔记——矩阵键盘

一、原理分析 二、思维导图 三、示例框架 定义了四个位控制变量,用于控制键盘扫描时的行列信号。 在Scan_Keys()函数中,首先设置行列信号,将其中一个行信号置为0,另一个行信号置为1,同时将列信号置为1,用于…

【Redis知识点总结】(四)——如何保证缓存与数据库中的数据一致性

Redis知识点总结(四)——如何保证缓存与数据库中的数据一致性 更新缓存删除缓存先删除缓存后更新数据库先更新数据库后删除缓存 使用canal总结 面试会经常遇到这种问题:你们如何保证缓存与数据库中的数据一致性?或者是&#xff1a…

*波动数列c++

题目 输入样例: 4 10 2 3输出样例: 2样例解释 两个满足条件的数列分别是2 4 1 3和7 4 1 -2。 思路 上来先理解题意,本题求的是“长度为n 总和为s的……数列的数目”。 假设第一项为x,增加 a 或者减少 b用di表示,…

【Spring Boot 源码学习】深入应用上下文初始化器实现

《Spring Boot 源码学习系列》 深入应用上下文初始化器实现 一、引言二、往期内容三、主要内容3.1 spring-boot 子模块中内置的实现类3.1.1 ConfigurationWarningsApplicationContextInitializer3.1.2 ContextIdApplicationContextInitializer3.1.3 DelegatingApplicationConte…

【智能算法】斑鬣狗优化算法(SHO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过。 3.代码实现4.参考文献 1.背景 2017年,Dhiman等人受到斑鬣狗自然狩猎行为启发,提出了斑鬣狗优化算法(Spotted Hyena Optimizer, SHO)。 2.算法原理 2.1算法思想 SHO将斑鬣狗狩猎行为分为围捕-狩猎-进攻三…

Python入门(三)

序列 序列是有顺序的数据集合。序列包含的一个数据被称为元素,序列可以由一个或多个元素组成,也是可以没有任何元素的空序列。 序列的类型 元组(定值表):一旦建立,各个元素不可再更变,所以一…

Wireshark抓包工具的使用

提示:本文为学习记录,若有错误,请联系作者,谦虚受教 文章目录 前言一、下载二、首页三、使用1.读入数据2.分析数据3.筛选IP4.保存数据 四、过滤器表达式五、TCP总结 前言 低头做事,抬头看路。 一、下载 下载路径wire…

【论文笔记合集】LSTNet之循环跳跃连接

本文作者: slience_me LSTNet 循环跳跃连接 文章仅作为个人笔记 论文链接 文章原文 LSTNet [25] introduces convolutional neural networks (CNNs) with recurrent-skip connections to capture the short-term and long-term temporal patterns. LSTNet [25]引入…

【Java刷题篇】串联所有单词的子串

这里写目录标题 📃1.题目📜2.分析题目📜3.算法原理🧠4.思路叙述✍1.进窗口✍2.判断有效个数✍3.维护窗口✍4.出窗口 💥5.完整代码 📃1.题目 力扣链接: 串联所有单词的子串 📜2.分析题目 阅…

口腔管理平台 |基于springboot框架+ Mysql+Java+B/S结构的口腔管理平台 设计与实现(可运行源码+数据库+lw文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 会员功能 系统功能设计 数据库E-R图设计 lunwen参考…

智慧公厕建设的主要目标是什么?

随着城市化进程的不断推进,公共厕所作为城市基础设施的重要组成部分,也变得越来越重要。为了提升公共厕所的管理水平、提供更好的服务质量,智慧公厕应运而生。智慧公厕的建设旨在通过信息化手段实现公共厕所的全面感知监测,实现公…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:FormLink)

提供静态卡片交互组件,用于静态卡片内部和提供方应用间的交互,当前支持router、message和call三种类型的事件。 说明: 该组件从API Version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 该组件仅可…

6.【Linux】进程间通信(管道命名管道||简易进程池||简易客户端服务端通信)

介绍 进程间通信的方式 1.Linux原生支持的管道----匿名和命名管道 2.System V-----共享内存、消息队列、信号量 3.Posix------多线程、网路通信 进程间通信目的 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。…

【C++刷题】优选算法——动态规划第一辑

1.状态表示是什么?简答理解是dp表里的值所表示的含义怎么来的?题目要求经验题目要求分析问题的过程中,发现重复子问题 2.状态转移方程dp[i]......细节问题:3.初始化控制填表的时候不越界4.填表顺序控制在填写当前状态的时候&#…

腾讯云免费服务器配置大全和个人企业申请流程,2024年新版教程

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM,轻量配置可选2核2G3M、2核8G7M和4核8G12M,CVM云服务器可选2核2G3M和2核4G3M配置,腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

蓝桥杯每日一题——棋盘

问题描述 小蓝拥有 n xn 大小的棋盘,一开始棋盘上全都是白子。小蓝进行了 m 次操作,每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色,黑色棋子变为白色)请输出所有操作做完后棋盘上每个棋子的颜色。输入格式 输入的…

卷积神经网络算法原理(卷积层,卷积运算,填充,步幅,经过卷积运算后的特征图大小,池化层,最大池化,平均池化,经过池化层运算后的特征图大小)

文章目录 卷积神经网络算法原理(卷积层,卷积运算,填充,步幅,经过卷积运算后的特征图大小,池化层,最大池化,平均池化,经过池化层运算后的特征图大小)前言1、图像的本质1.1、灰度图1.2…

Java学习笔记(16)

常见算法 查找算法 查询某个元素是否存在 二分查找(数组元素必须是有序的) package exercise;public class exercise1 {public static void main(String[] args) {int[] arr {7, 23, 797, 23, 79, 81, 103, 127, 131, 147};System.out.println(binar…