Tushare 金融数据接口教程

什么是 Tushare?

Tushare 是一个免费、开源的 Python 财经数据接口包,主要提供中国金融市场的数据。

  • 官网https://tushare.pro
  • 数据覆盖:A股行情、财务报表、指数、基金、期货、宏观经济等
  • 使用方式:通过 Python 的 tushare 库调用 REST API 获取数据
  • 注册要求:需要注册账户并获取 API Token(积分制,注册即有基础权限)

安装方式

pip install tushare

第一步:初始化 Tushare 接口

使用 Tushare 的第一步是导入库并设置你的个人 Token。

Listing 1
import tushare as ts  # 导入tushare库

# 设置个人API Token,注册后在tushare.pro个人中心获取
ts.set_token('abccf14666b65f206f893a382ceff6b9bc606a4e6999c37278888571')

# 初始化pro接口,后续所有数据获取都通过pro对象调用
pro = ts.pro_api()

# 验证接口是否正常:获取当前Tushare版本信息
print(f'Tushare 版本: {ts.__version__}')  # 打印tushare版本号
Tushare 版本: 1.4.24

核心接口:获取股票基本信息

pro.stock_basic() 返回所有 A 股上市公司的基本信息,是筛选股票池的基础工具。

import pandas as pd  # 导入pandas用于数据处理

# 获取全部上市状态的股票基本信息
# exchange='' 表示不限定交易所(涵盖上交所和深交所)
# list_status='L' 表示只获取仍在上市的股票
# fields 参数指定需要返回的字段列表
df_stock_basic = pro.stock_basic(
    exchange='',  # 不限定交易所
    list_status='L',  # 仅获取正常上市的股票
    fields='ts_code,symbol,name,area,industry,market,list_date'  # 指定返回字段
)

# 展示前10条记录
df_stock_basic.head(10)
Table 1: A股上市公司基本信息(前10条)
ts_code symbol name area industry market list_date
0 000001.SZ 000001 平安银行 深圳 银行 主板 19910403
1 000002.SZ 000002 万科A 深圳 全国地产 主板 19910129
2 000004.SZ 000004 *ST国华 深圳 软件服务 主板 19901201
3 000006.SZ 000006 深振业A 深圳 区域地产 主板 19920427
4 000007.SZ 000007 全新好 深圳 其他商业 主板 19920413
5 000008.SZ 000008 神州高铁 北京 运输设备 主板 19920507
6 000009.SZ 000009 中国宝安 深圳 电气设备 主板 19910625
7 000010.SZ 000010 美丽生态 深圳 建筑工程 主板 19951027
8 000011.SZ 000011 深物业A 深圳 房产服务 主板 19920330
9 000012.SZ 000012 南玻A 深圳 玻璃 主板 19920228

字段含义解析:stock_basic 返回内容

上表中各字段的含义如下:

字段名 含义 示例
ts_code Tushare 股票代码 002415.SZ
symbol 股票代码(6位数字) 002415
name 股票名称 海康威视
area 所在地区 浙江
industry 所属行业 IT设备
market 市场类型 中小板
list_date 上市日期 20100528

实用技巧:筛选特定地区的公司

以筛选长三角地区(上海、江苏、浙江、安徽)上市公司为例,展示数据筛选操作。

Listing 2
# 定义长三角地区的关键词列表
yrd_areas = ['上海', '江苏', '浙江', '安徽']  # 长三角三省一市

# 使用 isin() 方法筛选 area 字段在长三角列表中的记录
df_yrd = df_stock_basic[df_stock_basic['area'].isin(yrd_areas)]  # 筛选长三角公司

# 统计各地区公司数量
area_counts = df_yrd['area'].value_counts()  # 按地区统计公司数量
print('长三角地区上市公司数量:')  # 打印标题
print(area_counts)  # 打印各地区数量
print(f'\n合计:{len(df_yrd)} 家')  # 打印总数
长三角地区上市公司数量:
area
浙江    741
江苏    729
上海    452
安徽    189
Name: count, dtype: int64

合计:2111 家

获取股票日度行情数据

pro.daily() 接口获取股票的日度 OHLCV 行情数据,是技术分析和收益率计算的基础。

