从一条 stk_auction 代码到 A 股全市场当日竞价快照脚本
2026/9/17 17:10:06 网站建设 项目流程

从一条 stk_auction 代码到 A 股全市场当日竞价快照脚本

【免费下载链接】Vibe-Trading"Vibe-Trading: Your Personal Trading Agent"项目地址: https://gitcode.com/GitHub_Trending/vi/Vibe-Trading

A 股的 9:15–9:25 集合竞价(集中收集委托、按单一价格撮合的开盘定价环节)用 10 分钟决定了每只股票的开盘定位。Vibe-Trading 仓库的 Tushare 技能收录了stk_auction接口来取 Tushare 当日竞价数据:每天 9:25~29 分之间,可以拿到全市场个股与 ETF 的竞价成交快照,是打板、抢筹类策略判断"竞价强度"的第一手数据。下面先让一段能跑通的代码出现在你屏幕上。

30 秒上手

⚡ 前置条件:安装 tushare 并配置TUSHARE_TOKEN环境变量(变量定义见 agent/src/config/env_schema.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.head())

输出是一张 pandas DataFrame,单日约 6500 行,每行是一只标的当日的竞价结果。先别管参数细节,看懂返回的数据长什么样,才是用好这个接口的关键。

数据长什么样

每行 9 个字段,按作用可以归成三类:

字段单位作用
vol/price/amount股 / 元 / 元竞价成交量、成交均价、成交金额
pre_close昨收价,用于计算开盘高开幅度
volume_ratio竞价量相对近期同期的放量倍数,判断抢筹的核心指标
turnover_rate/float_share% / 万股竞价阶段筹码换手强度、流通股本

真实返回样例(2025-02-18):

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 4 159707.SZ 20250218 160800 0.628 100982.00 NaN NaN

重点看两件事。一是换算关系:amount ≈ vol × price(8700 × 23.24 = 202188 元),(price - pre_close) / pre_close就是高开幅度,volume_ratio > 1 说明竞价量能相对近期同期异常放大——这三个派生量是后面所有竞价策略的原料。二是数据质量:.SH / .SZ / .BJ后缀区分交易所,个股与 ETF 混在同一张表里,ETF(159、123 等开头的代码)的 volume_ratio 和 turnover_rate 是 NaN,因为基金没有传统换手概念,统计前要先按代码前缀过滤或补零;像样例里竞价金额只有 2395.54 元的 123039.SZ,属于流动性极差的标的,做打板研究时设一个金额下限就能滤掉这类噪音。

单日快照够人肉扫一眼,但要把策略回测起来,就需要多日历史数据——循环就派上用场了。

从单点到全市场

循环由三个硬约束驱动:单次请求最多返回 8000 行;当日数据只在 9:25~29 分之间能取,错过只能按日回补;连续请求还要控频避免限流。全市场单日约 6500 行,一次请求刚好拉完,所以历史数据只需按日循环,并让交易日历自动跳过周末:

import time import os import pandas as pd import tushare as ts pro = ts.pro_api(os.getenv('TUSHARE_TOKEN') or ts.get_token()) def fetch_auction(start_date: str, end_date: str, pause: float = 0.3): """按日循环抓取集合竞价快照(自动跳过非交易日)""" cal = pro.trade_cal(exchange='SSE', start_date=start_date, end_date=end_date, fields='cal_date,is_open') days = cal.query('is_open == 1')['cal_date'] frames = [] for day in days: frames.append(pro.stk_auction( trade_date=day, fields='ts_code,trade_date,vol,price,amount,' 'pre_close,turnover_rate,volume_ratio')) time.sleep(pause) return pd.concat(frames, ignore_index=True) hist = fetch_auction('20250210', '20250218') print(len(hist)) # 7 个交易日 × 约 6500 行

多日数据到手后,叠一层过滤就是盘前候选池:竞价成交额 > 5000 万、量比 > 1.5、高开幅度 < 3%,再按量比排序输出:

snap = pro.stk_auction(trade_date='20250218', fields='ts_code,vol,price,amount,pre_close,volume_ratio') snap['gap'] = (snap['price'] - snap['pre_close']) / snap['pre_close'] hot = snap[(snap['amount'] > 5e7) & (snap['volume_ratio'] > 1.5) & (snap['gap'] < 0.03)] print(hot.sort_values('volume_ratio', ascending=False).head(20))

如果只维护一个自选股池,直接传ts_code逐只取数,比每次拉全市场更省。数据攒齐之后,还有几个坑和几个近邻接口需要分清,再往上写策略。

踩坑与延伸

⚠️ 四个容易踩的坑:当日数据只有 9:25~29 分窗口可取,盘前定时任务应锚定 9:25 之后、9:30 连续竞价之前触发;单次 8000 行上限,数据量逼近上限时按日分批,避免静默丢行;接口是单独开权限的数据,已开通股票分钟权限的用户自动获得,无权限会直接报权限错误;单位上 vol 是股、price 是元、float_share 是万股,做金额聚合前先把单位统一。

仓库里还有三个容易混淆的近邻接口,按时效挑:

接口时效核心返回典型用途
stk_auction当日 9:25~29vol / price / amount、量比、换手率盘中抢筹决策
stk_auction_o每日盘后开盘竞价 OHLCV + vwap(单日 10000 行)盘后因子回测
stk_auction_c每日盘后收盘竞价 OHLCV + vwap盘后因子回测
limit_list_d每日盘后首封时间、炸板次数、连板数、封单金额打板晋级筛选

基于这份数据,两个可以直接落地的组合方向:

  1. 竞价量比选股:volume_ratio 明显放大(> 1.5)且高开幅度可控,通常是资金抢筹信号;再按 amount 排序看全市场资金进攻方向,高开但换手率走弱的标的要警惕竞价出货。
  2. 打板预筛:盘前对昨日涨停池(来自limit_list_d)扫一遍竞价量比与高开幅度,配合连板数 limit_times 做晋级预判,形成"竞价 + 打板"的完整流水线。

接口细节可查仓库文档 开盘竞价成交(当日).md.md)。

【免费下载链接】Vibe-Trading"Vibe-Trading: Your Personal Trading Agent"项目地址: https://gitcode.com/GitHub_Trending/vi/Vibe-Trading

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询