Tushare stk_auction 完全指南:当日集合竞价数据接口落地手册
【免费下载链接】Vibe-Trading"Vibe-Trading: Your Personal Trading Agent"项目地址: https://gitcode.com/GitHub_Trending/vi/Vibe-Trading
你正在做打板,9:26 想一次性扫完全市场的集合竞价数据获取结果:哪些票竞价放量抢筹,哪些竞价就在出货。日线做不到这件事——它要等收盘才出现。你要的是当日 9:25 撮合出来的竞价成交截面,Tushare 的stk_auction接口就是干这个的:一次调用返回全市场约 6500 行的竞价量、竞价价、竞价金额、量比和换手率。这篇带你把它从参数、字段一直用到批量采集和竞价量比选股。
接口速览:4 分钟窗口与 8000 行上限
| 项目 | 说明 |
|---|---|
| 接口名 | stk_auction(Tushare 接口 ID 369) |
| 功能 | 获取当日个股和 ETF 的集合竞价成交情况 |
| 数据时效 | 每天 9:25~9:29 可获取当日数据 |
| 单次行数上限 | 最大返回 8000 行 |
| 权限 | 单独开权限数据;已开通股票分钟权限的用户自动获得 |
A 股在 9:15–9:25 进行开盘集合竞价:9:15–9:20 可申报可撤单,9:20–9:25 不可撤单,9:25 交易所按最大成交量原则撮合出开盘价。stk_auction拿到的就是这一刻的全市场成交快照,它和盘后更新的历史竞价接口时效完全不同。在 Vibe-Trading 仓库里,该接口被归入 Tushare 技能的「股票数据 / 打板专题数据」分类,与limit_list_d(涨跌停和炸板)、stk_auction_o/stk_auction_c(盘后开盘/收盘竞价 OHLCV)拼起来,能覆盖盘前抢单到盘后复盘的完整链路。
输入参数与输出字段速查
四个入参全部可选,组合方式决定你拿到什么:
| 名称 | 类型 | 必选 | 说明 |
|---|---|---|---|
ts_code | str | N | 股票代码,如600071.SH |
trade_date | str | N | 交易日期(YYYYMMDD) |
start_date | str | N | 开始日期 |
end_date | str | N | 结束日期 |
- 不传任何参数:返回当日全市场数据(当前行情下约 6500 行,一次拉完);
- 传
trade_date:只取某一天; - 传
start_date+end_date:按日期区间拉,受 8000 行上限约束,实际建议按日循环; - 传
ts_code:单标的扫描,适合自选池逐个过。
出参共 9 列:
| 名称 | 类型 | 说明 |
|---|---|---|
ts_code | str | 股票代码 |
trade_date | str | 数据日期 |
vol | int | 成交量(股) |
price | int | 成交均价(元) |
amount | float | 成交金额(元) |
pre_close | float | 昨收价(元) |
turnover_rate | float | 换手率(%) |
volume_ratio | float | 量比 |
float_share | float | 流通股本(万股) |
字段间的换算关系可以随手验证:amount ≈ vol × price;volume_ratio = 竞价成交量均量 / 过去若干日同期均量。量比是竞价抢筹意愿的强度计,换手率反映竞价阶段的筹码换手——一个看意愿,一个看筹码。注意两点:ETF 标的(159/123 开头的代码)的turnover_rate和volume_ratio返回 NaN,因为基金没有传统意义的换手率;vol单位是股而float_share单位是万股,混用时差一个 10000 倍。
最小可用示例:一次调用取一天竞价数据
环境准备两行:
pip install tushare -i https://pypi.tuna.tsinghua.edu.cn/simple export TUSHARE_TOKEN=your_tokenToken 也可以走仓库统一的环境变量管理:字段TUSHARE_TOKEN定义在 agent/src/config/env_schema.py,预检逻辑在 agent/src/preflight.py。初始化与 agent/src/skills/tushare/scripts/stock_data_example.py 保持一致:
import os import tushare as ts token = os.getenv('TUSHARE_TOKEN') or ts.get_token() pro = ts.pro_api(token) df = pro.stk_auction( trade_date='20250218', fields='ts_code,trade_date,vol,price,amount,' 'turnover_rate,volume_ratio' ) print(df)跑一下看看,返回是 pandas DataFrame,样例如下:
ts_code trade_date vol price amount turnover_rate volume_ratio 0 600071.SH 20250218 8700 23.240 202188.00 0.003090 0.150628 1 300053.SZ 20250218 53300 13.750 732875.00 0.008388 0.230996 2 159558.SZ 20250218 18700 1.211 22645.70 NaN NaN 3 600879.SH 20250218 195900 9.190 1800320.00 0.005938 0.373839 ... ... ... ... ... ... ... ... 6507 300616.SZ 20250218 142700 14.370 2050600.00 0.091494 1.184760 6508 836957.BJ 20250218 300 12.310 3693.00 0.000702 0.012952 6509 123039.SZ 20250218 20 119.777 2395.54 NaN NaN 6511 300949.SZ 20250218 25600 41.210 1054980.00 0.042667 0.830128从这段输出能直接读出三个事实:
- 代码后缀区分市场:
.SH上交所、.SZ深交所、.BJ北交所,ETF 混在同一张表里(如159558.SZ); - ETF 的
turnover_rate、volume_ratio是 NaN,统计前必须按代码段过滤或fillna(0)兜底; - 极值样本明显:
123039.SZ竞价成交仅 2395.54 元,属于流动性极差的标段;300616.SZ量比 1.18、换手 9.1%,是当日竞价强度最高的样本之一。
批量采集函数:按日期循环抓区间竞价数据
单次 8000 行对全市场单日(约 6500 行)够用,历史回补或数据量增长后就会触顶,所以按日循环、每次打印行数校验是稳妥姿势:
import os import time import pandas as pd import tushare as ts from tushare.util import dateu pro = ts.pro_api(os.getenv('TUSHARE_TOKEN') or ts.get_token()) def fetch_auction(start_date, end_date, ts_code='', pause=0.3): """按日循环抓取日期区间的集合竞价数据""" fields = ('ts_code,trade_date,vol,price,amount,' 'pre_close,turnover_rate,volume_ratio,float_share') frames, day = [], start_date while day <= end_date: df = pro.stk_auction( trade_date=day, ts_code=ts_code, fields=fields) frames.append(df) print(f'{day}: {len(df)} rows') day = dateu.get_next(day) # 自动跳到下一交易日 time.sleep(pause) return pd.concat(frames, ignore_index=True) hist = fetch_auction('20250201', '20250228', ts_code='600071.SH')dateu.get_next会跳过周末;若你要更严格的日历控制,用 交易日历(trade_cal)先生成交易日序列再循环即可。
竞价量比选股:三个落地方向与一行式筛选
方向一:量比 + 高开幅度双条件。volume_ratio明显放大说明竞价资金在抢筹,但要卡住高开幅度,否则追高开就是接刀。一行式:
df['open_gap'] = (df['price'] - df['pre_close']) / df['pre_close'] picks = df[(df['volume_ratio'] > 1.5) & (df['open_gap'] < 0.05)] picks = picks.sort_values('amount', ascending=False).head(20)方向二:竞价资金强度排序。直接按amount降序看全市场竞价成交额分布,前 20 名就是当日资金重点进攻方向;若某票turnover_rate已很高但高开有限,要反过来警惕竞价出货。
方向三:与打板数据联动做晋级预判。用 涨跌停和炸板数据(limit_list_d)取昨日涨停股,拿它的limit_times(连板数)、fd_amount(封单金额)、first_time(首封时间)做底池,再在 9:25–9:29 窗口内扫这批票的竞价量比和高开幅度,两个信号共振的才留作晋级候选。
避坑清单:时间窗口、权限与字段缺失
- ⏱️窗口只有 4 分钟:当日数据仅 9:25~9:29 可取,错过就没了,只能等下一交易日。定时任务锚定 9:25 之后、9:30 连续竞价开始前触发。
- ⚠️权限要预检:这是单独开权限的数据,无权限调用会直接报权限类错误。先确认
TUSHARE_TOKEN注入成功(env_schema.py 的tushare_token字段)。 - ETF 字段缺失:
turnover_rate、volume_ratio对 ETF 返回 NaN,直接参与排序或比较会把 NaN 行为带偏。按代码段过滤或fillna(0)再统计。 - 8000 行静默截断:数据量逼近上限时多出的行不报错、直接丢。按日循环并打印每次返回行数,和预期行数对账。
- 单位不统一:
vol是股、float_share是万股、price和amount是元。拿vol / float_share算占比前先乘 10000,否则结果差 4 个数量级。 - 金额下限别忘:低流动性标的竞价成交只有几千元(样例里 2395.54 元),不设
amount下限,噪声会大量混进候选池。
延伸阅读:关联文档与下一步
- 开盘竞价成交(当日).md.md):
stk_auction的原始参数与数据示例 - 涨跌停和炸板数据.md:
limit_list_d连板数、封单金额字段 - 股票开盘集合竞价数据.md:
stk_auction_o,盘后更新的开盘竞价 OHLCV,单次 10000 行 - Tushare 技能总览:Token 配置与全量接口目录
下一步建议:先把单日调用和批量函数各自跑通一遍,核对行数与字段,再叠加量比、高开幅度、竞价金额三道阈值,最后接上limit_list_d的连板底池——这样你就有一条完整可回测的竞价打板流水线。
【免费下载链接】Vibe-Trading"Vibe-Trading: Your Personal Trading Agent"项目地址: https://gitcode.com/GitHub_Trending/vi/Vibe-Trading
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考