如何使用Tushare获取茅台的日线行情数据?

企业微信

安装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不要泄露,否则别人可能用你的积分额度。

如何使用Tushare获取茅台的日线行情数据?

用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() 接口,能抓市盈率、换手率、总市值等基本面指标,结合日线行情做多因子选股。茅台这类白马股,日线数据配合财务指标,能构建出稳定的策略信号。

转载请注明出处:https://www.lianghuajiaoyi.top/wenzhang/Tushare-maotai-1016.html