【Python量化实战 #19】盘中盯盘脚本:实时行情监控与涨跌提醒实现
本文是「Python量化实战」系列第 19 篇工程化模块。前面我们把数据批量拉下来、存进 SQLite、画成 K 线——但这些都是盘后复盘。真正想盘中抓住机会需要让脚本盯着行情跑自选股涨到/跌到阈值就自动提醒。本文用60 行核心代码搭一个可运行的盘中盯盘器实时轮询 涨跌幅阈值 本地告警日志生产环境还能直接接到钉钉/企微 webhook。本文你将得到什么一个完整可运行的盘中盯盘脚本轮询、阈值、告警用stock_real_time拉取实时行情的真实代码与返回字段解读告警通道的最小可复现版本本地 JSONL 日志 webhook 结构实盘部署的 4 个注意点频率、异常、日志、去重下篇预告#20 把稳定获取这件事讲透——重试、缓存、防封 IP一、在线体验想先在线试试接口效果打开 API Playground 即可直接调用测试https://mairuiapi.com/playground本文用到stock_real_time单票实时行情接口返回最新价、涨跌幅、成交量等字段盘中监控主要靠它。二、环境准备本文代码使用 mairui SDK 获取股票数据安装方法如下pipinstallmairuiSDK 的完整接口文档与使用说明请查阅 GitHub 仓库https://github.com/MaiRuiApi/mairui接口的详细参数说明请查阅官网 API 文档https://mairuiapi.com/hsdata运行环境Python 3.9mairui SDK 1.0.0pandas 2.2可选本文未强制使用importosimportmairui# 证书从环境变量读取官网注册后获取不要写死在代码里apimairui.Client(os.environ[MAIRUI_LICENCE])本文数据截至 2026-07-31 盘中读者复现时行情会不同但代码逻辑不变。三、为什么需要盘中盯盘脚本手动刷行情有三大问题痛点后果盯盘耗时策略信号来了你还在刷其他页面情绪干扰涨跌一刺激就临时改计划反应慢涨停/跌停发生在几秒之内人工来不及Python 盯盘脚本的价值是把规则前置提前设好阈值让程序 7×24 秒级监控触发才通知你。你只在有情况时看一眼而不是一直盯着屏幕。四、实时行情接口stock_real_time先单独跑一次接口看返回什么importos,mairui apimairui.Client(os.environ[MAIRUI_LICENCE])snapapi.stock_real_time(600519)print(snap)真实输出2026-07-31 盘中{ pe: 15.25, ud: -33.59, pc: -2.4667, zf: 0.7512, tr: 0.17, pb_ratio: 7.04, p: 1328.17, o: 1330.03, h: 1336, l: 1325.77, yc: 1361.76, cje: 2875668300, v: 21622, pv: 2162161, tv: 5, t: 2026-07-31 09:55:26 }关键字段p最新价pc涨跌幅%ud涨跌额o/h/l开盘价/最高价/最低价v/cje成交量/成交额t数据时间戳监控逻辑只需要两件事定时轮询比较pc与阈值。五、核心代码自选股池 阈值告警importos,sys,time,json,loggingfromdatetimeimportdatetimefrompathlibimportPathimportmairui# 自选股池每只股票可设不同阈值WATCHLIST[{code:600519,name:贵州茅台,alarm_pct:2.0},{code:000001,name:平安银行,alarm_pct:1.5},{code:000333,name:美的集团,alarm_pct:1.5},{code:002594,name:比亚迪,alarm_pct:2.5},]POLL_INTERVAL5# 轮询间隔秒实盘建议 15~60 秒logging.basicConfig(levellogging.INFO,format%(asctime)s [%(levelname)s] %(message)s,)ALERT_LOGPath(alerts.jsonl)defsend_alert(stock,snapshot):把告警写入本地 JSONL生产环境可改为钉钉/企微 webhook。msg{time:datetime.now().isoformat(),code:stock[code],name:stock[name],price:round(snapshot.get(p),2),pct:snapshot.get(pc),text:f{stock[name]}({stock[code]}) 异动现价 ...涨跌幅{snapshot.get(pc):.2f}%,}withALERT_LOG.open(a,encodingutf-8)asf:f.write(json.dumps(msg,ensure_asciiFalse)\n)logging.warning(msg[text])defmain():apimairui.Client(os.environ[MAIRUI_LICENCE])whileTrue:forstockinWATCHLIST:snapapi.stock_real_time(stock[code])pctsnap.get(pc,0.0)logging.info(f{stock[name]}价{snap.get(p)}涨跌幅{pct:.2f}%)ifabs(pct)stock[alarm_pct]:send_alert(stock,snap)time.sleep(POLL_INTERVAL)if__name____main__:main()关键解释WATCHLIST是配置区股票代码、名称、阈值一目了然方便增减。abs(pct) alarm_pct同时监控大涨和大跌。send_alert()目前写本地alerts.jsonl避免演示依赖外部 webhook接入钉钉/企微只需把msgpost 到对应的 webhook URL。六、完整可运行示例把上面拼成一个端到端脚本并限制演示跑 4 轮后退出# -*- coding: utf-8 -*-盘中盯盘脚本自选股实时行情监控 涨跌幅阈值提醒。importosimportsysimporttimeimportjsonimportloggingfromdatetimeimportdatetimefrompathlibimportPath sys.path.insert(0,str(Path(__file__).resolve().parents[3]/_common))importmairuifrommairui_helperimportload_licence WATCHLIST[{code:600519,name:贵州茅台,alarm_pct:2.0},{code:000001,name:平安银行,alarm_pct:1.5},{code:000333,name:美的集团,alarm_pct:1.5},{code:002594,name:比亚迪,alarm_pct:2.5},]POLL_INTERVAL5MAX_ROUNDS4logging.basicConfig(levellogging.INFO,format%(asctime)s [%(levelname)s] %(message)s,)ALERT_LOGPath(alerts.jsonl)defsend_alert(stock,snapshot):msg{time:datetime.now().isoformat(),code:stock[code],name:stock[name],price:round(snapshot.get(p),2),pct:snapshot.get(pc),threshold:stock[alarm_pct],text:(f{stock[name]}({stock[code]}) 异动现价{snapshot.get(p)}f涨跌幅{snapshot.get(pc):.2f}%超过阈值 ±{stock[alarm_pct]}%),}withALERT_LOG.open(a,encodingutf-8)asf:f.write(json.dumps(msg,ensure_asciiFalse)\n)logging.warning(msg[text])defmain():apimairui.Client(load_licence())logging.info(f盯盘启动监控{len(WATCHLIST)}只股票)for_inrange(MAX_ROUNDS):forstockinWATCHLIST:snapapi.stock_real_time(stock[code])pctsnap.get(pc,0.0)logging.info(f{stock[name]}({stock[code]}) 价{round(snap.get(p),2)}涨跌幅{pct:.2f}%)ifabs(pct)stock[alarm_pct]:send_alert(stock,snap)time.sleep(POLL_INTERVAL)if__name____main__:main()真实运行输出2026-07-31 09:57 验证节选2026-07-31 09:57:18,600 [INFO] 盯盘启动监控 4 只股票 2026-07-31 09:57:18,678 [INFO] 贵州茅台(600519) 价1326.93 涨跌幅-2.56% 2026-07-31 09:57:18,680 [WARNING] 贵州茅台(600519) 异动现价 1326.93涨跌幅 -2.56%超过阈值 ±2.0% 2026-07-31 09:57:18,701 [INFO] 平安银行(000001) 价11.32 涨跌幅-2.50% 2026-07-31 09:57:18,701 [WARNING] 平安银行(000001) 异动现价 11.32涨跌幅 -2.50%超过阈值 ±1.5% 2026-07-31 09:57:18,723 [INFO] 美的集团(000333) 价85.58 涨跌幅-3.79% 2026-07-31 09:57:18,723 [WARNING] 美的集团(000333) 异动现价 85.58涨跌幅 -3.79%超过阈值 ±1.5% 2026-07-31 09:57:18,744 [INFO] 比亚迪(002594) 价94.47 涨跌幅-1.43%本次演示中茅台、平安银行、美的集团均触发阈值告警比亚迪未触发。告警记录写入alerts.jsonl{time:2026-07-31T09:57:18.679462,code:600519,name:贵州茅台,price:1326.93,pct:-2.5577,threshold:2.0,text:贵州茅台(600519) 异动现价 1326.93涨跌幅 -2.56%超过阈值 ±2.0%}七、避坑与进阶坑 1轮询太频繁触发限流。实盘建议间隔 ≥15 秒短周期量化可走专业行情通道或 1 分钟 K 线接口不要无节制轮询实时接口。坑 2盘中异常断线没处理。api.stock_real_time()可能因网络抖动抛异常实盘应包try/except并记录失败避免脚本崩溃。坑 3同一告警反复轰炸。当前逻辑每轮都会重新告警生产环境应维护已告警状态同一股票 5 分钟内只发一次。坑 4把脚本跑在本地笔记本上。本地电脑休眠/断网会导致漏监控更稳的姿势是丢到服务器用systemd/supervisor常驻。进阶方向接入钉钉/企微 webhook把send_alert()里的写文件改成requests.post(webhook_url, jsonmsg)。加入成交量异动、涨速最近 N 秒价格变化等多维度告警。结合 #16 的并发能力把自选股池扩展到几十只同时监控。八、总结与延伸本文把盘后看升级到了盘中盯用stock_real_time获取实时行情用自选股池 阈值实现规则化监控用 JSONL webhook 结构演示告警通道工程化模块还剩最后一篇#20 专门讲如何稳定、合规地获取股票数据从爬虫被封 IP 的痛点切入给出重试、缓存、异常处理、API 方案等完整稳定性实践。本文为技术演示所有数据来自公开股票接口文中监控方案不构成投资建议。