怎么用tushare轻松抓到实时股票数据?

企业微信

为什么你抓不到真正的实时数据?

很多人兴冲冲装了tushare,想拿实时股票价格,结果发现返回的数据总是慢半拍,甚至直接报错。这不能怪tushare,得先搞清楚它的定位——tushare本质是一个金融数据社区,靠积分制提供数据。免费账户能拿到的所谓“实时”,其实是15分钟延迟的行情。真正逐笔的实时Tick数据,需要升级到付费权限,或者换用其他专门做低延迟推送的接口。

对于做股票和期货的普通人,如果你只是想写个策略回测,或者盯盘时手动看看价格,15分钟延迟完全够用。非要毫秒级响应,那得走券商柜台或者交易所直连,成本不是小数目。

开通与基础准备

先注册tushare账号,拿到token。免费账户有基础积分,可以调用大部分日线、分钟线接口。实时数据接口主要是pro_bar,它支持股票、期货、基金。调用前需要设置token:

怎么用tushare轻松抓到实时股票数据?


import tushare as ts

ts.set_token('你的token')

pro = ts.pro_api()

注意:tushare的免费实时接口有频率限制,每分钟最多调多少次,具体看你的积分等级。频繁请求会被封IP几分钟,别问我是怎么知道的。

用pro_bar抓实时行情

pro_bar的参数里,freq设为'1min''5min'asset设为'E'(股票)或'C'(期货)。想要最新一根K线,可以这样:


df = ts.pro_bar(ts_code='000001.SZ', freq='1min', asset='E',

                start_date='2025-01-01 09:30:00',

                end_date='2025-01-01 15:00:00')

print(df.head())

返回的DataFrame里,trade_time是时间,close是收盘价,vol是成交量。如果你只想要最新价格,可以取df.iloc[0],因为tushare默认按时间倒序排列。

期货类似,把ts_code换成'IF2501.CFX'asset改成'C'。注意期货有夜盘,时间范围要相应调整。

实时数据的坑与替代方案

tushare免费版的实时数据有几个硬伤:

  • 延迟:股票15分钟,期货可能更久。

  • 限频:免费账户每分钟只能调几次,想监控多只股票根本不够。

  • 缺失:集合竞价、盘后固定价格交易等时段可能没数据。

想绕过这些限制,可以组合使用其他免费源。比如新浪财经的实时接口,用requests直接抓hq.sinajs.cn,速度飞快且无延迟,但格式是字符串,需要自己解析。或者用akshare,它封装了多个源,股票期货都能拿,缺点是偶尔不稳定。

对于量化交易,建议分层获取数据:日线用tushare,分钟线用akshare,tick级用付费的CTP接口或券商API。别指望一个免费工具包打天下。

期货实时数据的特殊处理

期货主力合约会换月,直接写死IF2501很快会失效。可以用tushare的fut_mapping接口查主力合约代码,或者用ts_code里的连续合约如IF.CFX,但连续合约的价格是拼接的,不适合实盘。

期货的实时行情包含买卖一档,tushare的pro_bar只给K线,不给盘口。要看盘口得用realtime_quote接口,但那个需要更高积分。普通散户做趋势跟踪,K线足够;做高频套利,必须上盘口数据。

一个简单的实时监控脚本

下面这个脚本每30秒拉一次最新分钟线,打印股票和期货的最新价。注意加time.sleep避免触发限频。


import tushare as ts

import time

ts.set_token('你的token')

pro = ts.pro_api()

codes = ['000001.SZ', '600519.SH', 'IF2501.CFX']

while True:

    for code in codes:

        try:

            df = ts.pro_bar(ts_code=code, freq='1min', asset='E' if code.endswith(('SZ','SH')) else 'C')

            if not df.empty:

                latest = df.iloc[0]

                print(f"{code} 最新价 {latest['close']} 时间 {latest['trade_time']}")

        except Exception as e:

            print(f"{code} 获取失败: {e}")

    time.sleep(30)

跑起来后你会发现,免费账户经常报“抱歉,您没有访问该接口的权限”。解决办法是攒积分,或者换用ts.get_realtime_quotes()——这个旧接口反而对免费用户友好,但只支持股票,不支持期货。

做股票日线级别策略,tushare免费版绰绰有余。做期货日内,tushare的延迟会让你错过开平仓点,建议直接上CTP或者买tushare的积分套餐。量化交易的核心不是数据多快,而是策略逻辑是否经得起推敲。数据慢15分钟,照样能跑中低频趋势策略。别被“实时”两个字绑架,先想清楚你的持仓周期。

转载请注明出处:https://www.lianghuajiaoyi.top/wenzhang/tushare-shishi-gupiao-shuju-720.html