【Python实时盯盘与预警 #07】3 分钟涨幅最猛的 30 只:用 Python 算涨速排行榜

你有没有这种体验:盯着自选股,突然看到一只票直线拉升——等你切过去看,已经涨了 5% 了。你想知道此刻全市场哪些票涨得最快,不是涨跌幅排行(那看的是全天),而是最近几分钟内的涨速。

行情软件里那个"涨速榜"很多人都看过,但它是软件控制的,你没法自定义窗口、没法加自己的过滤条件、也没法存下来做回放。

这篇教你用 Python + 批量实时接口,两轮快照算涨速,100 只股票只花 10 次额度,排出自定义涨速排行榜。


本文你将得到什么

  • 一个涨速排行榜脚本:两轮快照法,100 只股票参与排行
  • 批量接口分批拉取的工程写法(stock_ssjy_more,每 20 只 1 次额度)
  • 涨速计算公式与窗口大小的选择建议
  • API 内置涨速字段(zs)与自己算的涨速对比,各自适用场景

什么是涨速,跟涨跌幅有什么区别

指标 计算方式 看什么
涨跌幅(zf) (现价 - 昨收) / 昨收 × 100% 全天累计涨了多少
涨速 (T2价格 - T1价格) / T1价格 × 100% 最近 N 分钟内涨了多少

涨跌幅看的是全天,一只票可能早上就涨停了,全天涨跌幅 10%,但此刻已经不动了。

涨速看的是当下——最近 3 分钟、5 分钟内价格变化了多少。涨速榜就是找"正在拉升"的票,而不是"已经涨了"的票。


两轮快照法

原理很简单:

T1 时刻:批量拉 100 只股票的现价 → 记录 p1
↓ 等待 N 秒
T2 时刻:再批量拉同一批股票的现价 → 记录 p2

涨速 = (p2 - p1) / p1 × 100%

按涨速降序排列 → 取 Top 30

额度计算:100 只股票,每 20 只一批 = 5 批,两轮共 10 次 API 调用。免费版 500 次/日,占 2%。

如果用单股接口逐只拉:100 × 2 = 200 次。差了 20 倍。这就是系列 #06 讲的批量接口的价值。


代码:涨速排行榜

import sys
import os
import time

证书加载(只读不打印)

from mairui import Client

SAMPLE_SIZE = 100 # 参与排行的股票数量
INTERVAL = 60 # 两轮快照间隔(秒),实盘建议 60-180
TOP_N = 30
BATCH_SIZE = 20 # 接口上限:每批最多 20 只

def fetch_batch(mc, codes):
"""分批拉取实时行情,返回 {code: data}。"""
result = {}
for i in range(0, len(codes), BATCH_SIZE):
batch = codes[i:i + BATCH_SIZE]
items = mc.stock_ssjy_more(",".join(batch))
for item in items:
result[item["dm"]] = item
return result

def main():
lic = "LICENCE-66D8-9F96-0C7F0FBCD073" # 演示证书,演示证书(读者复制即用,无需替换)
mc = Client(lic)

1. 获取股票列表,取前 100 只

all_stocks = mc.stock_list()
stocks = all_stocks[:SAMPLE_SIZE]
code_to_name = {}
codes = []
for s in stocks:
raw_code = s["dm"].split(".")[0] # "000001.SZ" → "000001"
codes.append(raw_code)
code_to_name[raw_code] = s["mc"]

2. 第一轮快照

snap1 = fetch_batch(mc, codes)
print(f"[第一轮] 拉取 {len(snap1)} 只")

3. 等待

print(f"等待 {INTERVAL} 秒...")
time.sleep(INTERVAL)

4. 第二轮快照

snap2 = fetch_batch(mc, codes)
print(f"[第二轮] 拉取 {len(snap2)} 只")

5. 计算涨速并排序

results = []
for code in codes:
d1 = snap1.get(code)
d2 = snap2.get(code)
if not d1 or not d2:
continue
p1 = float(d1.get("p", 0))
p2 = float(d2.get("p", 0))
if p1 <= 0:
continue
speed = (p2 - p1) / p1 * 100
results.append({
"code": code,
"name": code_to_name.get(code, ""),
"p1": p1,
"p2": p2,
"speed": speed,
"zf": float(d2.get("zf", 0)),
"cje": float(d2.get("cje", 0)),
})

results.sort(key=lambda x: x["speed"], reverse=True)

6. 输出 Top 30

print(f"\n涨速排行榜 Top {TOP_N}({INTERVAL}秒窗口)")
print(f"{'排名':>4} {'代码':<8} {'名称':<8} {'第一轮':>8} {'第二轮':>8} "
f"{'涨速%':>8} {'涨跌幅%':>8} {'成交额(万)':>12}")
for i, r in enumerate(results[:TOP_N]):
cje_wan = r["cje"] / 10000
print(f"{i+1:>4} {r['code']:<8} {r['name']:<8} {r['p1']:>8.2f} "
f"{r['p2']:>8.2f} {r['speed']:>+8.3f} {r['zf']:>+8.2f} "
f"{cje_wan:>12.0f}")

