第 6 课 · 盘中异动监控 Agent

规则引擎先行,LLM 快报殿后,人工确认收尾——半自动闭环的第一步

预计用时:35 分钟 上一课:第 5 课(待发布)

这节课你将得到什么

一个能跑的"盘中异动监控 Agent"雏形:盯着你手里的自选股(600519 贵州茅台 / 000001 平安银行 / 300750 宁德时代),满足硬条件就生成一份异动快报推给你,快报里写清楚触发事实、风险提示、以及——最关键的——你这笔持仓今天到底能不能动

这是"半自动闭环"的第一步:机器负责盯盘和整理,人负责决策和下单。它不是全自动交易,也故意不是——看完这节课你会明白为什么这是现阶段对你最诚实的架构。

一、三层架构总览

脚本 scripts/intraday_monitor.py 的结构只有三层,每一层的职责和"用什么技术"都是刻意的:

职责用什么做为什么
① 规则引擎硬条件过滤:涨速、量能、逼近涨停纯 Python 算术便宜、稳定、毫秒级、可回测——99% 的时间盘面无事发生,不值得惊动 LLM
② LLM 快报把触发事实翻译成人话 + 风险提示LLM API(演示模式用预计算文本)人读"涨速+2.18%、量比2.1"要反应几秒,读一段快报只要一眼——这是 LLM 该干的活
③ 人工确认标注持仓的 T+1 状态,等你决策纯文本输出决策权与下单权都在你手里,Agent 不碰
为什么规则先行、LLM 殿后

反过来的做法——每分钟把全市场行情喂给 LLM 问"有异动吗"——三个致命伤:成本(每天几百次调用,全是"没有异动"的浪费)、稳定性(API 抖动或 Key 失效时监控直接瘫痪)、不可复现(同一份行情问两次,结论可能漂移,你无法回测它)。规则引擎一分钱不花、永不下班、结果可逐条审计;LLM 只在规则命中后被调用一次,干的还是它最擅长的翻译工作。贵的组件放在便宜的过滤器后面,这是 Agent 工程的通用分层原则。

二、第一层:三条硬规则(含第 1 课复习)

脚本里的 run_rules() 实现三条经典异动条件:

第三条里藏着第 1 课的硬知识:涨停价必须按板块算。脚本用 board_limit() 区分:主板(600/000 开头)±10%,创业板(300/301)与科创板(688)±20%。同样"距涨停 1%",主板是距 +9%,创业板是距 +19%——后者离涨停还远着呢。用错板块幅度,整条规则报废。

三、行情获取:降级链与接口礼仪

盘中监控对行情的要求是"快"而不是"全",脚本用逐级降级get_snapshot()

  1. 东方财富 ak.stock_zh_a_spot_em():全市场实时快照,数据全,但接口重、且我们这台机器被风控过(第 2 课封 IP 事件),所以放在 try/except 里;
  2. 新浪财经requests 直连,单请求 5 秒超时):轻量备用源;
  3. 内置合成快照:两个源都挂了也能完整演示三层架构——监控 Agent 自己绝不能因为数据源挂掉而崩溃。

我在你机器上实测 --real 模式时,降级链真实地走了一遍:

东方财富接口失败(ProxyError),尝试下一数据源……
行情来源:新浪财经实时快照

免费数据源的不稳定性不是意外,是常态——这正是第 2 课那句"任何数据入口都要有备胎"在盘中场景的复现。

轮询频率与接口礼仪(复习第 2 课封 IP 事件)

监控意味着循环请求,但"盯得紧"和"刷得狠"是两回事。纪律:盘中轮询间隔 30~60 秒足够(你的决策粒度是分钟级,不是毫秒级的高频);单个请求必须设 timeout;失败重试要间隔退避,禁止无间隔猛刷。第 2 课那次 IP 被东财临时拒连,就是高频请求的直接后果——对一个免费接口,礼仪不是客气,是可用性本身。

四、第二层:LLM 快报——只翻译,不指挥

规则触发后,make_report() 把"触发事实"交给 LLM 生成快报。Prompt 的关键设计(SYSTEM_PROMPT):

你是A股盘中异动监控助手。根据给出的触发事实写一段不超过80字的异动快报。
要求:只陈述事实与风险,不给买卖指令,结尾提醒"决策由人做出"。

第 3 课的 Prompt 三原则在这里依然成立,并且加了一条角色纪律:不给买卖指令。盘中是情绪最上头的时候,一条"建议立即卖出"的快报在 14:50 的杀伤力远大于盘后。LLM 的职责是把事实与风险摆清楚,按钮留在你手里。

五、第三层:人工确认——T+1 是快报的灵魂

同一条异动快报,对不同持仓状态的你,含义完全不同。这是第 1 课的核心分水岭在实战中的第一次落地:

