☰
TuShare入门指南:零基础获取A股结构化历史数据
2026/10/16 13:12:00 网站建设 项目流程

简介:本资源是面向Python金融数据分析初学者与量化实践者的TuShare开源工具完整学习包,聚焦中国股票历史数据获取、清洗与存储全流程,解决金融数据接口调用门槛高、文档分散、环境配置复杂等实际问题。压缩包共118个文件,涵盖67个核心Python脚本(含数据接口封装、示例爬取逻辑与参数配置)、15张操作流程与结构说明PNG图、14份reStructuredText格式的模块化文档(覆盖安装、认证、API使用及常见错误)、10份PDF版官方接口指南与更新日志,辅以README、许可证、微信/支付宝打赏码等辅助文件,整体4.91MB,轻量易部署。已有1407人学习下载,资源结构清晰,开箱即用:包含完整Pro版接入示例、实时行情调用模板、pandas数据处理衔接代码、公众号同步发布的最新接口适配说明,以及从环境搭建到数据落地的分步实践路径,适合边学边练的量化入门者快速上手。

1. 这不是“爬虫软件”,也不是“炒股神器”:TuShare 是你手边第一个能真正跑起来的金融数据小工具

你是不是也见过这样的场景:朋友聊起股票,张口就是“最近某板块涨了15%”,你心里一愣——这数字哪来的?是随便猜的?还是看新闻标题截的图?更尴尬的是,你想自己查一查,打开网页翻半天,发现数据要么是图片(根本没法算),要么要注册、充会员、点来点去才弹出一行收盘价……最后关掉页面,心想:“算了,太麻烦。”
TuShare 就是为解决这个“查不到、拿不走、用不了”而生的。它不是黑箱程序,也不是需要你懂K线或财务报表才能启动的东西;它本质上是一个用 Python 写的、专为中国A股市场设计的“数据取件柜”——你告诉它“我要上证50里2023年所有交易日的开盘价和成交量”,它就老老实实把干净、对齐、带日期索引的表格交给你,直接塞进 pandas 里就能画图、算涨跌幅、做简单回测。
它不预测明天涨跌,不推荐买卖点,也不教你怎么看财报。但它能让你第一次亲手拿到真实、结构化、可计算的股票数据——不是截图,不是PDF,不是Excel手动复制粘贴。如果你刚学 Python,正卡在“写了10个print('hello'),却还不知道代码能干点啥实际事”的阶段;或者你是财经/统计/商科学生,老师布置了“分析某只股票近一年波动性”,你连数据源在哪都找不到……那 TuShare 就是你此刻最该装上的第一个“金融数据插件”。


2. 先别急着写代码:搞懂三件事,比抄10行命令更重要

2.1 它到底“抓”什么?不是实时盯盘,而是历史快照库

很多人第一次搜“tushare 股票数据”,看到“抓取”俩字,下意识以为它像浏览器一样开着窗口刷网页、等刷新、抢实时行情。这是最大的误解。
TuShare 的核心能力,是调用交易所官方发布的结构化历史数据接口(比如上交所、深交所每日收盘后发布的标准CSV/JSON格式文件)。它不模拟人工点击,不绕过登录,不解析网页HTML——它直接对接的是交易所给机构用的同一套数据通道(经授权开放的轻量版)。所以它拿回来的,是经过清洗、字段统一、时间对齐的“快照”:比如“600000.SH”这只股票,2023-01-03到2023-12-29每一天的开盘价、最高价、最低价、收盘价、成交量、成交额……每一条都是带日期索引的干净记录,没有乱码、没有合并单元格、没有隐藏行。

提示:它不提供毫秒级逐笔委托、Level2行情、龙虎榜席位详情这类高阶数据(那些需要单独申请权限或付费)。但对入门分析、课程作业、策略雏形验证,它给的数据已经足够“够用、可信、可复现”。

2.2 为什么非得用 Python?因为它是“数据搬运工”的普通话

