AI股票小助手03-Tushare数据采集

by 雪隐 from juejin.cn/user/143341...

文欢迎分享与聚合,全文转载就不必了,尊重版权,圈子就这么大,若急用可联系授权

Tushare股票数据获取实战教程

Tushare是国内知名的免费金融数据平台,提供股票、基金、期货等多种金融数据。本教程通过三个实战案例,带你掌握使用Tushare Pro获取股票数据的方法。这也能弥补akshare发生数据无法获取的情况。

环境准备

1. 安装Tushare

bash 复制代码
pip install tushare

2. 获取Token

  1. 访问 Tushare Pro 注册账号
  2. 进入个人中心 → 接口TOKEN,复制你的Token
  3. 设置环境变量:
bash 复制代码
# macOS/Linux
export TUSHARE_TOKEN="你的Token"

# Windows PowerShell
$env:TUSHARE_TOKEN="你的Token"

或在Python中直接设置:

python 复制代码
os.environ["TUSHARE_TOKEN"] = "你的Token"

3. Token权限说明

数据类型 权限要求
日线数据 基础积分(免费)
分钟数据 需要捐助1000元开通权限
财务数据 需要2000积分

案例一:获取日线数据

日线数据是最常用的行情数据,包含每日的开盘价、收盘价、最高价、最低价和成交量(OHLCV)。

完整代码

python 复制代码
# -*- coding: utf-8 -*-
import os
import pandas as pd
import tushare as ts

STOCK_CODE = '300750.SZ'  # 宁德时代
STOCK_NAME = '宁德时代'
DATA_START = '20240101'
DATA_END = '20251231'


def get_pro():
    """获取Tushare Pro API实例"""
    token = os.environ.get("TUSHARE_TOKEN")
    if not token:
        raise RuntimeError("请先设置环境变量 TUSHARE_TOKEN")
    ts.set_token(token.strip())
    return ts.pro_api()


def download_stock_data():
    # 初始化API
    pro = get_pro()

    # 获取前复权日线数据
    df = ts.pro_bar(
        ts_code=STOCK_CODE,
        start_date=DATA_START,
        end_date=DATA_END,
        adj='qfq',   # qfq=前复权, hfq=后复权, None=不复权
        freq='D'     # D=日线
    )

    # 数据处理
    df = df.rename(columns={
        'trade_date': 'date',
        'vol': 'volume'
    })
    df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')
    df = df.sort_values('date').reset_index(drop=True)

    # 只保留核心列
    keep_cols = ['date', 'open', 'high', 'low', 'close', 'volume']
    df = df[[c for c in keep_cols if c in df.columns]]

    # 保存CSV
    df.to_csv('daily_data.csv', index=False, encoding='utf-8-sig')

    return df


if __name__ == "__main__":
    df = download_stock_data()
    print(df.head())

关键点说明

  1. 股票代码格式300750.SZ 表示深圳交易所的宁德时代,000001.SZ 表示深圳交易所的上证指数
  2. 复权类型
    • adj='qfq':前复权(推荐),保持价格连续性
    • adj='hfq':后复权
    • adj=None:不复权
  3. ts.pro_bar :Tushare推荐的行情获取方法,比daily接口更方便

运行效果

yaml 复制代码
开始下载股票数据
股票:宁德时代(300750.SZ)
日期范围:20240101 至 20251231
------------------------------------------------------------
成功获取 300 条日线数据
数据日期范围:2024-01-02 至 2024-06-28

数据预览(前5行):
       date    open    high     low   close     volume
0 2024-01-02  1680.0  1698.0  1671.0  1685.0   2300000
1 2024-01-03  1685.0  1700.0  1678.0  1692.0   2100000
...

案例二:获取分钟数据

分钟数据用于日内策略分析,支持1/5/15/30/60分钟频率。

完整代码

python 复制代码
# -*- coding: utf-8 -*-
import os
import pandas as pd
import tushare as ts

STOCK_CODE = '300750.SZ'
STOCK_NAME = '宁德时代'
TARGET_DATE = '20260210'
FREQ = '1min'  # 可选:1min, 5min, 15min, 30min, 60min


def get_pro():
    token = os.environ.get("TUSHARE_TOKEN")
    if not token:
        raise RuntimeError("请先设置环境变量 TUSHARE_TOKEN")
    ts.set_token(token.strip())
    return ts.pro_api()


def download_minute_data():
    pro = get_pro()

    df = ts.pro_bar(
        ts_code=STOCK_CODE,
        start_date=TARGET_DATE,
        end_date=TARGET_DATE,
        adj='qfq',
        freq=FREQ
    )

    # 数据处理
    df = df.rename(columns={
        'trade_time': 'datetime',
        'vol': 'volume'
    })
    df['datetime'] = pd.to_datetime(df['datetime'])
    df = df.sort_values('datetime').reset_index(drop=True)

    # 保存
    df.to_csv('minute_data.csv', index=False, encoding='utf-8-sig')

    return df


if __name__ == "__main__":
    df = download_minute_data()
    print(df.head(10))

注意事项

  • 权限要求:分钟数据需要捐助1000元开通权限
  • 频次限制:每分钟500次,每次最多8000行
  • 日期要求:必须是交易日,非交易日无数据

