每天看自选股,少不了打开行情页面、翻一遍列表,再点进几只股票看看。二三十只还好;要是 A 股、港股、美股都有关注的公司,名单分在几处,来回切换就有点费劲了。
这时很容易冒出一个小想法:做张自己的看板,把几个市场的自选股放在一起,价格、涨跌幅和成交额一起更新,符合条件时提醒一下。工具能先帮自己省下这些重复操作,就已经有了用处。
下面以 TickDB 的行情接口为例,从小范围自选股聊到全市场扫描,再看看行情接回来以后,怎样变成一条有用的提醒。文中的港股快照和交易日历来自 2026 年 10 月 2 日的实际调用,代码片段演示其中的处理逻辑。
一、从几十只到几百只,行情想更新多快
用着用着,股票池可能就变大了。原本每个市场只关注一小批公司,后来想把 A 股的某个行业、港股的同行公司、美股的相关企业都放进来,合起来就可能有几百只。再往后,还可能想在盘中持续扫某个市场,把原本没在自选里、却出现了关注信号的股票找出来。
同样是“做个选股工具”,要盯多少股票、想多快知道变化,会让行情 API 的接法差很多。
几十只自选股,可能每分钟刷新一次就够了,也可能需要一直盯着某个价格条件。几百只候选股,可以定时重排;需要从市场里不断发现新名字时,才会进一步用到全量行情。把这两个问题想清楚,后面的接法就容易选了。
少量自选股,先把一批查询跑起来
普通 Ticker REST 可以一次查询多个代码。像 600519.SH、700.HK、AAPL.US 这样的股票,可以放在同一批请求里:
GET /v1/market/ticker?symbols=600519.SH,700.HK,AAPL.US&type=stock
X-API-Key: YOUR_API_KEY
做看板时,几个市场可以共用查询行情、更新最新价和计算筛选条件这套代码。市场和币种仍然各自保留,页面展示时再一起排进列表。
这个接口单次最多查询 50 个代码。只有 30 只自选股时,一条请求就能装下。用户打开页面时查一次,或者隔一段时间刷新,再按自己的条件筛一遍,工具就可以先用起来。
如果想在条件满足时尽快收到提醒,普通 Ticker WebSocket 也能用。一个订阅消息里可以放多个股票代码:
{
"cmd": "subscribe",
"data": {
"channel": "ticker",
"symbols": ["600519.SH", "700.HK", "AAPL.US"]
}
}
接着持续接收行情更新,更新哪只股票,就检查哪只股票的条件。股票只有几十只,也可能有持续盯盘的需求;几百只股票能否一起订阅,则要核对实际的订阅额度。
几百只候选股,一轮要发多少请求
比如在几个市场里按行业或基本面圈出 300 只,每分钟用行情重排一次,按 50 只一批,拆成 6 批请求就可以完成一轮。
只是刷新越快,请求也越密。改成每 10 秒跑一轮,光这一件事就需要每分钟 36 次请求,还得给其他接口调用留点余量。
| 股票池 | 每轮请求数 | 每 60 秒一轮 | 每 10 秒一轮 |
|---|---|---|---|
| 30 只 | 1 | 1 次/分钟 | 6 次/分钟 |
| 300 只 | 6 | 6 次/分钟 | 36 次/分钟 |
| 1,000 只 | 20 | 20 次/分钟 | 120 次/分钟 |
表里算的是请求数量。一轮实际要花多久,还要看响应时间和限流;要是上一轮还没完成,下一轮又开始了,请求就会越积越多。定时任务可以等这一轮结束,再安排下一轮。
拆分本身不复杂。先去掉重复代码,每批查询完成后,按股票代码保存返回的行情:
def refresh_watchlist(symbols, fetch_ticker):
symbols = list(dict.fromkeys(symbols))
latest = {
}
for start in range(0, len(symbols), 50):
batch = symbols[start:start + 50]
for quote in fetch_ticker(batch):
latest[quote["symbol"]] = quote
return latest
这里的 fetch_ticker 是封装好的单批查询函数:检查 HTTP 状态和业务 code,成功后返回 data 数组,失败时抛出错误。这样某一批没查到,调用方能明确知道这一轮没有完成。
得到 latest 后,再按自己的条件排序或筛选。六批行情的时间戳可能不同,页面保留各条数据的更新时间,也方便发现某只股票已经有一阵子没更新了。
如果刷新间隔越调越短,还是达不到自己想要的提醒速度,就可以考虑普通 WebSocket,或者在扫描范围扩大到整个市场时改用全量订阅。
二、想扫描全市场,就把行情留在自己的缓存里
当目标变成盘中一直从某个市场里发现新候选,全量 WebSocket 就更贴近这个需求了。A 股、港股和美股都有各自的全量 Ticker,按关注的市场分别订阅。
比如做港股扫描,订阅消息可以这样写:
{
"cmd": "subscribe",
"data": {
"universes": ["HK_Stock"],
"channels": ["ticker"]
}
}
连接建立时还要协商 permessage-deflate 压缩。全量行情先以数组分批发送市场快照,后续继续发送变化行情,所以收到一个批次后,要逐条处理里面的 Ticker 消息。
工具里保留每只股票的最新状态,哪只股票有更新,就重新看看它是否满足条件。原本没有关注过的公司,也有机会从这里进入候选列表。

