Tushare Pro 上手心得:从拿到 Token 到均线与收益统计
标签:
TusharePython量化金融数据摘要:这是一份学习笔记,记录我作为一个对量化感兴趣的学习者使用 Tushare Pro 的过程。内容包括注册和获取 Token、安装与初始化、三个实战代码示例(个股日线、指数行情与每日指标、均线和收益统计并画图),以及积分与频次限制的说明、踩过的坑,还有 Tushare 在理论验证和量化入门中帮到我的地方。
一、为什么我会用 Tushare
作为一个对量化感兴趣的学习者,我在学习 CAPM、有效市场假说、时间序列模型这些内容时,总想拿真实的 A 股数据亲手验证一下,而不是只看书本里的结论。
问题是数据从哪里来。手动从行情软件导出 Excel 很麻烦,格式也不统一;自己写爬虫又不稳定,还有合规风险。后来有朋友推荐了Tushare Pro(tushare.pro)。它是一个面向量化研究的金融数据平台,提供 Python SDK 和 HTTP 接口,覆盖股票、指数、基金、期货、宏观经济等数据,返回结果直接就是pandas.DataFrame,和我平时的数据分析流程无缝衔接。对个人学习者来说,最大的价值是:省去数据清洗和采集的时间,把精力放在研究问题本身上。
二、注册与获取 Token
- 打开 tushare.pro,用手机号注册账号(新用户注册会获得基础积分)。
- 登录后进入「个人主页」→「接口TOKEN」,就能看到自己的 Token。
- 建议顺手完善个人资料,按官方积分规则,完善资料还能额外获得少量积分。
Token 相当于你的账号密码,千万不要提交到 GitHub 或者贴在博客里。下文所有代码都用占位符YOUR_TOKEN_HERE表示。
我的做法是把 Token 放在环境变量里:
# Linux / macOS,写入 ~/.bashrc 或 ~/.zshrcexportTUSHARE_TOKEN="YOUR_TOKEN_HERE"三、安装与初始化
pipinstalltushare# 如需升级到最新版pipinstalltushare--upgrade初始化有两种常见方式:
importosimporttushareasts# 方式一:直接传入 token(推荐配合环境变量,避免硬编码)pro=ts.pro_api(os.environ.get("TUSHARE_TOKEN","YOUR_TOKEN_HERE"))# 方式二:先 set_token(会在本地用户目录保存一份),之后可直接 ts.pro_api()# ts.set_token("YOUR_TOKEN_HERE")# pro = ts.pro_api()set_token只需要执行一次,之后在同一台电脑上ts.pro_api()就能直接用。不过我经常在不同电脑和服务器之间切换,所以更习惯用环境变量。
四、实战示例
示例 1:获取个股日线行情(pro.daily)
daily是最基础的接口,基础积分就能调用。日期参数统一用YYYYMMDD字符串格式。
df=pro.daily(ts_code="000001.SZ",start_date="20240101",end_date="20241231")print(df.head())print(df.columns.tolist())返回的 DataFrame 包含ts_code, trade_date, open, high, low, close, pre_close, change, pct_chg, vol, amount等字段。有几点要注意:
- 数据默认按日期倒序排列(最新的在最前面),做时间序列分析前一定要先排序;
vol的单位是「手」,amount的单位是「千元」;daily返回的是未复权行情,停牌期间不提供数据。
如果需要复权数据,可以用通用行情接口ts.pro_bar:
# 前复权日线,adj 可选 None / 'qfq' / 'hfq'df_qfq=ts.pro_bar(ts_code="000001.SZ",adj="qfq",start_date="20240101",end_date="20241231")拉全市场数据时,官方建议按交易日循环(pro.daily(trade_date="20240102")一次取当天所有股票),而不是循环股票代码,这样请求次数少得多。
示例 2:指数行情与每日指标(index_daily / daily_basic)
做市场比较或计算 Beta 的时候,需要基准指数,比如沪深300:
idx=pro.index_daily(ts_code="000300.SH",start_date="20240101",end_date="20241231")# 每日指标:市盈率、市净率、换手率、市值等basic=pro.daily_basic(ts_code="000001.SZ",start_date="20240101",end_date="20241231",fields="ts_code,trade_date,close,turnover_rate,pe_ttm,pb,total_mv",)这两个接口很实用,但按官方文档,index_daily和daily_basic都需要累计 2000 积分才能调用。注册送的基础积分是不够的,这也是我想提升积分的主要原因:因子分析、估值对比几乎都绕不开这些数据。
小技巧:用fields参数只取需要的列,返回更快,代码也更干净。
示例 3:均线与收益统计 + 画图(pandas + matplotlib)
这是我在练习中最常用的一段流程:拿到日线,计算日收益率、累计收益、年化波动率,再画收盘价和均线。
importosimportnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimporttushareasts pro=ts.pro_api(os.environ.get("TUSHARE_TOKEN","YOUR_TOKEN_HERE"))df=pro.daily(ts_code="600519.SH",start_date="20230101",end_date="20241231")# 1. 预处理:日期转 datetime,按时间正序排列df["trade_date"]=pd.to_datetime(df["trade_date"],format="%Y%m%d")df=df.sort_values("trade_date").set_index("trade_date")# 2. 均线df["MA20"]=df["close"].rolling(20).mean()df["MA60"]=df["close"].rolling(60).mean()# 3. 收益统计(pct_chg 是百分数,需要除以 100)ret=df["pct_chg"]/100stats={"交易日数":len(ret),"日均收益率":ret.mean(),"日收益标准差":ret.std(),"年化波动率":ret.std()*np.sqrt(252),"区间累计收益":(1+ret).prod()-1,"最大单日涨幅":ret.max(),"最大单日跌幅":ret.min(),}print(pd.Series(stats))# 4. 简单的均线交叉信号(仅作学习演示,不构成投资建议)df["signal"]=(df["MA20"]>df["MA60"]).astype(int)df["strategy_ret"]=df["signal"].shift(1)*ret# 用前一日信号,避免未来函数# 5. 画图plt.rcParams["font.sans-serif"]=["SimHei"]# 中文显示,macOS 可改为 "Arial Unicode MS"plt.rcParams["axes.unicode_minus"]=Falsefig,axes=plt.subplots(2,1,figsize=(12,8),sharex=True)df[["close","MA20","MA60"]].plot(ax=axes[0])axes[0].set_title("600519.SH 收盘价与均线(未复权)")(1+ret).cumprod().plot(ax=axes[1],label="买入持有")(1+df["strategy_ret"].fillna(0)).cumprod().plot(ax=axes[1],label="MA20/MA60 策略")axes[1].set_title("累计净值对比")axes[1].legend()plt.tight_layout()plt.show()运行后会打印一组区间收益统计指标,并得到两张图:上图是收盘价和 20/60 日均线的走势,下图是「买入持有」和「均线策略」的累计净值曲线。具体数值取决于你选的股票和区间,这里就不贴了,建议大家自己跑一遍感受一下。
需要说明的是,上面的示例用的是未复权价格,遇到分红除权时价格会出现跳空,计算均线会有偏差。认真做研究时建议换成ts.pro_bar(..., adj="qfq")的复权数据;收益率用pct_chg则问题不大,因为它是基于除权后的昨收计算的。
五、积分制度与频次限制
Tushare Pro 用积分来管理数据权限,这是新手最需要理解的一点:
- 积分决定能调用哪些接口:基础行情(如
daily)门槛较低,指数行情、每日指标、财务数据等需要更高积分(如 2000 分),更高级的数据需要 5000 分以上; - 积分也决定调用频次:例如
daily接口文档说明基础积分下每分钟可调用 500 次,每次最多返回 6000 条;积分越高,频次越宽松; - 积分获取途径:注册、完善资料、推荐用户、提交 bug、贡献代码、撰写 Tushare 使用文章等,在校学生和高校老师还可以按官方的高校计划申请相应权限;
- 具体每个接口的积分要求,以官网各接口文档页为准,平台会调整,不要只看网上的旧教程。
六、踩坑与小技巧
- 日期格式:一律用
"20240101"这样的字符串,写成"2024-01-01"会取不到数据。 - 默认倒序:
rolling、shift之前一定先sort_values,否则均线是「反着算」的,结果完全错误,而且不会报错。我第一次写分析脚本就栽在这里。 - 单位换算:
vol是手,amount是千元,total_mv是万元,pct_chg是百分数,跨表合并时尤其要小心。 - 频次控制:循环批量拉取时加
time.sleep(),并做好异常重试;拿到的数据落地成本地 CSV/Parquet,不要每次运行脚本都重新请求。 - 代码后缀:股票是
.SZ / .SH / .BJ,指数代码的后缀以index_basic返回的ts_code为准。 - 避免未来函数:回测里用信号时记得
shift(1),这是量化入门最常见、我自己也确实犯过的错。 - Token 安全:放进环境变量或
.env文件,并加入.gitignore。
七、Tushare 对我学习的帮助
- 理论验证:学习投资学和计量方法时,我可以直接用真实 A 股数据做收益率分布检验、CAPM 回归和 Beta 估计,而不是用模拟数据;
- 量化入门:从均线策略到简单的多因子框架(估值、换手率、动量),Tushare 统一的数据格式让我能把更多时间花在因子逻辑、回测框架和风险控制上;
- 机器学习练习:我在学机器学习,Tushare 提供了结构化、长时间跨度的面板数据,正好用来练习特征工程和时间序列交叉验证,也让我更直观地体会到金融数据「低信噪比、非平稳」的特点。
八、总结
对学习者来说,Tushare Pro 是一个门槛低、文档清晰、和 Python 生态契合度很高的金融数据平台:pip install tushare,配置好 Token,几行代码就能拿到干净的 DataFrame。入门时把日期格式、排序、单位和积分权限这几个点搞清楚,就能少走很多弯路。接下来我计划用更高积分的财务数据和每日指标,继续整理多因子研究的学习笔记,也欢迎同样在学量化的朋友交流。
本文代码仅用于学习交流,不构成任何投资建议。