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

写在最后

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

相关推荐
武子康4 小时前
VLA 落地先签动作合同:从视觉语言输入到可执行控制指令
人工智能·llm·agent
神奇小汤圆4 小时前
疯了!Fastjson 又爆出严重安全漏洞,Spring Boot 项目赶紧自查
后端
知识燃料5 小时前
企业级生成式 AI 云平台推荐,哪些平台更适合从 Agent 原型走向生产?
大数据·人工智能
oioihoii5 小时前
我用 Seed Evolving 做了个 AI 小说写作工具
人工智能
龙虾PRO5 小时前
破解变异 OLLVM 混淆新思路:基于 Angr 动态执行自动化还原控制流完整实操方案
人工智能
@Mr_LiuYang5 小时前
《深入理解 AI Agent:设计原理与工程实践 》实验1-1上下文的关键作用
人工智能
大模型丫丫5 小时前
MCP协议开发实战:从零搭建AI Agent工具链
人工智能
wangxin2085 小时前
大模型稀疏注意力和MoE的宽度丢失与多智能体的维度补充
人工智能·ai·多智能体·管理学·组织管理·coordclaw·稀释注意力
ZEB11065 小时前
深耕矿山智能赛道 长沙迪迈科技以持续技术创新赋能矿业高质量转型
人工智能·科技·制造
一碗白开水一5 小时前
入门实践工程四:基于 PyTorch 的手写数字识别(MNIST 图像分类)|附:环境依赖环境及工程源码
人工智能·pytorch·分类