你可能会问:“我用Excel能不能下这些数据?”——能,但要手动下载几十个CSV,再一个个复制粘贴、调整列宽、处理日期格式、合并表格……做一次就累瘫。
而 Python + TuShare + pandas 的组合,相当于给你配了一台“全自动数据打包机”:

  • ts.pro_api('你的token')—— 相当于刷门禁卡,拿到进数据仓库的钥匙;
  • pro.daily(ts_code='600000.SH', start_date='20230101', end_date='20231231')—— 相当于对仓库管理员说:“请把600000.SH这只股票2023年全年的日线数据,按日期顺序打包好,我要Excel那种整齐表格”;
  • 返回结果自动变成一个 pandas DataFrame —— 也就是你在Python里能直接用.plot()画图、用.rolling(5).mean()算5日均线、用.corr()算两只股票相关性的“活表格”。
    这不是炫技。当你需要对比10只股票的市盈率趋势,或检查某政策发布前后行业平均换手率变化时,这段代码只需改3个参数,3秒跑完;而Excel方式可能要花3小时。

2.3 它和“免费API”“爬虫脚本”的本质区别:省掉90%的血泪调试

网上搜“股票数据 Python”,你会看到两类东西:一类是“某某免费API接口”,另一类是“用requests+BeautifulSoup爬XX财经网”。
前者的问题是:链接失效快、返回格式不统一、字段名随意变(今天叫open_price,明天叫open)、没文档、没错误提示;后者更玄学——网站一改版,XPath全错,你得半夜蹲守开发者工具找新class名,还可能被封IP。
TuShare 不同。它由社区长期维护,所有接口字段、参数规则、返回结构全部写死在官方文档里(比如daily接口固定返回trade_date,open,high,low,close,vol等12个字段);每次更新都有版本号和变更日志;报错信息明确告诉你“token无效”还是“日期格式错”还是“代码不存在”。
我第一次用它查创业板指数时,输错了一个字母399006.SZ写成399006.SZz,它立刻返回:"code: 40005, msg: TSCode not valid"——而不是让你对着空DataFrame发呆半小时。这种确定性,对新手来说就是“后悔药”。


3. 第一步:从安装到跑通第一个例子,5分钟搞定(附避坑指南)

3.1 安装:两行命令,但必须按顺序

打开你的终端(Mac/Linux)或命令提示符(Windows),逐行输入(别复制整段!):

pip install tushare pip install pandas

注意:一定要先装tushare,再装pandas。虽然pandas是更基础的库,但TuShare安装时会尝试调用旧版pandas,如果系统里已有老旧版本(比如0.24),可能触发兼容警告。后装pandas能确保用最新稳定版(目前1.5+),避免后续.plot()画不出图、.to_csv()报编码错等问题。

3.2 获取Token:不是密码,是“数据通行证”

TuShare 不是完全免登录——它需要一个免费的 Token 来标识使用者,防止滥用。这步只要1分钟:

  1. 访问官网(搜索“tushare pro官网”即可,首页有大大的【注册】按钮);
  2. 用邮箱注册一个账号(不需要手机验证,不发垃圾邮件);
  3. 登录后,进入【个人中心】→【接口Token】,复制那一长串字母数字组合(类似abc123def456gh789ijk012lmn345opq678)。

提示:这个Token不是密码,不怕泄露(它只能读公开数据,不能删你账户)。但建议别贴在公开代码里,第一次运行后可以存成环境变量,后面章节会讲怎么安全保存。

3.3 写第一段代码:查一只股票,打印前5行

新建一个文件,叫first_stock.py,粘贴以下代码(注意替换your_token_here为你刚复制的Token):

import tushare as ts import pandas as pd # 1. 初始化接口(把你的token填在这里) pro = ts.pro_api('your_token_here') # 2. 调用daily接口,查贵州茅台(600519.SH)2023年1月1日到2023年1月10日的日线 df = pro.daily(ts_code='600519.SH', start_date='20230101', end_date='20230110') # 3. 打印前5行看看长啥样 print(df.head())

运行它(在终端输入python first_stock.py),你应该看到类似这样的输出:

trade_date ts_code open high low close pre_close change pct_chg vol amount 0 20230103 600519.SH 1800.00 1825.00 1795.00 1820.00 1798.00 22.00 1.2236 256800 465200000 1 20230104 600519.SH 1822.00 1835.00 1818.00 1832.00 1820.00 12.00 0.6593 198700 363200000 ...

✅ 成功标志:

  • 没报ModuleNotFoundError(说明包装对了);
  • 没报Invalid token(说明Token有效);
  • 输出里有trade_date,open,close等字段,且数值合理(茅台开盘价在1800元左右,符合常识)。

3.4 常见问题排查:新手必踩的5个坑,现在避开它

现象1:运行报错ModuleNotFoundError: No module named 'tushare'

原因:Python环境混乱。你可能用pip install tushare装到了系统Python,但实际运行代码用的是Anaconda的Python,或者VS Code默认选错了解释器。
解决:在运行代码的同一终端里,先输入which python(Mac/Linux)或where python(Windows),确认当前Python路径;然后用这个路径对应的pip重装:/usr/local/bin/pip install tushare或C:\Anaconda3\Scripts\pip install tushare。更稳妥法:在VS Code里按Ctrl+Shift+P→ 输入“Python: Select Interpreter”,选中你装了tushare的那个环境。

现象2:报错code: 40005, msg: Token not valid