# 获取海康威视(002415.SZ)2024年全年日度行情
# ts_code: Tushare格式的股票代码
# start_date / end_date: 日期范围,格式为 YYYYMMDD
df_daily = pro.daily(
    ts_code='002415.SZ',  # 海康威视的Tushare代码
    start_date='20240101',  # 起始日期:2024年1月1日
    end_date='20241231'  # 截止日期:2024年12月31日
)

# 按交易日期升序排列(Tushare默认降序)
df_daily = df_daily.sort_values('trade_date').reset_index(drop=True)  # 按日期排序并重置索引

# 查看数据维度和前5行
print(f'数据维度:{df_daily.shape[0]} 个交易日, {df_daily.shape[1]} 个字段')  # 打印数据规模
df_daily.head()  # 展示前5行
数据维度:242 个交易日, 11 个字段
Listing 3
ts_code trade_date open high low close pre_close change pct_chg vol amount
0 002415.SZ 20240102 34.68 34.68 33.25 33.77 34.72 -0.95 -2.7362 384245.75 1290363.710
1 002415.SZ 20240103 33.48 33.70 32.82 33.06 33.77 -0.71 -2.1025 304835.82 1008315.315
2 002415.SZ 20240104 33.00 33.02 32.04 32.58 33.06 -0.48 -1.4519 340313.11 1103184.842
3 002415.SZ 20240105 32.36 32.94 32.14 32.43 32.58 -0.15 -0.4604 234765.88 763550.815
4 002415.SZ 20240108 32.42 32.42 31.30 31.68 32.43 -0.75 -2.3127 303619.91 961036.038

日度行情字段含义

字段名 含义 单位
ts_code 股票代码 -
trade_date 交易日期 YYYYMMDD
open 开盘价
high 最高价
low 最低价
close 收盘价
pre_close 昨收价
change 涨跌额
pct_chg 涨跌幅 %
vol 成交量
amount 成交额 千元

可视化:海康威视 2024 年股价走势

将获取的行情数据用图表展示,直观感受股价波动。

Code
import matplotlib.pyplot as plt  # 导入绑图库

# 将 trade_date 转为日期类型,便于绘图
df_daily['trade_date'] = pd.to_datetime(df_daily['trade_date'])  # 转换日期格式

# 创建图表
fig, ax = plt.subplots(figsize=(10, 4.5))  # 设置图表大小
ax.plot(df_daily['trade_date'], df_daily['close'],  # 绘制收盘价折线
        color='#00A4E6', linewidth=1.2)  # 设置线条颜色和粗细
ax.set_title('海康威视 2024 年收盘价走势', fontsize=14)  # 设置标题
ax.set_xlabel('日期')  # 设置x轴标签
ax.set_ylabel('收盘价(元)')  # 设置y轴标签
ax.grid(True, alpha=0.3)  # 添加浅色网格线
plt.tight_layout()  # 自动调整布局
plt.show()  # 显示图表
Figure 1: 海康威视(002415.SZ)2024年日度收盘价走势

计算并可视化日收益率

日收益率是金融研究中最基础的变量,通常使用对数收益率。

Code
import numpy as np  # 导入numpy用于数值计算

# 计算对数收益率:ln(P_t / P_{t-1})
df_daily['log_return'] = np.log(df_daily['close'] / df_daily['close'].shift(1))  # 计算对数收益率

# 绘制收益率时序图
fig, ax = plt.subplots(figsize=(10, 4.5))  # 创建图表
ax.bar(df_daily['trade_date'], df_daily['log_return'] * 100,  # 绘制收益率柱状图
       color=np.where(df_daily['log_return'] > 0, '#EC232A', '#00A4E6'),  # 涨红跌蓝
       width=2, alpha=0.8)  # 设置柱宽和透明度
ax.set_title('海康威视 2024 年日度对数收益率', fontsize=14)  # 设置标题
ax.set_xlabel('日期')  # 设置x轴标签
ax.set_ylabel('对数收益率(%)')  # 设置y轴标签
ax.grid(True, alpha=0.3)  # 添加网格线
plt.tight_layout()  # 自动调整布局
plt.show()  # 显示图表
Figure 2: 海康威视 2024 年日度对数收益率

获取前复权行情数据

原始行情数据不含除权除息调整,长期分析时需要使用复权数据。ts.pro_bar() 支持复权查询。

