
安装Tushare并拿到通行证
想用Tushare抓数据,第一步是把它装进你的Python环境。打开命令行输入 pip install tushare ,等进度条跑完就行。装好之后还没法直接用,Tushare需要注册用户才能调用接口。去官网 tushare.pro 注册账号,登录后进入个人主页,找到“接口TOKEN”那一串字符,复制下来。这串token就是你的钥匙,每次调用接口都要带上它。
代码里先导入tushare,然后设置token:
import tushare as ts
ts.set_token('你的token字符串')
pro = ts.pro_api()
pro_api() 返回一个接口对象,后面所有数据请求都靠它。注意token不要泄露,否则别人可能用你的积分额度。

用pro_bar获取茅台日线
Tushare获取股票日线行情有两个常用方法,pro.daily() 和 ts.pro_bar()。前者返回未复权数据,后者支持复权。做量化回测或者看真实收益,必须用前复权数据,因为除权除息会让价格跳空,不复权会扭曲收益率。
茅台股票代码是 600519.SH。调用 ts.pro_bar() 时指定 adj='qfq' 就是前复权。
df = ts.pro_bar(ts_code='600519.SH', adj='qfq',
start_date='20230101', end_date='20231231',
freq='D')
freq='D' 表示日线,也可以改成 'W' 周线或 'M' 月线。返回的DataFrame包含这些列:trade_date(交易日期)、open、high、low、close、pre_close、change、pct_chg、vol、amount。vol是成交量(手),amount是成交额(千元)。
处理日期格式和空数据
Tushare返回的trade_date是字符串格式,比如'20230103'。做时间序列分析需要转成datetime类型:
df['trade_date'] = pd.to_datetime(df['trade_date'])
df.set_index('trade_date', inplace=True)
df.sort_index(inplace=True)
有时接口会返回空DataFrame,原因可能是日期区间内没有交易日,或者积分不够。新注册用户积分通常只有100,而日线接口需要至少120积分。每天签到、完善个人信息可以攒积分。如果积分不足,调用 pro.daily() 也会报错。
另一个坑是股票代码格式。有些接口要求带交易所后缀,有些不用。ts.pro_bar() 必须用 600519.SH,而 pro.daily() 同样。如果写成 '600519' 会返回空值。
批量获取多只股票日线
做股票池回测时,一只只抓太慢。可以写循环,把股票代码放在列表里,依次调用接口。注意Tushare有每分钟调用次数限制,普通用户每分钟最多200次。超过会报“抱歉,您每分钟最多访问该接口200次”。加个 time.sleep(0.5) 能缓解。
import time
codes = ['600519.SH', '000858.SZ', '000568.SZ']
for code in codes:
df = ts.pro_bar(ts_code=code, adj='qfq',
start_date='20230101', end_date='20231231')
df.to_csv(f'{code}_daily.csv', index=False)
time.sleep(0.3)
保存成CSV文件后,下次直接读本地文件,不用重复请求接口,节省积分也提速。
用daily接口获取未复权数据
pro.daily() 返回未复权行情,字段和 ts.pro_bar() 类似,但参数不同。它不需要 adj 和 freq,直接传 ts_code 和日期。
df = pro.daily(ts_code='600519.SH',
start_date='20230101', end_date='20231231')
这个接口单次最多返回6000条记录,日线数据一年约250条,所以一次请求足够。如果抓十年数据,需要分段请求。未复权数据适合计算真实成交量和成交额,复权数据适合看价格趋势。
常见错误与排查
错误1:token无效。检查是否复制了完整token,有没有多余空格。
错误2:积分不足。去Tushare官网看接口权限,日线需要120积分。每天签到得1分,邀请好友得50分。
错误3:返回空DataFrame。先确认股票代码带后缀,再确认日期区间内有交易日。试试把日期改成最近一个月。
错误4:频率超限。降低请求频率,或者升级积分等级。
错误5:复权因子问题。ts.pro_bar() 的前复权基于最新除权日计算,历史数据会随新除权调整。做回测时每次都要重新拉取,不能直接用旧数据。
把数据存进数据库
CSV适合小规模数据,股票多了以后查询慢。用SQLite或MySQL存起来,方便按日期和代码索引。
import sqlite3
conn = sqlite3.connect('stock.db')
df.to_sql('maotai_daily', conn, if_exists='replace', index=False)
之后用pandas的 read_sql 直接读,配合SQL的WHERE条件筛选日期,比读CSV快很多。量化交易系统通常每天收盘后批量更新数据,把最新交易日的数据追加到数据库。
Tushare还有 pro.daily_basic() 接口,能抓市盈率、换手率、总市值等基本面指标,结合日线行情做多因子选股。茅台这类白马股,日线数据配合财务指标,能构建出稳定的策略信号。