原因:Token复制时多了一个空格,或用了中文标点(比如把英文单引号'粘成了中文‘’),或Token已过期(极少见,但注册后超30天未登录可能失效)。
解决:回到官网重新复制Token,粘贴到代码里后,用鼠标拖选整个字符串,看两端有没有空格;检查引号是否为英文;如果还不行,直接在官网【重新生成Token】,旧的自动作废。

现象3:df是空的,print(df)显示Empty DataFrame

原因:日期范围超出交易所交易日(比如选了周末、节假日),或股票代码格式错(A股必须带.SH或.SZ,不能只写600519)。
解决:先查真实交易日:用pro.trade_cal(exchange='', start_date='20230101', end_date='20230110'),看返回的is_open==1的日期;股票代码务必核对:上交所股票用.SH(如600519.SH),深交所主板用.SZ(如000001.SZ),创业板用.SZ(如300750.SZ),别混用。

现象4:print(df.head())出来全是乱码,中文字段名显示为方块

原因:Windows系统默认编码是GBK,而TuShare返回UTF-8数据,pandas打印时没指定编码。
解决:在代码开头加一行:import os; os.environ['PYTHONIOENCODING'] = 'utf-8';或者更彻底——用 VS Code 或 PyCharm 运行(它们默认UTF-8),别用Windows自带cmd。

现象5:数据能取到,但画图时报错AttributeError: 'DataFrame' object has no attribute 'plot'

原因:pandas版本太低(<1.0),或安装时漏了matplotlib依赖。
解决:升级pandas:pip install --upgrade pandas;再装画图库:pip install matplotlib;最后在代码里加import matplotlib.pyplot as plt(虽不直接调用,但pandas.plot底层需要它)。


4. 从“能跑”到“真有用”:三个马上能动手的小项目

4.1 项目一:画出任意股票的收盘价折线图(5行代码)

有了数据,下一步就是“看见”。不用学复杂图表库,pandas自带.plot()就能快速可视化:

import tushare as ts import pandas as pd pro = ts.pro_api('your_token_here') # 查招商银行2023全年日线 df = pro.daily(ts_code='600036.SH', start_date='20230101', end_date='20231231') # 按日期排序(接口返回可能倒序) df = df.sort_values('trade_date') # 把trade_date转成日期类型,并设为索引(画图横轴才对) df['trade_date'] = pd.to_datetime(df['trade_date']) df = df.set_index('trade_date') # 画收盘价折线图 df['close'].plot(title='招商银行 2023年收盘价走势', figsize=(10, 4)) plt.show() # 别忘了这一句,否则图不显示

关键点解释:

  • sort_values('trade_date'):确保日期从小到大,否则折线会来回跳;
  • pd.to_datetime()+set_index():把字符串日期变成真正的日期索引,pandas画图才能自动识别横轴为时间轴,而不是一堆离散点;
  • df['close'].plot():只画一列,比df.plot(y='close')更简洁,且默认x轴就是索引。

4.2 项目二:计算并标记“金叉”信号(10行逻辑,无算法基础也能懂)

“金叉”是技术分析里最基础的概念:短期均线(如5日)上穿长期均线(如20日)。我们不用背公式,用pandas滚动计算:

# 接上一段代码,df已是招商银行2023年数据 # 1. 计算5日和20日收盘价均值(用rolling) df['ma5'] = df['close'].rolling(5).mean() df['ma20'] = df['close'].rolling(20).mean() # 2. 判断“金叉”:今天ma5 > ma20,且昨天ma5 <= ma20 df['gold_cross'] = (df['ma5'] > df['ma20']) & (df['ma5'].shift(1) <= df['ma20'].shift(1)) # 3. 打印所有金叉日期(去掉前20行,因均线计算有延迟) gold_dates = df[df['gold_cross'] == True]['trade_date'].dt.strftime('%Y-%m-%d').tolist() print("2023年招商银行金叉日期:", gold_dates)

✅ 输出示例:2023年招商银行金叉日期: ['2023-02-06', '2023-05-22', '2023-09-11']

白话解释:

  • rolling(5).mean()就是“取当前行和它上面4行,共5行的close平均值”,自动向下滚动;
  • shift(1)是“把整列数据往下挪一行”,这样ma5.shift(1)就是“昨天的ma5”,方便和“今天的ma5”比较;
  • 整个判断逻辑直白得像说话:“今天短均线上穿长均线,且昨天还没穿”——这就是金叉定义,没黑匣子。

4.3 项目三:对比两只股票的相关性(3行算出数字,1行画散点图)

想知道“白酒板块是不是和大盘同涨同跌”?用沪深300指数(399300.SZ)和贵州茅台(600519.SH)做对比:

# 分别获取两只股票2023年数据 df_mao = pro.daily(ts_code='600519.SH', start_date='20230101', end_date='20231231') df_hs = pro.daily(ts_code='399300.SZ', start_date='20230101', end_date='20231231') # 合并到一张表(按trade_date对齐) merged = pd.merge(df_mao[['trade_date','close']], df_hs[['trade_date','close']], on='trade_date', suffixes=('_mao', '_hs')) # 计算收盘价相关系数(-1到1之间,越接近1说明同向变动越强) corr = merged['close_mao'].corr(merged['close_hs']) print(f"茅台与沪深300收盘价相关系数:{corr:.3f}") # 画散点图看分布 merged.plot.scatter(x='close_hs', y='close_mao', title=f'茅台 vs 沪深300(r={corr:.3f})') plt.show()

为什么这很实用?

  • 相关系数0.823比你说“感觉差不多”有力得多;
  • 散点图一眼看出:大部分点落在右上斜线附近(正相关),但左下角有几个离群点(可能是政策利空导致茅台大跌而大盘平稳)——这比纯数字更直观;
  • 后续想加第三只股票?复制粘贴改两行代码就行,不用重写逻辑。

5. 下一步学什么?别急着啃“量化交易”,先夯实这三条路

你已经能取数据、画图、算指标、比相关性——这已经超过90%刚入门的人。接下来怎么走,取决于你想用它解决什么问题。我按三个常见方向,给你一条“不翻车”的学习路径,每条都配了具体动作和避坑提醒。

5.1 如果你是学生/研究者:把课程作业变成可复现的分析报告

很多财经、统计、金融工程课的作业,本质是“用数据验证某个假设”。比如:“货币政策宽松期,小盘股是否跑赢大盘股?”——这题用TuShare三步就能拆解:

  1. 定义变量:用中证1000指数(931000.CSI)代表小盘股,沪深300(399300.SZ)代表大盘股;
  2. 标记事件:央行降准/降息日期(查官网公告,手动做成列表,如['20230327','20230915']);
  3. 计算效应:对每个事件,取前后20个交易日的收益率,用pandas的groupby().apply()批量计算差值。

✅ 关键习惯:

  • 所有原始数据下载后,立刻用df.to_csv('raw_data_2023.csv', index=False)保存一份,下次运行直接pd.read_csv(),不重复调接口(避免Token限流);
  • 在代码开头写清楚注释:“本分析基于2023年数据,结论仅反映该时段,不构成投资建议”——既是学术规范,也是保护自己。
    从那以后我每次交作业,都强制把数据、代码、图表、文字结论打包成一个文件夹,命名含日期和主题(如20231025_monetary_policy_analysis)。导师抽查时,3秒就能复现全过程,再也不用担心“你这图怎么来的?”。

5.2 如果你目标是数据分析岗:用TuShare练透pandas的“数据管道”思维

企业里真正的数据分析,80%时间在清洗、对齐、聚合数据,而非建模。TuShare是绝佳的练习场,因为它的数据天然带“脏点”:停牌日缺失、ST股异常波动、新股上市首日无前复权价……正好练你处理真实世界数据的能力。推荐一个渐进式训练:

阶段任务锻炼能力预计耗时
初级取10只股票2023年日线,合并成一张宽表(每只股票一列close),处理缺失值(用前向填充)pd.concat(),fillna(method='ffill')1小时
中级计算每只股票的年化波动率(std()*sqrt(250)),按波动率分组(高/中/低),画箱线图对比groupby(),agg(),sns.boxplot()2小时
高级构建“行业轮动”信号:每月初,取申万一级行业指数(需用pro.index_daily)过去3个月涨幅,选涨幅前三的行业,模拟等权持有至下月初时间序列滚动、日期偏移(pd.offsets.MonthBegin())、多层索引半天

⚠️ 血泪经验:别一上来就学“机器学习选股”。我见过太多人花两周调通LSTM模型,结果发现训练数据里混进了2015年杠杆牛的极端值,模型学到的全是噪音。先用pandas把数据质量、业务逻辑理清楚,模型才是锦上添花。

5.3 如果你好奇“量化交易”:从“信号回测”开始,拒绝玄学

很多新人以为量化=写复杂策略+高频交易。其实最扎实的起点,是把一个简单规则,用历史数据跑一遍,看它在过去5年赚不赚钱。比如:“每月第一个交易日买入沪深300,持有一月后卖出”——这就是经典的“定投策略回测”。用TuShare实现只需20行:

# 获取沪深300日线 df = pro.index_daily(ts_code='399300.SZ', start_date='20190101', end_date='20231231') df['trade_date'] = pd.to_datetime(df['trade_date']) df = df.sort_values('trade_date').set_index('trade_date') # 生成每月第一个交易日(用pandas的MonthBegin偏移) monthly_first = df.index.to_series().groupby(df.index.to_period('M')).min() # 对每个买入日,找下一个卖出日(一个月后首个交易日) buy_dates = [] sell_dates = [] for d in monthly_first: sell_d = d + pd.offsets.MonthBegin(1) # 加一个月 # 找最近的交易日(可能sell_d当天休市) actual_sell = df.index[df.index >= sell_d].min() buy_dates.append(d) sell_dates.append(actual_sell) # 计算每次买卖的收益率 returns = [] for buy, sell in zip(buy_dates, sell_dates): if sell in df.index and buy in df.index: r = (df.loc[sell, 'close'] - df.loc[buy, 'close']) / df.loc[buy, 'close'] returns.append(r) print(f"2019-2023年定投沪深300年化收益:{np.mean(returns)*12*100:.2f}%")

✅ 这个练习的价值在于:

  • 你亲手处理了“日期对齐”这个量化中最常见的坑(不是所有日期都有数据);
  • 看到真实结果:可能年化只有6%,远低于宣传的“年化15%”,但你知道每一分收益从哪来;
  • 后续想加手续费、滑点?只改2行代码。这才是可迭代的策略开发。
    从那以后我每次看到“稳赚不赔”的策略宣传,第一反应不是心动,而是打开TuShare,用同样代码跑一遍它声称的回测周期——至今没遇到一个能扛住2015年和2018年双杀的。希望帮到你。

本文还有配套的精品资源,点击获取

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

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

立即咨询