# 使用 pro_bar 获取前复权数据
# adj='qfq' 表示前复权(forward adjusted)
# 前复权以最新价格为基准向前调整,适合计算长期收益率
df_qfq = ts.pro_bar(
    ts_code='002415.SZ',  # 海康威视
    adj='qfq',  # 前复权
    start_date='20200101',  # 从2020年开始
    end_date='20241231'  # 到2024年底
)

# 按日期升序排列
df_qfq = df_qfq.sort_values('trade_date').reset_index(drop=True)  # 按日期排序

# 展示数据概览
print(f'前复权数据:{df_qfq.shape[0]} 个交易日')  # 打印交易日数
df_qfq[['trade_date', 'open', 'close', 'vol']].head()  # 展示关键列
前复权数据:1212 个交易日
Listing 4
trade_date open close vol
0 20200102 29.40 30.30 749842.34
1 20200103 30.29 30.54 479009.97
2 20200106 30.38 30.75 589125.38
3 20200107 30.79 30.74 314561.51
4 20200108 30.39 30.46 360490.30

复权 vs 不复权:可视化对比

通过对比图直观理解复权的意义。

Code
# 获取不复权数据作为对比
df_no_adj = pro.daily(  # 获取不复权日度数据
    ts_code='002415.SZ',
    start_date='20200101',
    end_date='20241231'
)
df_no_adj = df_no_adj.sort_values('trade_date').reset_index(drop=True)  # 按日期排序
df_no_adj['trade_date'] = pd.to_datetime(df_no_adj['trade_date'])  # 转换日期格式
df_qfq_sorted = df_qfq.copy()  # 复制前复权数据
df_qfq_sorted['trade_date'] = pd.to_datetime(df_qfq_sorted['trade_date'])  # 转换日期格式

# 绘制对比图
fig, axes = plt.subplots(1, 2, figsize=(12, 4.5))  # 创建1行2列子图
axes[0].plot(df_no_adj['trade_date'], df_no_adj['close'], color='#A4AAAB')  # 不复权
axes[0].set_title('不复权', fontsize=13)  # 设置子图标题
axes[0].set_ylabel('收盘价(元)')  # 设置y轴标签
axes[0].grid(True, alpha=0.3)  # 添加网格

axes[1].plot(df_qfq_sorted['trade_date'], df_qfq_sorted['close'], color='#00A4E6')  # 前复权
axes[1].set_title('前复权', fontsize=13)  # 设置子图标题
axes[1].set_ylabel('收盘价(元)')  # 设置y轴标签
axes[1].grid(True, alpha=0.3)  # 添加网格

plt.suptitle('海康威视 2020-2024:复权效果对比', fontsize=14, y=1.02)  # 设置总标题
plt.tight_layout()  # 自动调整布局
plt.show()  # 显示图表
Figure 3: 复权 vs 不复权:海康威视 2020-2024 收盘价对比

获取上市公司财务报表

pro.income() 获取利润表,pro.balancesheet() 获取资产负债表,pro.cashflow() 获取现金流量表。

# 获取海康威视利润表数据
# period: 报告期,格式 YYYYMMDD
# fields: 指定需要返回的财务字段
df_income = pro.income(
    ts_code='002415.SZ',  # 海康威视
    period='20240930',  # 2024年三季报
    fields='ts_code,ann_date,end_date,basic_eps,total_revenue,revenue,'
           'oper_cost,total_profit,income_tax,n_income'  # 关键财务字段
)

# 展示数据
df_income.T  # 转置显示,更便于阅读
Table 2: 海康威视利润表关键指标(2024年三季报)
0
ts_code 002415.SZ
ann_date 20241026
end_date 20240930
basic_eps 0.878
total_revenue 64991467788.449997
revenue 64991467788.449997
oper_cost 35903245768.5
total_profit 10150195104.01
income_tax 1242370816.25
n_income 8907824287.76

获取多只股票的财务数据

实际研究中,我们通常需要批量获取多家公司的财务数据进行对比分析。

# 先筛选IT设备行业 + 长三角地区的公司
df_it = df_stock_basic[  # 从基本信息表中筛选
    (df_stock_basic['industry'] == 'IT设备') &  # 行业为IT设备
    (df_stock_basic['area'].isin(['上海', '江苏', '浙江', '安徽']))  # 位于长三角
]
print(f'长三角IT设备企业:{df_it["name"].tolist()}')  # 打印公司名称列表

