news 2026/5/27 3:12:44

别再到处找数据了!用Python+Tushare Pro免费获取A股行情与财务数据(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再到处找数据了!用Python+Tushare Pro免费获取A股行情与财务数据(附完整代码)

Python+Tushare Pro:金融数据获取与本地化存储实战指南

金融数据分析的第一步往往也是最令人头疼的一步——如何高效获取可靠的市场数据。传统的手动复制粘贴不仅耗时耗力,还容易出错;而市面上许多所谓的"免费"数据接口要么不稳定,要么数据格式混乱。本文将带你用Python+Tushare Pro构建一套完整的金融数据解决方案,从注册到存储,彻底解决数据获取难题。

1. 环境配置与基础准备

1.1 Tushare Pro注册与Token获取

Tushare Pro是目前国内最完善的金融数据接口之一,提供股票、基金、期货等多种市场数据。要使用完整功能,需要先完成以下步骤:

  1. 访问 Tushare Pro官网 注册账号
  2. 登录后进入"个人中心"获取API Token
  3. 记下你的Token(类似1234567890abcdefg1234567890abcdefg

注意:免费账号有一定调用限制,如需高频访问可考虑升级会员

1.2 Python环境搭建

推荐使用Anaconda创建独立环境,避免包冲突:

conda create -n finance python=3.8 conda activate finance pip install tushare pandas numpy

验证安装是否成功:

import tushare as ts print(ts.__version__) # 应输出类似1.2.3的版本号

2. 核心数据接口详解

2.1 行情数据获取实战

Tushare Pro提供多种粒度的行情数据,以下是最常用的几种:

接口名称描述关键参数返回字段示例
daily日线行情ts_code, trade_dateopen, high, low, close
weekly周线行情start_date, end_datevol, amount
monthly月线行情adjpre_close, change

获取贵州茅台(600519.SH)最近30个交易日数据:

import tushare as ts pro = ts.pro_api('你的token') df = pro.daily(ts_code='600519.SH', start_date='20230101', end_date='20230331') print(df[['trade_date', 'open', 'close', 'vol']].head())

2.2 财务数据深度解析

财务数据是基本面分析的核心,Tushare Pro提供完整的财务报表接口:

  • 利润表income接口
  • 资产负债表balancesheet接口
  • 现金流量表cashflow接口

获取万科A(000002.SZ)最近一期财务指标:

df_fina = pro.fina_indicator(ts_code='000002.SZ') latest_report = df_fina.iloc[0] print(f"ROE: {latest_report['roe']:.2%}") print(f"资产负债率: {latest_report['debt_to_assets']:.2%}")

3. 数据本地化存储方案

3.1 CSV文件存储

最简单的本地存储方式,适合中小规模数据:

import os data_dir = './tushare_data' if not os.path.exists(data_dir): os.makedirs(data_dir) # 获取沪深300成分股 hs300 = pro.hs300() hs300.to_csv(f'{data_dir}/hs300_components.csv', index=False)

3.2 SQLite数据库存储

对于大量历史数据,推荐使用轻量级数据库:

import sqlite3 from tqdm import tqdm conn = sqlite3.connect('stock_data.db') cursor = conn.cursor() # 创建日线行情表 cursor.execute(''' CREATE TABLE IF NOT EXISTS daily ( ts_code TEXT, trade_date TEXT, open REAL, high REAL, low REAL, close REAL, PRIMARY KEY (ts_code, trade_date) ) ''') # 批量插入数据示例 stock_list = ['600519.SH', '000001.SZ'] for code in tqdm(stock_list): df = pro.daily(ts_code=code, start_date='20200101', end_date='20221231') df.to_sql('daily', conn, if_exists='append', index=False)

4. 高级应用与性能优化

4.1 多线程数据采集

当需要获取全市场数据时,单线程效率太低:

from concurrent.futures import ThreadPoolExecutor def fetch_stock_data(code): try: return pro.daily(ts_code=code, start_date='20230101') except Exception as e: print(f"Error fetching {code}: {str(e)}") return None # 获取全市场股票列表 stocks = pro.stock_basic().ts_code.tolist() with ThreadPoolExecutor(max_workers=5) as executor: results = list(executor.map(fetch_stock_data, stocks[:50])) # 先测试前50只

4.2 数据更新策略

建立增量更新机制,避免重复获取:

def update_daily_data(): conn = sqlite3.connect('stock_data.db') last_date = pd.read_sql('SELECT MAX(trade_date) FROM daily', conn).iloc[0,0] if last_date: new_data = pro.daily(trade_date=last_date) existing_codes = pd.read_sql( f"SELECT DISTINCT ts_code FROM daily WHERE trade_date='{last_date}'", conn ).ts_code.tolist() new_data = new_data[~new_data.ts_code.isin(existing_codes)] new_data.to_sql('daily', conn, if_exists='append', index=False)

5. 常见问题排查

在实际使用中可能会遇到以下典型问题:

  • 权限错误:检查Token是否设置正确,账号是否有对应接口权限
  • 数据缺失:确认查询时间段是否在交易所开市日期内
  • 频率限制:免费账号每分钟最多500次调用,建议添加延时
import time for code in stock_list[:10]: data = pro.daily(ts_code=code) time.sleep(0.1) # 控制请求频率

通过本地存储历史数据,可以大幅减少API调用次数。我在实际项目中通常会设置定时任务,在非交易时间更新数据库,既避免影响交易时段系统性能,又能保证数据及时性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/27 3:12:16

A-11-AI能做什么?盘点2026年AI的100种用法

AI能做什么?盘点2026年AI的100种用法 🌟 系列:从0到1学AI(入门系列)第 11 篇🎯 适合人群:想找到 AI 与工作生活结合点的朋友⏱️ 阅读时长:约 15 分钟 前言 很多人知道 AI 很厉害,但就是想不到怎么用。 这篇文章给你列出 AI 的100种真实用法,按场景分类,直接可以…

作者头像 李华
网站建设 2026/5/27 3:08:58

量子机器学习在药物发现中的创新应用

1. 量子机器学习在药物发现中的突破性应用蛋白质与配体结合自由能(ΔGbind)的准确预测一直是药物虚拟筛选(SBVS)的核心难题。传统分子动力学模拟虽然精度较高,但面对包含数十亿分子的现代化合物库时,其计算成本变得难以承受。而经典机器学习方法又受限于…

作者头像 李华