【Python实时盯盘与预警 #08】成交额突然放大2倍?Python窗口比较抓异动

【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% 阈值。这很正常:异动不是每分钟都有的,如果阈值设得太低,会满屏告警反而看不过来。

几个关键数据

  1. 科大讯飞:60 秒内成交额增 3115 万,换手率从 0.87% → 0.90%,量比 2.58(活跃)
  2. 中兴通讯:量比 3.52(最高),成交额增速 +2.19%,换手率 1.28%(全榜最高)
  3. 宁德时代:成交额绝对增量最大(+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 说明明显放量。但量比是全天累计的,不能替代窗口比较------两者配合用最好。


常见坑

  1. 批量接口没有 hs 字段 :必须用 stock_ssjy(单股)才能拿到换手率。如果只看成交额增量,批量接口够了;要看换手率必须逐只调
  2. 成交额只增不减 :盘中成交额是累计值,只会越来越大。所以 cje_delta 永远是正数(除非停牌或收盘清算),关注的是增速而非增量本身
  3. 换手率也是累计值hs 是当日累计换手率,不是窗口内的换手率。窗口内的换手率变化 = hs2 - hs1,这个差值才是窗口内的新增换手
  4. 09:30 前成交额为 0 :盘前调用 cje=0,算增速会除零。代码里必须判 cje1 > 0
  5. 停牌股票返回旧数据 :停牌的票 cje 不会变化,增速为 0%,不会误报,但也拉不到新数据

小结

成交额突变和换手率跳升是主力进场的最直接信号。窗口比较法(两轮快照算差值)能精确捕捉"最近 N 分钟内"的变化,比单看一个时间点的绝对值有意义得多。

两级过滤策略是实战中的关键优化:批量接口初筛只花 2 次额度就能扫 20 只,筛出 Top 5 再逐只深入取换手率和量比------总额度从 42 次压到 7 次,省 82%。免费版 500 次/日绰绰有余。

下一篇我们做自定义异动雷达------把涨速、成交额、换手率、涨跌幅等多个条件组合起来,任意搭配触发告警。相当于把前几篇的单维度监控升级成一个多条件组合雷达。


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

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

相关推荐
凤山老林1 小时前
Spring Boot 定时任务进阶:动态 Cron 与集群防重实战
java·spring boot·后端·定时任务·集群定时任务
yk 坤帝1 小时前
用Python实现发送《自动周报》实战脚本
开发语言·python
一点一木2 小时前
Seed Evolving 深度测评:我用它造了一个 AI 出题工具
人工智能·python·github
xbgRS2 小时前
spring整合mybaits
java·spring·mybatis
abbgogo3 小时前
OSPF动态路由协议
开发语言·php
en.en..3 小时前
C 语言嵌入式事件驱动状态机完整教程(枚举配套)
c语言·开发语言
阿童木写作3 小时前
跨境卖家效率翻倍,跨马翻译批量图片翻译工具实测
人工智能·python
鹿鹿学长3 小时前
2026国赛报名季:从组委会第一次通知到各校8月报名通知,赛程报名评奖官方口径一次讲清
python·自动化
Tim_103 小时前
【C++】024、new[]与delete[]配对使用
java·开发语言