# 批量获取这些公司的2024三季报净利润数据
code_list = df_it['ts_code'].tolist()  # 获取代码列表
results = []  # 存储结果的列表
for code in code_list:  # 遍历每只股票
    df_tmp = pro.income(  # 获取利润表
        ts_code=code,
        period='20240930',
        fields='ts_code,end_date,revenue,n_income,basic_eps'
    )
    if len(df_tmp) > 0:  # 如果有数据
        results.append(df_tmp.iloc[0])  # 添加第一条记录

# 合并结果并展示
df_result = pd.DataFrame(results)  # 转为DataFrame
df_result['n_income_yi'] = df_result['n_income'] / 1e8  # 净利润转换为亿元
df_result['revenue_yi'] = df_result['revenue'] / 1e8  # 营收转换为亿元
df_result[['ts_code', 'revenue_yi', 'n_income_yi', 'basic_eps']]  # 展示关键指标
长三角IT设备企业:['大华股份', '海康威视', 'GQY视讯', '中威电子', '苏州科达', 'ST华铭', '恒为科技', '传艺科技', '天地数码', '鸿泉技术', '云涌科技', '通行宝', '萤石网络', '朗鸿科技', '汉桑科技', '海菲曼', '觅睿科技']
Table 3: 长三角 IT 设备行业上市公司盈利能力对比(2024Q3)
ts_code revenue_yi n_income_yi basic_eps
0 002236.SZ 224.500819 25.991797 0.7800
0 002415.SZ 649.914678 89.078243 0.8780
0 300076.SZ 0.843076 -0.246694 -0.0600
0 300270.SZ 1.085100 -0.518776 -0.1700
0 603660.SH 7.395799 -3.537285 -0.7080
0 300462.SZ 4.122399 -0.500999 -0.2908
0 603496.SH 8.809376 0.782817 0.2506
0 002866.SZ 14.086187 0.221230 0.1600
0 300743.SZ 5.550732 0.740884 0.4800
0 688288.SH 3.643221 -0.310547 -0.3400
0 688060.SH 1.759301 0.019982 0.0691
0 301339.SZ 5.337743 1.670495 0.4106
0 688475.SH 39.626455 3.747765 0.4800
0 920395.BJ 1.152571 0.429882 0.3400
0 301491.SZ 11.587773 1.916400 1.9800

获取指数行情数据

pro.index_daily() 获取指数的日度行情,用于市场基准分析。

Code
# 获取上证综指日度行情(指数代码:000001.SH)
df_sh = pro.index_daily(  # 获取指数日度数据
    ts_code='000001.SH',  # 上证综指
    start_date='20240101',  # 2024年起
    end_date='20241231'  # 2024年底
)
df_sh = df_sh.sort_values('trade_date').reset_index(drop=True)  # 按日期排序

# 获取沪深300指数日度行情(指数代码:000300.SH)
df_hs300 = pro.index_daily(  # 获取沪深300指数数据
    ts_code='000300.SH',  # 沪深300
    start_date='20240101',
    end_date='20241231'
)
df_hs300 = df_hs300.sort_values('trade_date').reset_index(drop=True)  # 按日期排序

# 归一化处理:以首日为基准计算累计收益率
df_sh['cum_ret'] = df_sh['close'] / df_sh['close'].iloc[0] * 100  # 上证综指归一化
df_hs300['cum_ret'] = df_hs300['close'] / df_hs300['close'].iloc[0] * 100  # 沪深300归一化
df_sh['trade_date'] = pd.to_datetime(df_sh['trade_date'])  # 转换日期格式
df_hs300['trade_date'] = pd.to_datetime(df_hs300['trade_date'])  # 转换日期格式

# 绘制对比图
fig, ax = plt.subplots(figsize=(10, 4.5))  # 创建图表
ax.plot(df_sh['trade_date'], df_sh['cum_ret'],  # 绘制上证综指
        label='上证综指', color='#EC232A', linewidth=1.5)  # 红色
ax.plot(df_hs300['trade_date'], df_hs300['cum_ret'],  # 绘制沪深300
        label='沪深300', color='#00A4E6', linewidth=1.5)  # 蓝色