api_calls = (len(codes) // BATCH_SIZE + 1) * 2
print(f"\nAPI 调用 {api_calls} 次 | 日额度消耗 {api_calls}/500 "
f"({api_calls/500*100:.1f}%)")

if name == "main":
main()


实测结果(2026-08-05 09:55,真实运行)

======================================================================
涨速排行榜 Top 30(30秒窗口)
======================================================================
排名 代码 名称 第一轮 第二轮 涨速% 涨跌幅% 成交额(万)
----------------------------------------------------------------------
1 000032 深桑达A 14.39 14.48 +0.625 +3.45 23227
2 000488 ST晨鸣 1.94 1.95 +0.515 +1.52 441
3 000016 *ST康佳A 2.60 2.61 +0.385 +1.55 1112
4 000510 新金路 15.88 15.92 +0.252 +8.81 60374
5 000036 华联控股 4.08 4.09 +0.245 +1.46 2603
6 000026 飞亚达 16.51 16.55 +0.242 +3.24 5110
7 000021 深科技 38.08 38.17 +0.236 +5.75 171819
8 000426 兴业银锡 34.53 34.61 +0.232 +5.53 94069
9 000034 神州数码 25.93 25.99 +0.231 +6.67 48198
10 000029 深深房A 21.86 21.91 +0.229 +2.23 2336
...

统计:样本 100 只 | API 调用 10 次 | 免费版日额度消耗 10/500 (2.0%)
涨速 > 0:27 只 | 涨速 = 0:43 只 | 涨速 < 0:30 只

几个关键点:

  1. Top1 深桑达A:30 秒内从 14.39 涨到 14.48,涨速 +0.625%。同一时刻全天涨跌幅才 +3.45%——说明这只票此刻正在拉升
  2. Top4 新金路:涨速 +0.252% 但全天涨跌幅 +8.81%——已经涨了很多,此刻还在加速
  3. 43 只涨速为 0:30 秒窗口内价格没变,正常现象(非交易活跃时段或停牌)
  4. 10 次 API 调用搞定 100 只:批量接口的威力

API 内置涨速 vs 自己算的涨速

stock_ssjy(单股实时接口)里有一个 zs 字段,就是 API 内置的涨速。我们把它和自己算的做个对比:

代码 名称 计算涨速% API涨速(zs) 涨跌幅%
000032 深桑达A +0.625 -0.07 +3.45
000488 ST晨鸣 +0.515 0.52 +1.52
000510 新金路 +0.252 0.44 +8.81
000026 飞亚达 +0.242 0.30 +3.24
000021 深科技 +0.236 0.32 +5.75

两者数值不一样,因为计算口径不同:

  • API 的 zs:服务端用一个固定窗口(通常 5 分钟)算的涨速
  • 我们的:自定义窗口(30 秒),更短更灵敏

各自适用场景:

方式 优势 劣势 适用
API zs 字段 不用自己算,拿过来就是 窗口固定不可调,需逐只调 stock_ssjy(1 次/只) 少量股票(≤20 只)快速看
两轮快照法 窗口自定义、批量省额度 需等一个窗口周期 大量股票排行榜

100 只股票做排行榜,两轮快照法只用 10 次额度;用 API zs 字段要 100 次。这就是批量接口 + 自己算的价值。


窗口大小怎么选

窗口 特点 适用场景
30 秒 极灵敏,抓瞬间异动 高频监控、秒级策略
60 秒 平衡灵敏与噪音 日常盯盘推荐
180 秒 过滤毛刺,看趋势 中低频、趋势确认

窗口太短(<30 秒):价格没怎么动,大量涨速为 0,排行没意义。

窗口太长(>5 分钟):变成了"5 分钟涨跌幅",不是"涨速"了。


常见坑

  1. 09:30 前调用返回空数组:盘中才有实时数据,盘前跑会得到空结果
  2. 停牌股票价格为 0:代码里必须判 p1 <= 0 跳过,否则除零报错
  3. 批量接口上限 20 只/次:超过 20 只要分批,用 range(0, len, 20) 循环
  4. 两轮快照的代码顺序要一致:用同一份 codes 列表,不能中间改顺序
  5. stock_ssjy_more 返回的 dm 不带后缀:是 "000001" 不是 "000001.SZ",与 stock_list 的格式不同,拼接时注意

小结

涨速排行榜是盘中找"正在拉升"的票的最直接工具。两轮快照法 + 批量接口,100 只股票只用 10 次额度就能排出 Top 30。窗口大小自定义、过滤条件自己加——这是行情软件的固定涨速榜做不到的。

加上前几篇的涨跌幅告警(#02)、涨停池(#03)、炸板预警(#04)、盘口分析(#05)、批量接口省额度(#06),你的盘中盯盘工具链已经相当完整了。

下一篇我们做个股资金流向异动盯盘——成交额突然放大、换手率跳升,这类异动往往是主力进场的信号。用窗口比较法一屏抓出来。


本文所用行情数据来自行情数据 API(mairuiapi.com)。文中代码均已本地验证并可复现。证书免费领取地址: https://www.mairuiapi.com

⚠️ 免责声明:本文为技术分享,所有计算仅展示 Python 编程方法与 API 使用技巧,不构成任何投资建议。股市有风险,投资需谨慎。

关注「Python实时盯盘与预警」合集(共 16 篇),从自选股报价到全市场监控、从免费版到企业证书方案——一站式盘中盯盘不求人。

posted @ 2026-08-09 07:07  量化分析码农  阅读(17)  评论(0)    收藏  举报