
系列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 的版本都不應被發布。