ax.axhline(y=100, color='#6E7F82', linestyle='--', alpha=0.5)  # 基准线
ax.set_title('2024年:上证综指 vs 沪深300 累计收益率', fontsize=14)  # 标题
ax.set_ylabel('累计收益率(基期=100)')  # y轴标签
ax.legend()  # 显示图例
ax.grid(True, alpha=0.3)  # 网格线
plt.tight_layout()  # 自动调整布局
plt.show()  # 显示图表
Figure 4: 上证综指与沪深300 指数 2024 年走势对比

获取指数成分股

pro.index_weight() 获取某个指数的成分股及权重,用于构建投资组合或因子分析。

# 获取沪深300最新成分股权重
df_weight = pro.index_weight(  # 获取指数成分股权重
    index_code='399300.SZ',  # 沪深300指数代码(深交所发布)
    start_date='20250101',  # 起始日期
    end_date='20250110'  # 截止日期
)

# 提取最新一期的成分股权重
latest_date = df_weight['trade_date'].max()  # 找到最新日期
df_latest = df_weight[df_weight['trade_date'] == latest_date]  # 筛选最新日期数据

# 按权重降序排列,取前10大权重股
df_top10 = df_latest.sort_values('weight', ascending=False).head(10)  # 取前10大权重股

# 合并公司名称信息(con_code对应stock_basic中的ts_code)
df_top10 = df_top10.merge(  # 关联公司名称
    df_stock_basic[['ts_code', 'name']],  # 仅需代码和名称
    left_on='con_code',  # 左表以con_code为键
    right_on='ts_code',  # 右表以ts_code为键
    how='left'  # 左连接
)
df_top10[['con_code', 'name', 'weight']].reset_index(drop=True)  # 展示结果
Table 4: 沪深300 指数前十大权重股(2025年初)
con_code name weight
0 600519.SH 贵州茅台 4.6695
1 300750.SZ 宁德时代 3.4160
2 601318.SH 中国平安 2.7268
3 600036.SH 招商银行 2.3814
4 000333.SZ 美的集团 1.8401
5 600900.SH 长江电力 1.7848
6 300059.SZ 东方财富 1.5136
7 601166.SH 兴业银行 1.3746
8 600030.SH 中信证券 1.3386
9 000858.SZ 五粮液 1.3283

获取交易日历

pro.trade_cal() 获取交易日历,用于判断某天是否为交易日,是时间序列分析的基础。

Listing 5
# 获取上交所2025年1月的交易日历
df_cal = pro.trade_cal(  # 获取交易日历
    exchange='SSE',  # 上海证券交易所
    start_date='20250101',  # 起始日期
    end_date='20250131'  # 截止日期
)

# 筛选出实际开盘的交易日
df_open = df_cal[df_cal['is_open'] == 1]  # 筛选开盘日
print(f'2025年1月共有 {len(df_open)} 个交易日')  # 打印交易日数量
print(df_open[['cal_date', 'is_open']].to_string(index=False))  # 打印交易日列表
2025年1月共有 18 个交易日
cal_date  is_open
20250127        1
20250124        1
20250123        1
20250122        1
20250121        1
20250120        1
20250117        1
20250116        1
20250115        1
20250114        1
20250113        1
20250110        1
20250109        1
20250108        1
20250107        1
20250106        1
20250103        1
20250102        1

获取基金净值数据

pro.fund_daily() 获取基金的日度净值数据,适合基金绩效分析和投资组合研究。

# 获取基金基本信息(先查一下有哪些基金)
df_fund = pro.fund_basic(market='E')  # 获取场内基金(ETF)基本信息

# 筛选沪深300ETF(代码 510300.SH)
etf_info = df_fund[df_fund['ts_code'] == '510300.SH']  # 筛选华泰柏瑞沪深300ETF
print('基金名称:', etf_info['name'].values[0])  # 打印基金名称