做成跨市场看板时,缓存键可以用“市场+股票代码”。全量样本里的腾讯代码是 700,普通查询用的是 700.HK;两种来源共用一份缓存时,先把代码转换成应用里统一的格式,再放进去。
持续扫描需要数据源提供对应市场的全量访问权限。要是每天只扫描几次,可以用全量 REST:需要时取一批市场数据,跑完规则就结束这一轮。
港股全量快照的请求路径是:
GET /v1/market/ticker/hk-stock
X-API-Key: YOUR_API_KEY
Accept-Encoding: gzip
这次实际调用返回了 3,326 条行情记录。先留下自己关注的品种,再跑一轮筛选条件,看看候选名单里会出现哪些名字。这里数的是行情记录,其中也包含指数等品种,筛选时要按自己的股票池范围处理。
三、同一张看板,几个市场按各自的时间跑
10 月 2 日,我先用交易日历分别查了 A 股和港股当天的安排。两次查询使用同一天,换一下市场参数:
GET /v1/market/trade-days?market=CN&beg_day=20261002&end_day=20261002
GET /v1/market/trade-days?market=HK&beg_day=20261002&end_day=20261002
两次都返回成功,结果是:
| 市场 | trade_days |
half_trade_days |
当天安排 |
|---|---|---|---|
| A 股(CN) | [] |
[] |
非交易日 |
| 港股(HK) | ["20261002"] |
[] |
全日交易日 |
于是这次用港股做行情样本。这个查询放进自己的工具里也很实用:每天准备开始扫描时,先看看各个市场今天有没有交易,再按各自的交易时段安排刷新。
交易日历告诉程序“今天交易”,接下来还要按市场当地时间检查交易时段。A 股、港股、美股分开安排,各自到了扫描时间再开始跑。
休市的市场就暂停盘中扫描和提醒,页面保留最近一次行情,旁边标上更新时间。遇到 A 股和港股的假期安排不同的日子,两边也能各跑各的;美股也按自己的交易日和时段安排。
这样的看板放在一起,用户可以少切几个页面;刷新任务则各自按市场运行。
四、价格之外,再看看日内位置和成交额
同一个跌幅,放回日内行情里看
行情接回来以后,最容易想到的筛选条件就是涨跌幅。动了多少,谁排在前面,一眼就能看懂。但只按涨跌幅排一个榜单,能看到的东西还是少了点。
拿港股全量快照里的腾讯控股来看,下面保留了这条实测记录中与价格、成交有关的字段:
{
"symbol": "700",
"name": "腾讯控股",
"last_price": "422.4",
"open": "422",
"prev_close": "431",
"high_24h": "425",
"low_24h": "420",
"volume_24h": "9733314",
"quote_volume_24h": "4115135268.622",
"price_change_percent_24h": "-2.00",
"timestamp": 1790912605000
}
数据时间是 2026 年 10 月 2 日 11:43:25,香港/北京时间。最新价 422.4 港元,比昨收的 431 港元跌了约 2%。
单看这个跌幅,容易把注意力都放在“跌了多少”上。再看一眼开盘价,是 422 港元,最新价其实比开盘还高了 0.4 港元;当日最高价是 425,最低价是 420。相对昨收是下跌,相对开盘却略高一点,几个字段放在一起,同一个价格就有了更多可看的背景。
| 想观察什么 | 可以用哪些字段 | 放在看板里的作用 |
|---|---|---|
| 相对上一交易日的变化 | last_price、prev_close |
看涨跌幅 |
| 开盘后的变化 | last_price、open |
看最新价与开盘价的差距 |
| 距离日内高低点的位置 | last_price、high_24h、low_24h |
区分靠近高点、低点或区间中部的股票 |
| 当天交易的活跃程度 | volume_24h、quote_volume_24h |
把成交背景放在价格旁边 |
| 数据停留在哪个时刻 | timestamp |
显示更新时间,识别陈旧行情 |
价格以字符串返回时,进入计算前先转换。下面把几个观察值收进一个函数;示例用于价格字段齐全的记录:
from decimal import Decimal
def price_context(quote):
price = Decimal(quote["last_price"])
close = Decimal(quote["prev_close"])
high = Decimal(quote["high_24h"])
low = Decimal(quote["low_24h"])
return {
"change_pct": (price / close - 1) * 100 if close else None,
"gap_to_high": high - price,
"day_position": (price - low) / (high - low) if high > low else None,
}
这个样本距日内高点 2.6 港元,在当天高低价区间里的位置约为 48%。如果两只股票都涨了 3%,一只已经离高点较远,另一只还贴着高点,仅看涨幅时很相似,加上这一列之后,就能分开观察了。当日高低价相等时,区间位置先留空,也方便看板继续显示其他信息。
成交额可以给价格变化补充背景
价格在动,交易有没有跟着活跃起来?腾讯这笔行情里的当日累计成交额约为 41.15 亿港元,股票池里可以把成交量、成交额一起摆出来看。
盘中把同一只股票前后两次的累计值留住,还能看这几分钟新增了多少成交量、成交额。假设前五分钟新增成交 2000 万港元,接下来的五分钟新增了 5000 万港元,就能看出最近这段交易更活跃。某只股票刚进入价格筛选条件,又出现这样的变化,就可以把两个现象一起写进提醒里,留给用户进一步判断。
这里相减的是同一交易日的累计值。跨到下一个交易日,累计量额会重新开始,程序也要重新建立比较基线。
成交额还会受到公司体量和交易活跃程度的影响。大公司的成交额高,很常见;一只股票今天成交多,也要和它平时的情况比较。比如上午十点的累计成交额,可以和前几天同一时间放在一起看。历史分钟 K 线积累下来的量额,就能补上这部分背景。
股票池跨了几个市场时,成交额还得看币种。人民币、港元、美元放在同一列里,只排数值大小就容易看错。看板里标明币种,跨市场比较前再统一换算,读起来会清楚些。
如果还想比较不同股票的活跃程度,可以通过综合指标补查量比、换手率;想进一步看资金流向,再参考资金流向指标。先有一个想弄明白的问题,再决定往看板上添哪一列,工具也比较容易保持好用。
五、接上行情以后,把提醒做得安静一点
记住上一次是否满足条件
同一只股票可能连续更新很多次。如果每条行情都重新发提醒,工具很快就会变得吵闹。可以记住这只股票上一次是否满足条件,只在“未满足”变成“满足”时提醒。
下面的函数处理已经解析好的单条行情。rule 是自己设置的判断函数,返回 True 或 False;所需字段暂时不够时返回 None,等数据齐了再判断。
latest = {
}
matched = {
}
def should_alert(market, update, rule):
key = (market, update["symbol"])
previous = latest.get(key)
if previous and update["timestamp"] < previous["timestamp"]:
return False
current = {
**(previous or {
}), **update}
latest[key] = current
hit = rule(current)
if hit is None:
return False
old_hit = matched.get(key)
matched[key] = hit
return old_hit is False and hit is True
第一条行情先建立基线。同一条件连续满足时保持安静,条件退出后又重新进入,再提醒一次。新的消息补充部分字段时,缓存里已有的其他字段继续保留;较旧的消息则跳过。
重连后重新建立基线
连接断开后,重新订阅会再次收到市场快照。这时把对应市场的行情缓存和命中状态重建一遍,第一条记录仍然先建立基线,避免恢复连接时把快照里的股票都当成新信号。心跳和重连放在连接管理里,判断函数继续负责行情和条件。
提醒的内容也可以更具体一点。例如:这只股票进入了设定的涨幅区间,目前接近日内高点,最近五分钟的成交额也高于前五分钟。用户收到之后,能看出是什么变化引起了提醒,也更容易决定接下来要研究什么。
六、从自己的股票池开始,边用边改
自选股只有几十只,可以围绕熟悉的公司设置提醒;候选池到了几百只,可以把价格、日内位置和成交活跃度放在一起重排;需要扫全市场时,则用全量行情不断发现新名字,再给这些候选补上历史走势和其他指标。
实际接起来,可以沿着这条路径慢慢加东西:先整理自己的股票池和市场信息,用批量快照把看板跑起来;需要持续观察时,再接上订阅;最后把关心的条件和提醒补进去。每一步都有具体的用途,也比较容易检查结果。
用起来以后,还可以把这些提醒留下来,过一阵子再回看。提醒太频繁,就收紧一点条件;某个行业想多看几眼,就加进候选池。个人开发者做自己的看板,研究团队做内部筛选工具,都可以从一个具体的小需求开始,边用边改,慢慢做成顺手的样子。
本文仅介绍行情 API 的应用思路。文中股票、行情样本及筛选条件用于演示,不构成投资建议或任何证券买卖推荐。
数据样本采集于 2026 年 10 月 2 日。
接口文档:docs.tickdb.ai