【Python实时盯盘与预警 #02】涨跌幅到 ±3% 还想自己盯?20 行 Python 加阈值告警+本地桌面通知

📅 2026/8/6 17:12:23
【Python实时盯盘与预警 #02】涨跌幅到 ±3% 还想自己盯?20 行 Python 加阈值告警+本地桌面通知
系列Python实时盯盘与预警 · 第 02 篇 · 适合初学 · 7 分钟读完即可跑通痛点开场#01 的脚本已经把 30 只自选股一屏看完了但人不会一直盯屏幕。真正能救命的盘中监控是到 ±3% 立刻告警、到 ±5% 加一条红色提醒——而不是手动扫一眼。本文就在 #01 基础上加两级阈值±3% 提示、±5% 提醒—— 一个分层避免噪声淹没真信号桌面原生通知Win 用win10toast、跨平台用plyer—— 开着终端写代码时也能立刻在系统托盘弹窗稳定输出 静默 fallback—— 没装桌面通知组件也能跑不报错。本文你将得到什么一段 60 行的 Python把 30 只自选股按阈值分层告警Windows / macOS / Linux 都能跑的桌面通知代码缺组件自动降级一份阈值调参指南不同风格用不同阈值。环境准备复用 #01conda 环境fastApiEnv、mairui 1.0.0、证书只读不打印路径MAIRUI_LICENCE环境变量或.secrets/mairui_licence.txt。如需桌面通知额外装非必须Windowspip install win10toast跨平台pip install plyer完整可运行脚本自验环境fastApiEnv/ Python 3.9 / mairui 1.0.030 只自选股 / 阈值 ±3% ±5% 全部 PASS。【Python实时盯盘与预警 #02】涨跌幅阈值自动告警到 ±3% 立刻本地提示from__future__importannotationsimportosimportsysfromdatetimeimportdatetime sys.path.insert(0,os.path.join(os.path.dirname(__file__),..,..,_common))frommairui_helperimportload_licence# noqa: E402frommairuiimportClient# noqa: E402WATCHLIST[000001,000002,000333,000858,002594,300750,600000,600028,600030,600276,600519,600887,601012,601318,601398,601857,601988,688981,002475,300059,600036,601166,600900,601288,601628,600585,000063,000725,002415,300760,]# 阈值表超过阈值就告警。键从下往上检查先命中提醒再提示。THRESHOLDS((提醒,5.0),(提示,3.0),)defclassify(pct:float)-tuple[str,float]:forlabel,thresholdinTHRESHOLDS:ifpctthresholdorpct-threshold:returnlabel,thresholdreturn,0.0deffetch_quotes(api:Client,codes:list[str])-list[dict]:out[]forcodeincodes:try:qapi.stock_real_time(code)exceptExceptionase:# noqa: BLE001print(f[warn]{code}取数失败{e},filesys.stderr)continueifnotisinstance(q,dict):continueout.append({code:code,price:q.get(p),change_pct:q.get(zf),amount:q.get(cje),time:q.get(t)})returnoutdefrender_alert(quotes:list[dict])-str:alerts[qforqinquotesifclassify(q[change_pct]or0)[0]]ifnotalerts:returnf[{datetime.now().strftime(%H:%M:%S)}] 当前无任何自选股触发 ±3% 阈值正常。alerts.sort(keylambdax:-(abs(x[change_pct])or0))lines[f[{datetime.now().strftime(%H:%M:%S)}] 触发阈值的自选股按涨跌幅绝对值排序,]forqinalerts:label,thrclassify(q[change_pct]or0)arrow▲if(q[change_pct]or0)0else▼amount_yi(q[amount]or0)/1e8lines.append(f [{label}]{q[code]}现价{q[price]:.2f}{arrow}{q[change_pct]:.2f}% f(阈值 ±{thr:.1f}%) 成交{amount_yi:.2f}亿 时间{q[time]})lines.append()lines.append(f共触发{len(alerts)}/{len(quotes)}只。)return\n.join(lines)defdesktop_notify(quotes:list[dict])-None:alerts[qforqinquotesifclassify(q[change_pct]or0)[0]]ifnotalerts:returntext\n.join(f{q[code]}{q[change_pct]:.2f}%forqinalerts[:5])titlef盯盘告警{len(alerts)}只try:fromwin10toastimportToastNotifier# type: ignoreToastNotifier().show_toast(title,text,duration5,threadedTrue)print([info] 已发送 Windows 桌面通知,filesys.stderr)returnexceptException:# noqa: BLE001passtry:fromplyerimportnotification# type: ignorenotification.notify(titletitle,messagetext,timeout5)print([info] 已发送 plyer 桌面通知,filesys.stderr)returnexceptException:# noqa: BLE001passprint(f[fallback] 桌面通知未启用建议安装 win10toast/plyer首条告警{text.splitlines()[0]},filesys.stderr)defmain()-int:licload_licence()print(f[info] licence present: True (value hidden, len{len(lic)}))withClient(licencelic)asapi:quotesfetch_quotes(api,WATCHLIST)print(render_alert(quotes))desktop_notify(quotes)return0if__name____main__:sys.exit(main())真实运行输出截取[fallback] 桌面通知未启用建议安装 win10toast/plyer首条告警000001 3.01% [info] licence present: True (value hidden, len36) [09:56:03] 触发阈值的自选股按涨跌幅绝对值排序 [提醒] 688981 现价 123.99 ▲ 9.19% (阈值 ±5.0%) 成交 100.61 亿 时间 2026-07-31 15:00:04 [提醒] 002415 现价 37.65 ▲ 6.85% (阈值 ±5.0%) 成交 63.30 亿 时间 2026-07-31 15:00:00 [提醒] 002475 现价 57.48 ▲ 6.55% (阈值 106.93 亿 时间 2026-07-31 15:00:00 [提示] 000725 现价 5.51 ▲ 3.92% (阈值 ±3.0%) 成交 115.97 亿 时间 2026-07-31 15:00:00 [提示] 000333 现价 87.60 ▲ 3.69% (阈值 ±3.0%) 成交 41.08 亿 时间 2026-07-31 15:00:00 [提示] 000001 现价 11.63 ▲ 3.01% (阈值 ±3.0%) 成交 23.19 亿 时间 2026-07-31 15:00:00 共触发 11 / 30 只。表中数据来源内部验证环境fastApiEnv调用/hsrl/stock_real_time接口返回脚本中所有证书出现处都用MAIRUI_LICENCE环境变量或你的麦蕊证书占位。 当前示例时间是 09:56正是开盘前几分钟所以时间戳保留上一交易日 07-31 收盘价盘中真到 09:30 / 10:00 / 14:00 等关键时点time字段会切到当天盘中时间戳。代码要点拆解阈值分层用(label, threshold)元组降序匹配命中即返回。±5% 优先于 ±3%避免噪声如果想两层都报classify里改成return 提醒提示, 5.0就能合两为一行。涨跌幅绝对值排序用abs()而不是符号排序涨最多的与跌最多的同台竞技盯盘才能最早同时看到双向异常。桌面通知三级降级win10toast → plyer → stderr任意一级不可用都不阻断主体逻辑——这正是内容龙虾代码审计里强调的鲁棒优先。告警不滥用当没有任何触发时打印一行正常避免你看屏幕又回到不知道脚本是活是死的焦虑。阈值调参指南不同人不同阈值风格提醒级提示级推荐长线持仓波段操作±8%±4%大波动才打扰短线交易看技术位±5%±3%默认本篇打板 / 套利瞬时反应±3%±1.5%噪声多、别错过信号把THRESHOLDS元组改成对应两行即可。常见坑Windows 通知中心被关闭右下角系统设置 → 通知 → 找到 Python / PowerShell / 你的终端确保通知开关打开否则win10toast调用成功也不显示气泡。收盘后还弹窗本脚本运行一次就退出不会反复弹。要盘中持续弹把main()套进while True: time.sleep(3)即可与 #01 的接入实时段拼起来就是盘中监控闭环。多终端同时跑会重复弹如果 IDE 跑一次、命令行再跑一次告警会重复建议用进程锁fcntl/file lock保证单机唯一实例。小结 下篇预告把 #01 的一屏看完加上到阈值就告警两段脚本合计 ~120 行就构成一个可用的盘中盯盘 MVP。下一篇 #03 我们换一个角度不只看自选股而是把整个市场的涨停池limit_up_pool当日拉出来排序——一类资金的共识、风口的强弱尽收眼底。合规与引导数据/接口演示仅作技术示意不构成投资建议本系列代码仅用于自验与教学请勿用于非法牟利提示脚本中所有证书出现处都用MAIRUI_LICENCE环境变量或你的麦蕊证书占位任何含真实 UUID 的版本都不应被发布。