保姆级教程:用Python和Tushare Pro免费获取A股上市公司数据(附完整代码)
2026/5/11 19:39:42 网站建设 项目流程

从零开始:Python实战获取A股上市公司全量数据指南

在金融数据分析和量化投资领域,获取准确、及时的上市公司基础数据是开展研究的首要步骤。对于刚接触这个领域的新手来说,往往面临数据源不稳定、接口复杂、文档晦涩等门槛。本文将带你使用Python生态中的Tushare Pro工具,以最小成本搭建一个专业级的数据获取系统。

Tushare Pro作为国内知名的金融数据接口,提供了包括股票、基金、期货在内的多种金融数据服务。其免费版本已经能够满足个人研究和小型项目的基本需求。我们将从环境配置开始,逐步实现以下目标:

  • 获取沪深两市所有上市公司基本信息
  • 理解关键参数的实际业务含义
  • 处理常见的数据获取异常
  • 将结果导出为Excel便于后续分析

1. 环境准备与工具配置

1.1 Python环境搭建

建议使用Python 3.7及以上版本,这是大多数金融数据分析库稳定支持的版本。如果你尚未安装Python,可以从官网下载安装包:

# 检查Python版本 python --version # 安装虚拟环境(推荐) python -m venv tushare_env source tushare_env/bin/activate # Linux/Mac tushare_env\Scripts\activate # Windows

提示:使用虚拟环境可以避免不同项目间的库版本冲突,是Python开发的最佳实践。

1.2 必要库安装

我们需要安装三个核心库:

pip install tushare pandas openpyxl
  • tushare:金融数据接口库
  • pandas:数据处理与分析工具
  • openpyxl:Excel文件读写支持

安装完成后,可以通过以下命令验证:

import tushare as ts print(ts.__version__)

2. Tushare Pro注册与配置

2.1 获取API Token

  1. 访问Tushare Pro官网注册账号
  2. 进入个人中心获取API Token
  3. 在代码中设置Token:
import tushare as ts pro = ts.pro_api('你的Token字符串')

注意:Token是访问API的凭证,请妥善保管不要泄露。免费版有每日调用次数限制,合理规划数据获取频率。

2.2 接口权限检查

免费版用户可以使用stock_basic接口获取上市公司基础信息。通过以下代码测试连接:

data = pro.stock_basic(exchange='', list_status='L') print(f"获取到{len(data)}条上市公司数据")

3. 上市公司数据获取实战

3.1 基础参数解析

stock_basic接口有几个关键参数需要理解:

参数名可选值说明
exchangeSSE/SZSE交易所代码:上交所/深交所
list_statusL/D/PL-上市 D-退市 P-暂停上市
is_hsH/S/N是否沪深港通标的

获取所有上市公司的完整调用示例:

# 获取沪深两市所有上市公司 df = pro.stock_basic( exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,market,list_date' )

3.2 数据处理技巧

获取到的数据是pandas DataFrame对象,我们可以进行各种数据处理:

# 查看数据结构 print(df.info()) # 按行业统计上市公司数量 industry_counts = df['industry'].value_counts() print(industry_counts.head(10)) # 筛选特定行业公司 tech_companies = df[df['industry'].str.contains('软件|半导体')]

4. 数据导出与异常处理

4.1 导出Excel文件

使用pandas的to_excel方法可以轻松导出:

# 简单导出 df.to_excel('上市公司列表.xlsx') # 带格式的进阶导出 with pd.ExcelWriter('上市公司列表_格式化.xlsx') as writer: df.to_excel(writer, sheet_name='基础信息', index=False) # 添加行业统计表 industry_counts.to_excel(writer, sheet_name='行业分布')

4.2 常见问题排查

问题1:接口返回空数据

  • 检查Token是否设置正确
  • 确认参数没有冲突(如同时指定exchange和is_hs)
  • 查看官方公告是否在维护时段

问题2:数据字段缺失

  • 在fields参数中明确指定需要的字段
  • 检查免费版权限是否包含该字段

问题3:调用频率限制

免费版每分钟最多调用500次,建议添加延时:

import time for code in stock_codes: data = pro.daily(ts_code=code) time.sleep(0.12) # 控制调用频率

5. 数据应用扩展

获取基础数据只是第一步,这些数据可以支持多种分析场景:

5.1 上市公司地域分布分析

import matplotlib.pyplot as plt area_counts = df['area'].value_counts().head(10) area_counts.plot(kind='barh', title='上市公司地域分布TOP10') plt.show()

5.2 上市时间分析

# 提取上市年份 df['list_year'] = df['list_date'].str[:4] # 统计各年上市公司数量 year_counts = df['list_year'].value_counts().sort_index() year_counts.plot(title='历年上市公司数量变化')

5.3 行业市盈率分析(需结合其他接口)

# 获取行业数据 industries = pro.stock_company(exchange='SSE', fields='industry,pe') # 计算行业平均市盈率 industry_pe = industries.groupby('industry')['pe'].mean().sort_values()

6. 性能优化建议

当数据量较大时,可以考虑以下优化方案:

6.1 批量请求模式

Tushare Pro支持批量获取数据,比单次循环效率更高:

# 批量获取日线数据 df = pro.daily(ts_code='600519.SH,000858.SZ', start_date='20230101', end_date='20231231')

6.2 数据本地缓存

使用本地数据库存储已获取的数据,减少API调用:

import sqlite3 # 建立本地缓存 conn = sqlite3.connect('stock_data.db') df.to_sql('stock_basic', conn, if_exists='replace', index=False)

6.3 异步请求处理

对于大量数据获取,可以使用异步IO提升效率:

import aiohttp import asyncio async def fetch_data(session, url): async with session.get(url) as response: return await response.json() async def main(): async with aiohttp.ClientSession() as session: tasks = [fetch_data(session, url) for url in url_list] return await asyncio.gather(*tasks)

在实际项目中,我发现将Tushare获取的数据与本地处理逻辑分离是很好的实践。可以建立一个专门的数据获取模块,统一处理Token管理、请求限流和错误重试等机制,让业务代码更专注于数据分析本身。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询