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

news2025/1/13 7:47:08

案例背景 

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

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_list
    except 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 name
        df.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.coloradmin.cn/o/1523985.html

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

相关文章

idea warning:java源值已过时将在未来所有发行版中删除

在idea中运行maven项目 如果出现idea warning:java源值已过时将在未来所有发行版中删除,详见如下截图所示: 注意:jdk8 要解决这个警告需要设置3个地方 首先打开File->Project Structure中的Project,将SDK和language level都设…

Java学习笔记(15)

JDK7前时间相关类 Date时间类 Simpledateformat Format 格式化 Parse 解析 默认格式 指定格式 EE:表示周几 Parse:把字符串时间转成date对象 注意:创建对象的格式要和字符串的格式一样 Calendar日历类 不能创建对象 Getinstance 获取当…

Python笔记|字符串合并、切片、索引

一、合并 字符串可以用 合并(粘到一起),也可以用 * 重复: >>> 3 * un ium unununium 相邻的两个或多个字符串字面值(引号标注的字符)会自动合并: >>> Py thon Python …

蓝桥杯每日一题 走迷宫bfs 超超详细解释!!!

昨天学习了bfs的基本概念&#xff0c;今天来做一道经典习题练练手吧&#xff01; bfs常用的两类题型 1.从A出发是否存在到达B的路径(dfs也可) 2.从A出发到B的最短路径&#xff08;数小:<20才能用dfs&#xff09; 遗留的那个问题的答案- 题目&#xff1a;走迷宫 答案&…

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

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

力扣L14--- 415.字符串相加(JAVA版)-2024年3月17日

1.题目 2.知识点 注1&#xff1a;你可以使用Integer.parseInt()或Double.parseDouble()等方法将字符串转换为整数或浮点数。 public class Main {public static void main(String[] args) {String str "123";int num Integer.parseInt(str);System.out.println(…

如何在Mac中删除照片?这里有详细步骤

前言 本文介绍如何从Mac中删除照片,以释放硬盘空间或更好地组织文件和文件夹。 如何使用废纸篓删除Mac上的图片 在Mac上删除图片的最简单方法之一是使用废纸篓功能。学习只需几秒钟。下面是如何删除单个图片以及如何在Mac上删除多个图片,以及一些关键和有用的提示,以使该…

2023全球国际专利申请数量公布:华为遥遥领先三星、高通、苹果~

华为、三星和高通在2023年的国际专利申请数量上位居前三甲&#xff0c;其中来自中国的公司大幅度超越韩国和美国的高科技竞争对手。世界知识产权组织&#xff08;WIPO&#xff09;最新发布的数据显示&#xff0c;即使面临美国严厉制裁严重影响其在全球市场的运作能力&#xff0…

HTML静态网页成品作业(HTML+CSS)——家乡广州介绍设计制作(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 二、作品演示 三、代…

AI泳池溺水识别摄像机

AI泳池溺水识别摄像机是一种利用人工智能技术来监测和识别游泳池中溺水行为的智能监控设备。通过深度学习算法和图像识别技术&#xff0c;该摄像机能够实时捕捉游泳池的画面&#xff0c;自动分析水面动态和人员行为&#xff0c;判断是否有溺水事件发生&#xff0c;并及时发出警…

浅谈虚拟机下部分内网穿透功能实现方法

新钛云服已累计为您分享789篇技术干货 最近个人搭建服务器的情况有所增长&#xff0c;简单介绍一下一些可以使得服务器能被公网ip访问的方法。内网穿透一般用于将位于内部私有网络&#xff08;如家庭网络&#xff09;的服务暴露到公共网络&#xff08;如互联网&#xff09;上&a…

Java解决完全二叉树的节点个数

Java解决完全二叉树的节点个数 01 题目 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的…

java集合框架——Map集合概述

前言&#xff1a; 之前接触了单列合集&#xff0c;现在又接触了双列合集。整理下心得&#xff0c;打好基础&#xff0c;daydayup&#xff01;&#xff01; Map集合 Map集合称为双列集合&#xff0c;也被称为“键值对集合”。格式&#xff1a;{key1value1,key2value2...}&#…

4-如何进行细分市场分析- 04 案例分析 健身房行业投资项目

现在运用前面学过的如何进行细分市场分析的1、2 、3 &#xff0c;以健身房行业投资项目为例来进行细分市场的分析&#xff1a;首先是画行业的产业链&#xff0c;如下图&#xff0c;注意其中的关键节点&#xff0c; 接着对市场竞争者进行进行细分和特征分析&#xff0c;确定主要…

docker引擎

目录 一、Docker引擎发展历程 二、docker引擎架构 三、docker引擎分类 四、docker引擎安装 4.1安装条件 4.2 使用rpm存储库安装 4.2.1设置存储库 4.2.2安装docker引擎 4.2.3启动docker,并设置docker开机自启动 五、卸载docker引擎 5.1.卸载 Docker 引擎、CLI、conta…

python二级备考(2)-简单应用题

第1套 使用turtle库的turtle. right()函数和turtle.fd()函数绘制一个菱形&#xff0c;边长为200像素&#xff0c;4个内角度数为2个60度和2个120度 键盘输入一组人员的姓名、性别、年龄等信息&#xff0c;信息间采用空格分隔&#xff0c;每人一行&#xff0c;空行回车结束录入&a…

无人机机载频谱监测方案助力空中频谱监测与干扰排查

作者介绍 一、方案背景 频谱资源是通信最重要的资产之一&#xff0c;随着宽带无线业务的快速增长&#xff0c;对频率资源的需求大幅增加。未来频率资源的供需矛盾将非常突出&#xff0c;空中频谱环境也会越来越复杂&#xff0c;对于工程师来说&#xff0c;在复杂的电磁环境条件…

Unload-labs-pass-03

这里是设置了黑名单不能传.asp.aspx.php.jsp文件 $is_upload false; $msg null; if (isset($_POST[submit])) {if (file_exists(UPLOAD_PATH)) {$deny_ext array(.asp,.aspx,.php,.jsp);$file_name trim($_FILES[upload_file][name]);$file_name deldot($file_name);//删…

GPT-4.5 Turbo详细信息被搜索引擎泄露:有重大改进

3月14日消息&#xff0c;据外电报道&#xff0c;OpenAI 最新人工智能模型 GPT-4.5 Turbo 的详细信息已通过 Bing 和 DuckDuckGo 的搜索引擎索引过早泄露。 GPT-4.5 Turbo 的产品页面在正式发布之前就出现在搜索结果中&#xff0c;引发了人们对 OpenAI 最新型号的特性和功能的猜…

0基础 三个月掌握C语言(11)

字符函数和字符串函数 为了方便操作字符和字符串 C语言标准库中提供了一系列库函数 接下来我们学习一下这些函数 字符分类函数 C语言提供了一系列用于字符分类的函数&#xff0c;这些函数定义在ctype.h头文件中。这些函数通常用于检查字符是否属于特定的类别&#xff0c;例如…