每天9点15分到9点25分,很多股票已经提前暴露资金态度。盯着涨幅榜追高,往往买在情绪顶点;只看竞价涨幅,又容易被虚假挂单误导。真正有用的集合竞价选股,需要把价格、成交额、未匹配量和开盘后承接放在一起判断。
集合竞价不是预测涨停,而是用有限信息筛出“值得继续观察”的股票。
一、集合竞价到底在看什么
集合竞价阶段,买卖双方提交订单,交易系统按照最大成交量原则撮合。9点15分到9点20分可以撤单,9点20分之后撤单限制增加,9点25分形成开盘价。
实战中,我会重点观察四个字段:
| 字段 | 含义 | 实战用法 |
|---|---|---|
| jjzf | 竞价涨幅 | 判断资金愿意把价格抬到什么位置 |
| jje | 竞价金额 | 判断参与资金是否足够真实 |
| noe | 未匹配金额 | 判断买卖盘哪一方更拥挤 |
| trend | 交易方向 | -1为主动性卖,0为中性盘,1为主动性买 |
单看竞价涨幅很容易踩坑。竞价涨幅达到8%,但成交额只有几十万元,可能只是流动性不足;竞价涨幅3%,成交额超过1000万元,同时未匹配金额持续偏向买方,参考价值更高。
二、我的集合竞价四层筛选法
1. 先做基础排雷
剔除退市整理、风险警示、上市时间过短、成交额长期低迷的股票。涨停价附近的股票,还要注意是否存在一字板无法成交的情况。
建议把竞价涨幅控制在2%至6%。涨幅太低,资金关注度不足;涨幅超过8%,开盘后容易出现获利兑现。
2. 看竞价金额是否达标
竞价金额是过滤“虚假强势”的核心指标。中小盘股可以设置1000万元起步,大盘股则需要结合流通市值提高门槛。
一个简单的标准是:
竞价金额占昨日成交额比例 = jje / 昨日成交额
这个比例不宜一刀切。市场活跃时可以放宽,缩量行情则要提高要求。
3. 观察未匹配金额方向
noe大于0,通常代表买方未匹配金额占优;noe小于0,代表卖方压力更明显。单个时点的未匹配量可能变化很快,最好连续读取9点20分、9点24分和9点25分附近的数据。
真正有参考价值的不是某一刻的买单,而是买方优势能否持续到竞价结束。
4. 等待开盘确认
竞价筛选只是建立候选池,不能直接当作买入信号。开盘后观察前5分钟:
- 价格是否站在竞价价之上;
- 成交量是否快速放大;
- 回踩时是否跌破竞价价;
- 所属板块是否同步走强。
如果个股高开后快速跌破竞价价,且卖单持续增加,即使竞价数据漂亮,也应放弃追涨。
三、用XTick接口获取竞价数据
XTick文档提供了“竞价数据-实时接口”,地址为/doc/core/bidtime,竞价时间段覆盖9点15分至9点25分。接口支持单只股票、最多100只股票批量查询,也支持code=all获取全市场数据。
请求地址格式如下:
http://api.xtick.top/doc/core/bidtime?type=1&code=all&token=YOUR_TOKEN
其中,type=1代表沪深京A股,token需要登录XTick网站后获取。
接口返回的核心字段示例:
{
"type": 1,
"code": "000001",
"time": 1725845100000,
"seq": 12,
"price": 11.26,
"close": 10.92,
"jjzf": 3.11,
"jjl": 86500,
"jje": 9736900,
"nol": 12000,
"noe": 1351200,
"trend": 1
}
jjzf表示竞价涨幅,jje表示竞价金额,noe表示未匹配金额,trend=1代表主动性买盘。时间字段为毫秒级时间戳,使用时要转换为北京时间。
四、把筛选条件写成程序
下面是一段可以直接改造的Python示例。代码只负责筛选候选股,不构成自动交易指令。
import requests
from urllib.parse import quote
API = "//api.xtick.top/doc/core/bidtime"
TOKEN = "YOUR_TOKEN"
option = {
"filter": "jjzf>=2;jjzf<=6;jje>=10000000;noe>0",
"sort": "noe",
"asc": 0,
"limit": 100
}
params = {
"type": 1,
"code": "all",
"option": quote(str(option).replace("'", '"')),
"token": TOKEN
}
resp = requests.get(API, params=params, timeout=10)
resp.raise_for_status()
rows = resp.json()
for row in rows:
print(
row["code"],
f"竞价涨幅={row['jjzf']:.2f}%",
f"竞价金额={row['jje']:.0f}",
f"未匹配金额={row['noe']:.0f}",
f"方向={row['trend']}"
)
接口文档中的option参数支持过滤、排序和数量限制。例如:
{
"filter": "jjzf>5;jje>=10000000",
"sort": "noe",
"asc": 0,
"limit": 100
}
通过这个参数,可以直接筛选竞价涨幅超过5%、竞价金额不低于1000万元的股票,并按未匹配金额从大到小排列。
在生产环境中,建议使用标准JSON编码:
import json
params["option"] = quote(json.dumps(option, ensure_ascii=False))
五、如何做历史回测
XTick还提供“竞价数据-历史接口”/doc/hot/bidhistory。该接口保留集合竞价阶段最后一条数据和开盘数据,可用于构建历史样本。
示例请求:
http://api.xtick.top/doc/hot/bidhistory?type=1&code=all&startDate=2026-09-09&endDate=2026-09-09&token=YOUR_TOKEN
历史接口中的序列字段需要特别注意:
| seq值 | 含义 |
|---|---|
| 0 | 开盘数据 |
| 1 | 集合竞价最后一条数据,通常对应9点25分 |
回测时不能拿收盘后的数据参与当天选股。正确流程是使用seq=1的数据生成候选池,再用seq=0确认开盘表现,最后计算买入后5分钟、30分钟或收盘收益。
六、一个更稳健的实战模板
可以把策略拆成“竞价初筛”和“开盘确认”两步:
| 阶段 | 条件 | 动作 |
|---|---|---|
| 9:20前 | 竞价涨幅2%至6%,竞价金额达标 | 建立观察名单 |
| 9:24后 | noe持续为正,trend多次为1 | 保留强势标的 |
| 9:25 | 竞价价格没有明显跳水 | 等待开盘 |
| 9:30至9:35 | 价格站上竞价价,成交量放大 | 评估是否参与 |
| 跌破竞价价 | 卖压增加、板块转弱 | 取消计划 |
这里的“参与”也要结合仓位管理。单只股票的试错仓位可以控制在总资金的10%以内,连续出现两次开盘破位时,暂停策略并检查市场环境。
七、常见误区
误区一:竞价涨幅越高越好
高开并不等于强势。超过7%的竞价涨幅,往往意味着更高的兑现压力,尤其是前一交易日已经大涨的股票。
误区二:看到大额买单就立即下单
竞价订单可能在规则允许的时间内撤销,单笔大单不能代表全天资金态度。应结合成交额、未匹配金额变化和开盘后承接判断。
误区三:忽视流动性
小市值、低成交量股票即使满足筛选条件,也可能出现滑点大、无法成交的问题。回测必须加入手续费、印花税、滑点和涨跌停无法成交等因素。
误区四:把回测结果当成收益承诺
集合竞价策略对市场风格非常敏感。震荡市、主升市和退潮期的表现差异明显,任何参数都需要滚动验证。
结语:把竞价信号变成交易纪律
集合竞价选股的核心,不是寻找一个“百分百上涨”的神奇指标,而是建立一套可重复执行的流程:用jjzf识别价格意愿,用jje确认资金规模,用noe观察买卖失衡,再用开盘后的价格和成交量完成确认。
竞价负责缩小范围,开盘负责验证逻辑,仓位负责控制结果。
接口详情可参考XTick接口文档,实盘接入前请先用历史数据和模拟账户验证参数。股市有风险,策略只能提高决策一致性,不能消除亏损可能。