案例三:获取财务数据

财务数据用于基本面分析,包括盈利能力、偿债能力、成长能力等指标。

完整代码

python 复制代码
# -*- coding: utf-8 -*-
import os
import pandas as pd
import tushare as ts

STOCK_CODE = '300750.SZ'
STOCK_NAME = '宁德时代'

# 定义需要的财务指标字段
FINA_FIELDS = ",".join([
    "ts_code", "ann_date", "end_date",

    # 每股指标
    "eps",        # 基本每股收益
    "bps",        # 每股净资产
    "ocfps",      # 每股经营现金流

    # 盈利能力
    "roe",        # 净资产收益率(%)
    "grossprofit_margin",  # 销售毛利率(%)

    # 偿债能力
    "debt_to_assets",  # 资产负债率(%)
    "current_ratio",   # 流动比率

    # 成长能力
    "netprofit_yoy",   # 净利润同比增长率(%)
    "or_yoy",          # 营收同比增长率(%)

    # 营运能力
    "assets_turn",     # 总资产周转率(次)
])


def get_pro():
    token = os.environ.get("TUSHARE_TOKEN")
    if not token:
        raise RuntimeError("请先设置环境变量 TUSHARE_TOKEN")
    ts.set_token(token.strip())
    return ts.pro_api()


def download_financial_data():
    pro = get_pro()

    # 使用 fina_indicator 接口获取财务指标
    df = pro.fina_indicator(ts_code=STOCK_CODE, fields=FINA_FIELDS)

    # 按报告期排序
    df = df.sort_values('end_date').reset_index(drop=True)

    # 保存
    df.to_csv('financial_data.csv', index=False, encoding='utf-8-sig')

    return df


if __name__ == "__main__":
    df = download_financial_data()
    print(df.tail(3).T)  # 转置显示最近3期

常用财务指标速查

每股指标

字段 说明
eps 基本每股收益
bps 每股净资产
ocfps 每股经营现金流

盈利能力

字段 说明
roe 净资产收益率
grossprofit_margin 销售毛利率
netprofit_margin 销售净利率

成长能力

字段 说明
netprofit_yoy 净利润同比增长率
or_yoy 营收同比增长率

偿债能力

字段 说明
debt_to_assets 资产负债率
current_ratio 流动比率
quick_ratio 速动比率

统一的数据保存结构

三个脚本都遵循统一的数据保存规范:

python 复制代码
DATA_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data")
os.makedirs(DATA_DIR, exist_ok=True)

output_file = os.path.join(DATA_DIR, f'{STOCK_CODE.replace(".", "_")}_daily_tushare.csv')
df.to_csv(output_file, index=False, encoding='utf-8-sig')

保存的文件命名规则:{股票代码}_daily_tushare.csv,放在脚本所在目录的data文件夹下。


错误处理

python 复制代码
import traceback

def download_stock_data():
    try:
        df = ts.pro_bar(...)
        if df is None or len(df) == 0:
            print("无法获取数据,请检查:")
            print("  1. Token是否正确设置")
            print("  2. 股票代码是否正确")
            print("  3. 是否有足够权限")
            return None
        return df
    except Exception as e:
        print(f"发生错误:{e}")
        traceback.print_exc()
        return None

总结

数据类型 接口 权限要求 主要参数
日线 ts.pro_bar(freq='D') 基础积分 ts_code, start_date, end_date, adj
分钟 ts.pro_bar(freq='1min') 捐助1000元 ts_code, start_date, end_date, adj, freq
财务 pro.fina_indicator() 2000积分 ts_code, fields

Tushare的优势在于数据全面、接口简洁,适合个人投资者进行量化分析。建议先从日线数据开始,掌握基础后再扩展到分钟和财务数据。

写在最后

如果大家觉得这篇文章对你们有帮助,请记得点赞评论。下一章介绍一种更加稳定的获取数据方法,请大家不要错过。

相关推荐
小烤箱1 小时前
什么是 ROS2:机器人软件的数据加工工业园区
人工智能·机器人·ros
2601_955767421 小时前
观复盾护景贴:东方哲思与双护科技的深度实测
人工智能·科技·ios·iphone·圆偏振光·磁控溅射
lpd_lt1 小时前
服务端类vue等页面AI测试方向
前端·vue.js·人工智能
黄啊码1 小时前
【黄啊码】AI提速后,我睡得更晚了
人工智能
foggyprojects1 小时前
Java 里动态 SQL 为什么总是越写越乱
后端
【建模先锋】1 小时前
独家原创!基于特征—时间双图注意力与BiGRU全局注意力并行融合的高创新预测模型
人工智能·深度学习·注意力机制·预测模型·gat·时间序列预测模型
越努力越幸运661 小时前
MAF的塑智能体边界,从AIAgent抽象类开始
后端
云樱梦海1 小时前
FunASR:阿里达摩院开源的工业级语音识别工具包(4 款模型 + Gradio 可视化)
人工智能·开源·语音识别
王莎莎-MinerU1 小时前
Agent 时代,科学数据 API 需要重新设计
大数据·前端·数据库·人工智能·个人开发