【Python实时盯盘与预警 #08】成交额突然放大 2 倍?Python 窗口比较抓异动
盘中你最怕错过什么?不是涨停------涨停了大家都知道。最怕的是一只票悄无声息地放量,成交额从 5000 万突然跳到 1.5 亿,换手率从 0.3% 飙到 1.2%------等你看到的时候已经涨了 6%。
这种"成交额突变"往往是主力进场的信号。但行情软件不会弹窗告诉你"这只票成交额刚刚放大了 200%"------你得自己算。
这篇教你用 Python 做窗口比较:两个时间点各拉一轮数据,算成交额增量和换手率变化,超过阈值就报警。还会教你两级过滤策略------批量接口初筛 + 单股接口深入,把额度从 42 次压到 7 次。
本文你将得到什么
- 一个异动监控脚本:20 只自选股,60 秒窗口比较成交额和换手率
- 两级过滤策略:批量接口初筛(省额度)→ 异动股逐只深入(取换手率/量比)
- 成交额增速、换手率增量的计算公式与阈值设定建议
- 批量接口与单股接口的字段差异在实战中的处理方法
为什么要做窗口比较
单看一个时间点的数据,你不知道"此刻"跟"刚才"比变了多少。比如:
- 现在成交额 3.7 亿------大不大? 不知道。如果 5 分钟前是 3.6 亿,那就是正常推进;如果 5 分钟前是 1.8 亿,那就是突然翻倍了。
- 现在换手率 0.9%------高不高? 不知道。如果 5 分钟前是 0.3%,那就是3 倍跳升。
窗口比较 = 拉两轮数据,算差值。 差值才是异动信号。
两个接口,两种用法
系列 #06 讲过批量接口 stock_ssjy_more 省额度。但批量接口有一个关键短板:没有换手率(hs)和量比(lb)字段。
| 字段 | 批量 stock_ssjy_more |
单股 stock_ssjy |
|---|---|---|
现价 p / 涨跌幅 zf / 成交额 cje |
✅ | ✅ |
换手率 hs |
❌ | ✅ |
量比 lb |
❌ | ✅ |
总市值 sz / 流通市值 lt |
❌ | ✅ |
| 额度消耗 | 1 次 / 20 只 | 1 次 / 只 |
策略 :批量接口做初筛(只看成交额增量),对有异动的股票再用单股接口取 hs/lb 深入分析。这就是"两级过滤"。
代码:异动监控(全量版)
先看完整版------20 只自选,两轮快照,批量 + 逐只全拉:
python
import sys
import os
import time
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "_common"))
from mairui_helper import load_licence
from mairui import Client
WATCHLIST = [
"000001", "000002", "000063", "000333", "000651",
"000858", "002142", "002230", "002415", "002594",
"300059", "300750", "600036", "600276", "600519",
"600585", "600900", "601012", "601318", "601398",
]
INTERVAL = 60 # 两轮快照间隔(秒)
CJE_ALERT_RATIO = 5.0 # 成交额增速超过 5% 标记异动
HS_ALERT_DELTA = 0.1 # 换手率增量超过 0.1% 标记异动
def main():
lic = load_licence()
mc = Client(lic)
# 第一轮:批量 + 逐只
batch1 = mc.stock_ssjy_more(",".join(WATCHLIST))
detail1 = {code: mc.stock_ssjy(code) for code in WATCHLIST}
time.sleep(INTERVAL)
# 第二轮:批量 + 逐只
batch2 = mc.stock_ssjy_more(",".join(WATCHLIST))
detail2 = {code: mc.stock_ssjy(code) for code in WATCHLIST}
# 计算异动
results = []
for code in WATCHLIST:
d1 = detail1[code]
d2 = detail2[code]
cje1 = float(d1["cje"])
cje2 = float(d2["cje"])
hs1 = float(d1["hs"])
hs2 = float(d2["hs"])
cje_delta = cje2 - cje1
cje_ratio = (cje_delta / cje1 * 100) if cje1 > 0 else 0
hs_delta = hs2 - hs1
is_alert = cje_ratio > CJE_ALERT_RATIO or hs_delta > HS_ALERT_DELTA
results.append({
"code": code,
"p": float(d2["p"]),
"zf": float(d2["zf"]),
"cje_delta": cje_delta,
"cje_ratio": cje_ratio,
"hs1": hs1, "hs2": hs2, "hs_delta": hs_delta,
"lb": float(d2.get("lb", 0)),
"alert": is_alert,
})
results.sort(key=lambda x: x["cje_ratio"], reverse=True)
for r in results:
flag = "⚡异动" if r["alert"] else ""
print(f"{r['code']} | 成交额增量 {r['cje_delta']/10000:+.0f}万 "
f"({r['cje_ratio']:+.2f}%) | 换手率 {r['hs1']:.2f}→{r['hs2']:.2f} "
f"({r['hs_delta']:+.2f}%) | 量比 {r['lb']:.2f} | {flag}")
api_calls = (1 + len(WATCHLIST)) * 2
print(f"\nAPI 调用 {api_calls} 次 | 日额度 {api_calls}/500")
if __name__ == "__main__":
main()
实测结果(2026-08-05 09:57,真实运行)
===========================================================================
资金流向异动监控(60秒窗口)
===========================================================================
代码 名称 现价 涨跌幅% 成交额T1(万) 成交额T2(万) 增量(万) 增速% 换手T1 换手T2 换手增 量比 异动
002230 科大讯飞 44.28 +2.83 83769 86884 +3115 +3.72 0.87 0.90 +0.03 2.58
300059 东方财富 20.18 +1.00 118436 122249 +3813 +3.22 0.44 0.46 +0.02 1.73
600585 海螺水泥 17.54 +1.63 20943 21462 +519 +2.48 0.30 0.31 +0.01 2.45
000063 中兴通讯 34.81 +2.94 178696 182602 +3906 +2.19 1.28 1.31 +0.03 3.52
000001 平安银行 11.30 +1.84 41699 42534 +835 +2.00 0.19 0.19 +0.00 1.69
300750 宁德时代 401.15 +1.45 364559 371413 +6855 +1.88 0.21 0.22 +0.01 2.07
...
异动汇总:0/20 只触发告警
无异动触发(窗口内成交额增速和换手率增量均在阈值内)
API 调用 42 次 | 日额度 42/500 (8.4%)
这次没有触发告警------60 秒窗口内成交额增速最高 +3.72%(科大讯飞),没到 5% 阈值。这很正常:异动不是每分钟都有的,如果阈值设得太低,会满屏告警反而看不过来。
几个关键数据:
- 科大讯飞:60 秒内成交额增 3115 万,换手率从 0.87% → 0.90%,量比 2.58(活跃)
- 中兴通讯:量比 3.52(最高),成交额增速 +2.19%,换手率 1.28%(全榜最高)
- 宁德时代:成交额绝对增量最大(+6855 万),但增速只有 +1.88%(基数太大)
成交额增量 vs 增速:绝对增量看"谁的钱进来了",增速看"谁在加速"。两者要配合看------宁德的增量最大但增速不高,说明是正常推进;如果某只票增速 20% 且量比 >3,那就是异动了。
两级过滤:省 82% 额度
全量版 42 次调用(2 批次 + 40 逐只),但大多数股票不会有异动。优化策略:
第一步:批量接口初筛(2 次额度)
→ 用 stock_ssjy_more 拉 20 只,只看 cje 增速
→ 筛出 Top 5 增速最大的
第二步:只对 Top 5 逐只调 stock_ssjy(5 次额度)
→ 取 hs(换手率)、lb(量比)深入分析
→ 判断是否真异动
总计:2 + 5 = 7 次 → 比全量 42 次省 82%
实测初筛 Top 5(只用批量接口):
代码 名称 成交额T1(万) 成交额T2(万) 增量(万) 增速%
600585 海螺水泥 20970 21951 +981 +4.68
300059 东方财富 119316 123879 +4563 +3.82
000001 平安银行 41709 43107 +1398 +3.35
002230 科大讯飞 85731 88404 +2673 +3.12
300750 宁德时代 367920 378703 +10783 +2.93
注意:批量初筛的数值与全量版略有差异------因为批量拉取和逐只拉取之间有几秒的时间差,成交额在持续变化。这很正常,初筛只需要找到"哪些票增速高",不需要精确到个位。
优化版代码片段:
python
def smart_monitor(mc, watchlist, interval=60, top_n=5):
"""两级过滤:批量初筛 + 异动深入。"""
# 第一步:批量初筛
batch1 = mc.stock_ssjy_more(",".join(watchlist))
time.sleep(interval)
batch2 = mc.stock_ssjy_more(",".join(watchlist))
# 算增速,取 Top N
screened = []
for code in watchlist:
cje1 = float(batch1.get(code, {}).get("cje", 0))
cje2 = float(batch2.get(code, {}).get("cje", 0))
ratio = (cje2 - cje1) / cje1 * 100 if cje1 > 0 else 0
screened.append((code, ratio))
screened.sort(key=lambda x: x[1], reverse=True)
# 第二步:只对 Top N 逐只深入
for code, ratio in screened[:top_n]:
detail = mc.stock_ssjy(code)
hs = float(detail["hs"])
lb = float(detail["lb"])
print(f"{code} | 增速 {ratio:+.2f}% | 换手 {hs:.2f}% | 量比 {lb:.2f}")
# 总额度:2(批量)+ top_n(逐只)= 2 + 5 = 7 次
阈值怎么设
| 指标 | 保守 | 推荐 | 激进 |
|---|---|---|---|
| 成交额增速 | >10% | >5% | >3% |
| 换手率增量 | >0.2% | >0.1% | >0.05% |
| 量比(辅助) | >2.0 | >1.5 | >1.0 |
- 保守:只报大异动,一天可能就几次告警,适合中低频盯盘
- 推荐:平衡灵敏度与噪音,适合日常盘中监控
- 激进:信号多但假阳性也多,适合高频交易或配合其他指标过滤
量比 lb 是一个很好的辅助指标:量比 >1 说明当前成交比过去 5 日同时段活跃,量比 >2 说明明显放量。但量比是全天累计的,不能替代窗口比较------两者配合用最好。
常见坑
- 批量接口没有
hs字段 :必须用stock_ssjy(单股)才能拿到换手率。如果只看成交额增量,批量接口够了;要看换手率必须逐只调 - 成交额只增不减 :盘中成交额是累计值,只会越来越大。所以
cje_delta永远是正数(除非停牌或收盘清算),关注的是增速而非增量本身 - 换手率也是累计值 :
hs是当日累计换手率,不是窗口内的换手率。窗口内的换手率变化 =hs2 - hs1,这个差值才是窗口内的新增换手 - 09:30 前成交额为 0 :盘前调用
cje=0,算增速会除零。代码里必须判cje1 > 0 - 停牌股票返回旧数据 :停牌的票
cje不会变化,增速为 0%,不会误报,但也拉不到新数据
小结
成交额突变和换手率跳升是主力进场的最直接信号。窗口比较法(两轮快照算差值)能精确捕捉"最近 N 分钟内"的变化,比单看一个时间点的绝对值有意义得多。
两级过滤策略是实战中的关键优化:批量接口初筛只花 2 次额度就能扫 20 只,筛出 Top 5 再逐只深入取换手率和量比------总额度从 42 次压到 7 次,省 82%。免费版 500 次/日绰绰有余。
下一篇我们做自定义异动雷达------把涨速、成交额、换手率、涨跌幅等多个条件组合起来,任意搭配触发告警。相当于把前几篇的单维度监控升级成一个多条件组合雷达。
⚠️ 免责声明:本文为技术分享,所有计算仅展示 Python 编程方法与 API 使用技巧,不构成任何投资建议。股市有风险,投资需谨慎。
📌 关注「Python实时盯盘与预警」合集(共 16 篇),从自选股报价到全市场监控、从免费版到企业证书方案------一站式盘中盯盘不求人。