持仓状态含义快报给出的行动指引
可卖持仓(昨日买入)今日可正常卖出"你可以行动:是否减仓/止盈由你判断"
冻结持仓(今日买入)T+1,今天卖不掉"Agent 只能记录异动,并为你准备明日开盘预案"
无持仓(自选观察)可以关注是否介入"是否介入由你判断,注意追高风险"

一个不懂 T+1 的监控 Agent,会在你今日刚买入的股票跳水时喊"快止损"——而你根本卖不掉,只剩焦虑。快报区分持仓状态,不是为了信息完整,是为了不给你无法执行的建议

六、动手:跑起来(无需网络、无需 Key)

演示模式用内置合成行情快照 + 预计算快报,先把三层架构看懂:

cd "$HOME/AI Project/Quant Learning"
source .venv/bin/activate
python scripts/intraday_monitor.py

你会看到(我已在你的环境实测通过):

运行模式:演示模式(合成行情 + 预计算快报)
行情来源:内置合成快照(演示模式)

扫描时间:00:45:40(每只股票只算硬条件,不触发不打扰)

========================================================
异动快报 | 贵州茅台(600519) | 触发:涨速、量能
--------------------------------------------------------
  规则明细:5分钟涨速 +2.18%(阈值 ≥ +2.00%)
  规则明细:成交量为20日均量的 2.1 倍(阈值 ≥ 2.0 倍)
  规则明细:距涨停价 1628.00 元还有 5.37%(阈值 < 1.00%)
  预计算摘要:贵州茅台盘中放量急拉:5分钟涨速超2%,成交量已达20日均量2倍以上,资金呈脉冲式流入。注意今日为提价公告后的第二个交易日,短线情绪偏热,急涨后回落风险同样放大。
  持仓状态:可卖持仓 100 股(昨日买入,今日可卖)
  → 你可以行动:是否减仓/止盈由你判断,Agent 不替你下单。
========================================================

- 平安银行(000001):未触发任何规则,静默

========================================================
异动快报 | 宁德时代(300750) | 触发:逼近涨停
--------------------------------------------------------
  规则明细:5分钟涨速 +1.28%(阈值 ≥ +2.00%)
  规则明细:成交量为20日均量的 1.1 倍(阈值 ≥ 2.0 倍)
  规则明细:距涨停价 240.00 元还有 0.84%(阈值 < 1.00%)
  预计算摘要:宁德时代逼近20%涨停板:现价距涨停不足1%,创业板波动幅度本就翻倍,触板后流动性骤降、排队成交。注意此类急拉若封板失败,回撤速度会非常快。
  持仓状态:冻结持仓 200 股(今日买入,T+1 冻结中)
  → 今天卖不掉!Agent 只能记录异动,并为你准备明日开盘预案。
========================================================

提醒:以上是'机器快报',不是交易指令。半自动闭环 = 机器盯盘 + 人做决策。

对照架构读这份输出:三只股票都过了规则引擎(第一层),平安银行未触发直接静默——不触发不打扰;两份快报各带 LLM 摘要(第二层)和持仓状态确认(第三层)。注意宁德时代的涨停价是 240.00 元(200.00 × 1.20,创业板 ±20%),不是主板的 220.00——第一层就在用第 1 课的板块幅度表。

想体验轮询与真实降级链,可以加参数(--real 走东财→新浪→合成的降级链,--loop 控制扫描轮数,--interval 控制间隔秒数):

python scripts/intraday_monitor.py --real
python scripts/intraday_monitor.py --loop 3 --interval 30

七、接入真实模型(可选,课后完成)

演示模式的快报是预计算文本;真实模式用环境变量走 OpenAI 兼容接口(默认 DeepSeek):

export LLM_API_KEY="sk-你的key"
python scripts/intraday_monitor.py --live

LLM_BASE_URL 默认 https://api.deepseek.comLLM_MODEL 默认 deepseek-chat,换别家模型改这两个变量即可。与第 3 课一样:--live 代码路径已写好但尚未实测(你机器上还没有 Key),拿到 Key 后跑一次,有报错直接贴给我。

八、为什么停在"半自动"——批判性思考

你可能想问:都监控到异动了,为什么不直接接券商 API 自动下单?三个现实理由:

所以现阶段的最优解就是这节课的形态:机器做它擅长的(不知疲倦地盯、毫秒级地算、有条理地写),人做人擅长的(结合语境判断、承担决策责任)。全自动不是不存在,而是需要先用半自动积累对自己规则命中率的信任——第 8 课讲执行闭环架构(vn.py / QMT)时会再展开。

自测

凭记忆作答,答错会显示解析。

延伸阅读

下一课预告

第 7 课 · 让 Agent 帮你写策略:人机协作的正确姿势——你把交易想法讲清楚,Agent 负责落成代码与回测,分歧时听谁的、如何迭代,是这门课最关键的一次协作演练。

有任何不清楚的地方(比如降级链、Prompt 设计、T+1 持仓状态判断),直接问我——我是你的老师。