如何使用Tushare快速获取指定公司财务数据:全面教程与API接口示例
案例背景

很多经管类同学在找财务数据时面临困难,他们需要逐个查找特定的公司,接着还要前往同花顺或者东方财富网,一年一年地查看报表,并且将一年一年的数据逐个填入,整个过程非常缓慢。
tushare 拥有获取金融数据的接口,其中包含资产负债表、利润表、现金流量表这三个表的全部指标,每年的年报通常都具备这些指标,数据变量总计 124 多个,涵盖非常全面,像净利润、营业收入、资产、负债、所有者权益、活动现金、应付账款等,全都包含其中。获取这样标准整洁的财务数据是很容易的:
这里会教大家如何获取指定公司的财务数据。我们拥有全部的源代码,同时也有将其制作成程序的过程。
这个包获取财务数据的官网 API 接口示例是:Tushare 数据。
需要注意获取财务数据的权限需要2k的积分账户才行。
2k 积分需要充 200RMB。有些同学觉得价格贵,或者不会弄代码,又或者觉得后面的过程自己做起来麻烦,他们可以咨询我,以获取我自己制作的用于获取财务数据的程序。
程序双击即可运行,只需自行修改要获取的上市公司名称即可。其中的源码嵌入的账号是我自己的,所以我有权限获取财务数据。
tushare 拥有众多的财务指标,且这些指标很全面。以下是官网资产负债表的部分变量:
代码实现
导入包:
import tushare as ts
import numpy as np
import pandas as pd #导入第三方库
这里需要获取财务数据的话,你的账户需有 2k 的积分。我把自己的 apikey 进行了打码处理,同学们可以自行参考这个官网教程,接着注册账号来获取自己的 apikey:Tushare 数据。
#Tushare API
api_key 等于 '9cd3***2509********************755**b4'
ts.set_token(api_key)
pro = ts.pro_api()
使用我做的程序就相当于使用我自己的账号,尽管程序被反编译了,无法查看我的账户 API,但大家可以自行使用 hh,使用起来很简便,只需双击即可。同时,大家可以咨询我来获取财务数据。
自己把要获取的上市公司的名称写到一个txt文件里面,
这个txt文件的名称命名为“公司名称列表.txt”:,
请写出你要获取的 A 股的股票的名称,并用英文逗号隔开。
然后自定义一个读取文件函数:
读取文件并转换为列表。通过指定的文件路径来读取文件内容,然后将这些内容逐行添加到一个列表中,最终返回这个包含文件内容的列表。
try:
打开文件(file_path),以只读模式('r')打开,并设置编码为 utf-8,将其赋值给变量 file 。
content = file.read()
# 去除换行符
将字符串中的换行符 \n 替换为空字符串。
# 以逗号为分隔符,转换成列表
将 content_no_newline 按照逗号进行分割,得到的结果赋值给 content_list 。
# 去除列表中的空字符串项
对于 content_list 中的每一个 item,如果 item 不为空,就将其保留在 content_list 中。
print('读取关键词成功')
return content_list
except FileNotFoundError:
print(f"文件 {file_path} 未找到。")
sleep(1)
return []
except Exception as e:
print(f"读取文件时发生错误:{e}")
sleep(1)
return []
读取之后可以作为程序,自然就需要有输入,能够输入你所需要获取的开始年份以及结束年份。
读取文件“公司名称列表.txt”并将其转换为列表,这个列表被命名为 codes_names 。
print(codes_names)
输入开始年份,例如:“2016”,并将其赋值给 start_date
请输入结束的年份,不要大于当前年份,不然可能报错,例如:“2023”。
start_date 等于 start_date 加上 '0101' ;end_date 等于 end_date 加上 '1231'
data 是通过 pro.stock_basic 函数获取的,在该函数中,设置了 exchange 为空字符串,list_status 为 'L',并且指定了要获取的字段为 'ts_code,symbol,name,area,industry,list_date'。
获取这些股票的对应的股票代码
codes=[]
对于 codes_name 这个变量,它在 codes_names 这个列表中。
try:
假设 data 是一个包含股票名称和代码的 DataFrame 。
在 data 中,找到 name 列包含指定 codes_name 的数据行,然后获取这些行的 ts_code 列数据,并将其转换为 numpy 数组,赋值给 longbai_code
# 尝试获取第一个匹配的股票代码
codes.append(longbai_code[0])
打印出“{codes_name}的股票代码是:{longbai_code[0]}”
except IndexError:
当尝试访问 longbai_code 的第一个元素即 longbai_code[0]时,如果 longbai_code 为空,就会触发 IndexError 异常。
打印出“无法查询到指定的 codes_name 对应的代码,请检查名称”
结束时间为 end_date
如果你输入的股票名称是错的会找不到股票代码的。
获取对应股票代码和时间的财务数据:
def get_f(df):
获取 df 中满足'报告期'列的值包含'1231'的行,然后重置索引并删除原来的索引,得到新的 DataFrame 。
定义一个函数 Company_Financial_Data,该函数接受三个参数,分别是 code(默认为空字符串)、start_date(默认为 20160101)和 end_date(默认为 20231231)。
- 报告期类型。
income_data 是通过 pro.income 函数获取的,传入的参数为 ts_code=code、start_date=start_date、end_date=end_date,然后对获取到的数据进行重命名,重命名的列名由 variables_dict 确定,接着选取除最后一列之外的所有列,再去除重复的行,重复行的依据是['报告期'],最后删除指定的 columns1 列。
通过某种方式对 income_data 进行处理,使其成为了 get_f(income_data) 的形式。
- “报告期类型”。
使用指定的 ts_code、start_date 和 end_date 从 pro 中获取资产负债表数据,然后对列名进行重命名,使用 variables_dict_2 进行映射,接着选取除最后一列以外的所有列,再根据'报告期'去重,最后删除指定的 columns2 列。
获取到的是 balance_sheet 相关的内容,即 balance_sheet 等于 get_f(balance_sheet) 。 具体来说,是通过特定的函数 get_f 对 balance_sheet 进行了某种操作或获取了相关信息,最终得到的结果就是 balance_sheet 本身。 也就是说,balance_sheet 与通过 get_f 函数处理后的结果是相等的。
“报告期类型”。
cash_flow 等于 pro 调用 cashflow 函数,传入参数 ts_code 为 code,start_date 为 start_date,end_date 为 end_date,然后重命名列名,将列名按照 variables_dict_3 进行重命名,接着选取除最后一列之外的所有列,再去除重复行,以“报告期”为依据去除重复行,最后删除 columns3 中的列。
cash_flow=get_f(cash_flow)
merged_df 是通过将 cash_flow 和 balance_sheet 进行合并得到的,合并的依据是 '报告期',合并方式为 'inner',并且在列名后缀上分别添加了空字符串和 '_balance'
# 再次合并时,对 income_data 使用不同的后缀
final_merged_df 是通过将 merged_df 与 income_data 按照 '报告期' 进行内连接合并得到的,连接方式为 'inner',并且在列名上添加了后缀(无后缀和 '_income' 后缀)。
假设你希望保留 cash_flow 中的“TS 股票代码”列,那么你可以将其他重复的“TS 股票代码”列删除。
final_merged_df 先删除列 ['TS股票代码_balance', 'TS股票代码_income'],然后在轴 1 上进行删除操作,条件是任何一个值为缺失值(how='any')
return final_merged_df
接着对之前获取到的股票代码进行循环操作。一旦获取成功,就将其保存到一个 Excel 文件中不同的工作表里。
使用 pd.ExcelWriter('上市公司财务数据.xlsx', engine='xlsxwriter') 作为 writer,进行相关操作。
for code in codes:
打印出“{code}财务数据储存成功”。
df 是通过传入 code=code、start_date=start_date、end_date=end_date 这些参数来获取 Company_Financial_Data 的数据
将每个 DataFrame 写入不同的工作表,以股票代码作为工作表名称。
df 被写入到 writer 中,使用 sheet_name 为 code,并且不显示索引,即 index=False。
你的代码程序运行的文件夹下会多一个表格文件,其名为“上市公司财务数据.xlsx”。这个表格文件中,每一个 sheet 对应一个公司,每一个 sheet 里包含的是该公司指定年份的所有财务数据。
很整洁,并且很好用。接着,大家可以在这个里面挑选自己所需要的财务数据,用于进行实证分析或者其他的数据分析研究。
源代码到这里就结束了,下面是怎么把这个代码变成exe文件。
代码打包为exe可执行的程序
我的电脑环境中的 Python 没有 tushare 这个库。因此,我需要在 anaconda 环境中对我的脚本代码进行打包。
我问了一下gpt,需要这样做:
确认 Anaconda 环境:要保证你是在 Anaconda Prompt 里运行命令。这样能确保你使用的是 Anaconda 的 base 环境。
在 base 环境里安装 PyInstaller:要是还未安装 PyInstaller,那就得保证在 base 环境中进行安装。能够运用命令 conda install pyinstaller 或者 pip install pyinstaller。
使用 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 解释器路径。
检查环境变量。在 base 环境里,要确保 Anaconda 的安装路径,特别是包含 Python 解释器的路径,已经被添加到了系统环境变量中。
通过这些步骤,即便在 Anaconda 的 base 环境里,也能够保证 PyInstaller 使用恰当的环境来进行打包。若你依照上述步骤进行操作之后依然碰到问题,或许就需要去查验具体的错误信息,查看是否存在其他原因所引发的问题。
我在 anaconda prompt 中进行输入操作,首先切换到需要储存的路径,接着找到自己的 py 解释器的位置(即 where python)。
参数后的内容是 D:\AAA 最近要用\接单项目\种子叶绿素\财务数据\行业财务数据.py 。
在你的前缀后面的文件路径中会生成你需要的 exe 文件,该文件位于 dist 里面。
这个程序双击便可运行,操作较为简单。不过,你需要先将自己所需的上市公司名称的 txt 文件放置在与这个程序处于同一文件夹之下。
我们来看看运行效果:
运行结束后,在这个文件夹下面会多出一个 Excel 表,该表里面是所需的公司的数据。
很简单吗?若认为上面的流程麻烦,可咨询我以获取我做好的程序,可参考:财务数据。
双击即可运行,这样大家就能很便捷地获取自己所需的上市公司的所有财务数据。
然后再选出自己需要的变量进行分析。
创作是不容易的,如果你觉得写得还不错,那么请点个关注和赞吧。我会持续更新 python 数据分析领域的代码文章。(如果需要定制类似的代码和数据,可以私信我。)