# 获取该ETF的日度净值数据
df_fund_daily = pro.fund_daily(  # 获取基金日度数据
    ts_code='510300.SH',  # 华泰柏瑞沪深300ETF
    start_date='20240101',  # 2024年起
    end_date='20241231'  # 2024年底
)
df_fund_daily = df_fund_daily.sort_values('trade_date').reset_index(drop=True)  # 按日期排序
print(f'数据维度:{df_fund_daily.shape}')  # 打印数据规模
df_fund_daily.head()  # 展示前5行
基金名称: 沪深300ETF华泰柏瑞
数据维度:(242, 11)
Listing 6
ts_code trade_date pre_close open high low close change pct_chg vol amount
0 510300.SH 20240102 3.499 3.502 3.502 3.451 3.453 -0.046 -1.3147 9429305.78 3269676.679
1 510300.SH 20240103 3.453 3.446 3.460 3.428 3.443 -0.010 -0.2896 10617502.73 3654757.871
2 510300.SH 20240104 3.443 3.442 3.442 3.387 3.413 -0.030 -0.8713 16661524.81 5674869.534
3 510300.SH 20240105 3.413 3.404 3.439 3.377 3.396 -0.017 -0.4981 16996696.66 5796964.474
4 510300.SH 20240108 3.396 3.389 3.403 3.346 3.349 -0.047 -1.3840 17304243.86 5816612.453

综合案例:多股票财务指标对比分析

将前面学到的技能综合运用,获取多家公司的财务数据并进行对比分析。

Code
# 使用之前获取的 df_result 数据绘图(如果数据不为空)
if len(df_result) > 0:  # 如果有数据
    # 获取公司名称用于x轴标签
    df_plot = df_result.merge(  # 关联公司名称
        df_stock_basic[['ts_code', 'name']],  # 股票代码和名称
        on='ts_code',  # 以股票代码为键
        how='left'  # 左连接
    )

    fig, ax1 = plt.subplots(figsize=(10, 4.5))  # 创建图表

    # 绘制营收柱状图
    x_pos = range(len(df_plot))  # x轴位置
    bars = ax1.bar(  # 绘制柱状图
        x_pos,  # x位置
        df_plot['revenue_yi'],  # 营收数据(亿元)
        color='#00A4E6',  # 蓝色
        alpha=0.7,  # 透明度
        label='营业收入'  # 图例标签
    )

    # 在第二个y轴上绘制净利润
    ax2 = ax1.twinx()  # 创建共享x轴的第二个y轴
    ax2.plot(  # 绘制折线图
        x_pos,  # x位置
        df_plot['n_income_yi'],  # 净利润数据(亿元)
        color='#EC232A',  # 红色
        marker='o',  # 圆形标记
        linewidth=2,  # 线宽
        label='净利润'  # 图例标签
    )

    ax1.set_xticks(x_pos)  # 设置x轴刻度
    ax1.set_xticklabels(df_plot['name'], rotation=25, fontsize=8)  # 设置x轴标签
    ax1.set_ylabel('营业收入(亿元)', color='#00A4E6')  # 设置y轴标签
    ax2.set_ylabel('净利润(亿元)', color='#EC232A')  # 设置y轴标签
    ax1.set_title('长三角IT设备企业财务指标对比(2024Q3)', fontsize=13)  # 标题

    # 合并两个轴的图例
    lines1, labels1 = ax1.get_legend_handles_labels()  # 获取柱状图图例
    lines2, labels2 = ax2.get_legend_handles_labels()  # 获取折线图图例
    ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper left')  # 合并图例

    ax1.grid(True, alpha=0.2)  # 添加网格线
    plt.tight_layout()  # 自动调整布局
    plt.show()  # 显示图表
Figure 5: 长三角 IT 设备企业营收与净利润对比(2024Q3)

Tushare 常用接口速查表

接口 功能 关键参数
pro.stock_basic() 股票基本信息 exchange, list_status, fields
pro.daily() 日度行情 ts_code, start_date, end_date
ts.pro_bar() 复权行情 ts_code, adj, start_date
pro.income() 利润表 ts_code, period, fields
pro.balancesheet() 资产负债表 ts_code, period
pro.cashflow() 现金流量表 ts_code, period
pro.index_daily() 指数日度行情 ts_code, start_date
pro.index_weight() 指数成分股权重 index_code, start_date
pro.trade_cal() 交易日历 exchange, start_date
pro.fund_basic() 基金基本信息 market
pro.fund_daily() 基金日度净值 ts_code, start_date
pro.fina_indicator() 财务指标 ts_code, period