自选股异动提醒:大涨大跌/放量第一时间知道
系列·本地复盘篇 04 — 把盯盘的活交给规则引擎,触发才找你,路径三在此收官
📖 本篇是《本地 AI 复盘系统》第 4 篇,前置:收盘后自动生成 AI 复盘笔记(复用它的推送通道与环境)。
01 · 先想清楚:提醒是为了少看盘
告警系统的最大敌人是告警疲劳:规则太松,一天震 50 条,第三天你就开始无视它。 所以设计原则只有一条——宁可漏,不可滥。起步只开两三条最痛的规则,跑一周再加。
02 · 拿实时行情:轮询快照
import akshare as ak
import time
from datetime import datetime
def market_open() -> bool:
now = datetime.now()
t = now.hour * 100 + now.minute
return now.weekday() < 5 and (925 <= t <= 1130 or 1300 <= t <= 1505)
while market_open():
try:
spot = ak.stock_zh_a_spot_em() # 全市场快照,一次拉回
rows = spot[spot["代码"].isin(WATCHLIST)]
check_rules(rows) # 第 03 节
except Exception as e:
log(f"fetch fail: {e}") # 失败写日志,继续下一轮
time.sleep(60) # 一分钟一轮,对自选监控足够快照字段是中文列名(代码/名称/最新价/涨跌幅/成交量),照旧先 rename 再用。 一分钟一次 × 每次一个请求,远低于数据源的容忍线;别手痒改成秒级,那是被封 IP 的最快方式。
03 · 规则引擎:配置化 + 节流
规则写在配置里而不是代码里,改阈值不动代码:
# rules.yaml
- name: 大涨
cond: "pct >= 5"
- name: 大跌
cond: "pct <= -5"
- name: 放量上涨
cond: "pct >= 3 and vol_ratio >= 2" # 量比 = 实时成交量/近5日均量(按开市时长折算)节流是防疲劳的关键:同一只票 + 同一条规则,一天只推第一次。用一个内存字典记录当天已推的(code, rule) 组合即可(脚本重启会丢,丢了最多多推一条,可接受)。
推送复用复盘笔记篇的通道(Server酱/邮件),消息就三行:代码名称、触发规则、当前价与涨幅。
04 · 部署形态:想清楚电脑的角色
- 本地常开(本篇默认) — 交易时段电脑开着即可;任务计划程序设 9:25 启动脚本、15:10 结束。 适合开盘期间本来就在电脑前的人。
- 部署到云服务器 — 7×24 不间断,把脚本挪上去 + nohup/systemd 托管即可,机器的开通见云服务器篇。
- 只在关键时点跑 — 不想全天轮询,就只开盘/收盘/14:30 各跑一次快照,规则同款, 提醒价值打七折但几乎零成本。
05 · 验收清单
- ☐ 找一只正接近阈值的自选股,把阈值临时调宽,验证能推到手机。
- ☐ 同票同规则第二次触发不再推(节流生效)。
- ☐ 拔网线跑一轮:脚本报错但活着,恢复后继续工作。
06 · 避坑清单
- 快照的"涨跌幅"已是百分数 — 直接和 5 比,别再除以 100。
- 停牌股的坑 — 成交量为 0、价格停在昨收,可能触发"大跌 0%"之类的废警;规则里排除
volume == 0。 - 9:25 前的数据是集合竞价 — 涨跌幅跳动大,开盘后再开规则更干净。
- 提醒 ≠ 决策 — 收到推送后做什么,应该来自你的复盘和计划,而不是临时起意; 异动提醒帮你看见,不替你决定。