← 返回 Skill 列表
extension
分类: 数据与分析无需 API Key

A股涨停复盘

每日收盘后自动整理 A股全市场涨停板梯队、板块分布(细分北交所30%/科创创业20%)、一字板集合竞价封单、非ST跌停封单、炸板、反包,并匹配舆情催化,生成带全表排序+列级筛选交互的结构化 HTML 复盘报告。梯队表含收盘封单/盘中最大封单/封单增减(日环比)三列封单数据。v1.1.4 起在涨停梯队之上新增"市场涨停风格"板块:涨停股平均总市值、平均涨停成交额及 60 日双轴变化折线(真实逐日累积)。v1.1.5 起精简数据源降级链路、统一界面简称为「A股涨停复盘」,并新增涨停梯队连板矩阵图(按连板高度分行,同行内按收盘封单降序)。v1.1.6 起连板矩阵图美化(高度阶梯+卡片流),并收窄为仅展示 3 板及以上高标连板。v1.1.7 起支持动态连板高度(自动 6 板/7 板)、≥7 板列为龙头股、4 板后断板反包独立展示。v1.1.8 修复顶部统计卡与市场涨停风格板块的 HTML 嵌套与对齐:补全缺失闭合标签、卡片等高拉伸、页面水平边距统一为 22px。v1.1.9 起各章节标题(含表格/连板卡片的 section)右侧新增关键词筛选框(scripts/filter.js,内联于报告),支持实时过滤行、显示 命中/总数 并一键清除。v1.2.0 起在表头每列新增下拉筛选(多选/搜索/全选/清空/反选),与全局筛选、表头排序互不冲突,激活列高亮提示。v1.2.1 起"市场涨停风格"板块新增第 3 个指标「涨停股平均成交金额」:当日全天成交金额(通达信 HQInfo.Amount,由 tdx_quotes 单只轮询取数)的算术平均,区别于既有的"平均涨停成交额"(仅封板期间),用于刻画涨停股当日真实成交体量。v1.2.2 起在「二、涨停板块分布」下方按每个题材主线生成独立的连板高度梯队矩阵图:解析板块分布表的代表标的并与涨停梯队表按名称匹配,分 2 板及以上连续板、断板反包(有效板数 ≥4)、断板续(有效板数 2-3)三组,同行内按收盘封单降序;无高标的主线自动隐藏,保持页面简洁。v1.2.3 起题材主线连板矩阵扩展为展示 1 板+:首板、2 板、3 板+ 高标、断板反包/续全部按连板高度梯队呈现,帮助快速识别主线内部的情绪扩散结构。v1.2.4 起移除所有连板矩阵中的「🔁」emoji 标志(断板反包/断板续标签与汇总药丸均改为纯文字),保持界面简洁。v1.2.5 起将断板反包/断板续的 rail 标签改为固定两字换行(「断板<br>反包」「断板<br>续」),配合 `.lm-h` 居中样式,使窄 rail 内文字对齐整齐。v1.2.7 起优化市场涨停风格 60 日双轴折线的可辨识度:平均总市值线改为蓝色(#2563eb)实心圆点,平均涨停成交额线改为橙色(#f97316)虚线+方形节点,图例同步展示线型与节点形状差异,避免两线颜色/形式过于接近。v1.2.8 起新增「十一、龙头股池 + 潜在补涨」章节:解析当日涨停梯队(一)与板块分布(二),提炼各题材主线连板高度最高的龙头个股、曾 4 板之后断板反包/续的核心高标,并围绕主流题材与高度板主涨属性(题材/国资/小盘/股权关系等)用 tdx_screener 真实发散潜在补涨标的(红线不编造)。v1.2.9 起美化版块十一视觉:三块内容改为带编号徽章的面板卡片(龙头股池 / 断板反包续核心 / 潜在补涨),潜在补涨标的前缀 ▲▼ 涨跌箭头并红涨绿跌;顶部 sticky 导航新增高亮"⚡ 龙头补涨"便捷按钮一键跳转。v1.3.0 起新增「一-B、Level-2 主力封板质量信号」区块:经通达信 Level-2 主力资金流(tdx_api_data · fixedTag=zjlx,含当日真实数据)拉取连板/反包股的主力净额、超大单净买、主买净额,标注封板质量信号(强封·主动买盘 / 稳封·大单托底 / 反包·板上抛压 / 一字·板上零主动买 / 弱封·主力净流出)并附红黑榜;注入脚本 scripts/inject_l2_0827.py。v1.3.1 起固化「〇·市场涨停风格」(s0) 取数方法论:总市值(ExtInfo.ZSZ) 与 全天成交金额(HQInfo.Amount) 统一以 `tdx_quotes(code, setcode, hasCwInfo="1", hasHQInfo="1")` 单码轮询为**主数据源**(替代易限流的 tdx_indicator_select),并在 MCP 配额耗尽时以「样本 N/总数」诚实标注、配额恢复后补齐,禁止插值/伪造;随包更新 leader_pool_data.json 为最新潜在补涨池。v1.3.2 修复连板矩阵「断板反包」组漏取个股的缺陷:`scripts/ladder_matrix.py` 的 `group_and_sort()` 原先只认梯队列字面为「断板续」的行,当数据源把断板反包股统一写成「首板」时(如 2026-09-01,开开实业「19天9板」被标成首板)会取到 0 只;现已改为「断板续」或「首板」且区间累计板数 ≥ REBROKEN_MIN_BOARD 均计入,并新增通用脚本 `scripts/fix_level_labels.py` 在生成矩阵前按红线规则把「首板 + 几天几板 Y≥2」批量改回「断板续」,保证 s1 表与矩阵口径一致。v1.3.3 把「连板高度梯队」固化为**不可跳过的强制环节**:新增交付前自检关卡 `scripts/qa_check.py`(校验 s1 连板梯队矩阵存在且非空、level 标签红线、题材矩阵是否错位、div/section 闭合、占位符残留等,FAIL 即退出码 1、**禁止交付**),彻底杜绝"文档写了但生成时忘了跑"导致的矩阵缺失;同时修复 `inject_sector_matrix` 的注入锚点缺陷——旧回退正则在 s2 表格后带 notice 时会误匹配 s3 结尾,把题材矩阵注入进「三、北交所」章节,现改为按 s2 章节边界定位、插到 `</section>` 之前。v1.3.4 起固化 2026-09-07 连续 4 次用户截图反馈的「渲染与 HTML 生成红线」:① 公司名称禁止折行(`.lm-name/.lp-name/.rb-name` 必须 `white-space:nowrap;word-break:keep-all;`,`.lp-top/.rb-top` 补 `min-width:0`);② 断板反包/连板卡片一行 ≤4-5 家(`.lm-card flex:1 1 210px;max-width:250px`、`.rb-wrap minmax(260px,1fr)`);③ 潜在补涨「龙头」锚定胶囊禁止 nowrap、必须换行完整显示(`.pb-anchor` 用 `white-space:normal;word-break:break-word;line-height:1.7;flex:1 1 220px;min-width:0;`);④ 空数据单元格必须输出 `<td>—</td>`、严禁裸 `—` 文本挂 `<tr>` 内(缺 td 会让该列排序 JS 取 `children[ci]` 抛错、行末白底);⑤ 宽表新增顶部镜像滚动条 topscroll.js(与底部双向同步、无溢出自动隐藏);⑥ qa_check.py 正则属性容错(WorkBuddy 预览会注入 data-page-node-id,破坏精确匹配)。以上全部同步进模板 `report_template.html`/`tpl_head_0902.txt`/`tpl_tail_0902.txt` 与随包脚本,并在 Step 7.5 固化交付前回归自查清单。

person作者: user_59ead178hubcommunity

A股涨停复盘

触发词

涨停板复盘、涨停梯队、收盘复盘、每日涨停、跌停统计、炸板、反包、一字板封单、北交所涨停、科创板创业板涨停、A股复盘报告

适用场景

用户(通常是 A股投资者/复盘者)在交易日收盘后(15:00 之后)希望快速拿到一份结构化、可交互的当日涨停板全景复盘,包含:

  • 全市场涨停梯队(连板高度)
  • 涨停个股板块分布
  • 北交所(30%涨停)细分
  • 科创板/创业板(20%涨停)细分
  • 一字涨停个股及其集合竞价封单规模(9:15 / 9:20 / 9:25;无 Level-2 时用"收盘封单 + 盘中最大封单"替代;已开通 Level-2 时,追加「一-B、Level-2 主力封板质量信号」区块,用主力净额/超大单/主买净额刻画封板强弱)
  • 涨停梯队封单三列:收盘封单 / 盘中最大封单 / 封单增减(日环比,昨收封单对比)
  • 非 ST 跌停个股、板块分布、封单金额
  • 当日炸板个股及板块分布
  • 当日反包个股及板块分布
  • 涨停背后的舆情与消息催化
  • (可选增强)每月初首个交易日至今日累计涨跌前20(剔除新股)

数据源与降级链路(重要)

本 Skill 优先使用通达信 MCP(tdx-connector,已连接)。原计划链路在多数环境不可用,须逐级降级并在报告中如实标注:

  1. 东方财富涨停池 push2ex.eastmoney.com/getTopicZTPool → 返回 {"rc":102,"data":null},需鉴权,通常不可用。
  2. 东方财富龙虎榜 datacenter-web.eastmoney.com RPT_DAILYBILLBOARD_DETAILS → 仅历史日有数据,当日返回空。
  3. 妙想 MCP(mx-ds-mcp)→ 依赖 MX_APIKEY,未配则不可用。
  4. 通达信 MCP tdx_screener(自然语言选股,支持"涨停"/"跌停"/"炸板"/"反包")→ 主数据源。
  5. Wind 金融数据 MCP(wind-finance,已连接)→ 用于区间涨幅/跌幅前20(同花顺 iFinD 密钥未配时降级至此)。
  6. 同花顺 iFinD(ifind-finance-data)→ 密钥为占位符时不可用;若用户配置真实密钥可优先用于区间统计。

红线:禁止编造数据。任何接口返回空/不可用,须如实标注,不得用占位数字填充。

工作流

⛔ 最易遗漏清单(每次生成报告都必须逐项确认,曾反复踩坑)

| # | 环节 | 必做动作 | 漏了会怎样 | |---|---|---|---| | 1 | 一、涨停梯队的连板高度梯队矩阵 | 跑 python scripts/ladder_matrix.py(会同时注入 s1 主矩阵 + s2 题材矩阵) | s1 章节完全没有梯队图,只有一张长表(2026-09-01 实际漏过) | | 2 | 梯队列 level 标签 | 先跑 python scripts/fix_level_labels.py <报告路径>,再跑 ladder_matrix.py | 「断板反包」组静默取 0 只(2026-09-01 漏掉 14 只中的 5 只高标) | | 3 | 交付前自检 | 跑 python scripts/qa_check.py <报告路径>,必须全 PASS 才能 present_files | 上面两项漏了也无人发现,直接交付错误报告 | | 4 | 渲染样式回归(v1.3.4) | 按 Step 7.5 六条 grep 复核名称折行/卡片密度/锚定胶囊/<td>—</td>/topscroll | 公司名被折行、卡片挤爆、龙头文字截断、末列白底+该列排序失效(2026-09-07 一天连踩 4 次,用户逐张截图反馈) |

顺序不可颠倒、不可省略:生成报告 → fix_level_labels.py → ladder_matrix.py → qa_check.py → 交付。 其中第 1 项是本篇复盘最核心的可视化产物,任何情况下都不得省略——哪怕当日连板股很少,也要跑(矩阵会自动只显示实有高度轨)。

Step 1 · 采集涨停/跌停/炸板/反包(通达信 MCP)

调用 mcp__tdx-connector__tdx_screener:

  • message="涨停", pageSize=200 → 全量涨停(含字段:sec_code、sec_name、now_price、chg、封单金额、首次涨停时间、最近涨停时间、涨停打开次数、涨停原因、连续涨停天数、几天几板、原因揭秘、板型、涨停成交额、涨停最大封单额、封成比、封单量)
  • message="跌停", pageSize=100 → 全量跌停(含封单金额、短线主题等)
  • message="炸板", pageSize=100
  • message="反包", pageSize=100(注意:选股器"反包"多为"阳包阴"形态,需按涨停反包二次筛选)

北交所细分:自然语言 message="北交所涨停" 通常返回 0 条。需用代码前缀维度确认:83/43/87/920 开头。若全量涨停列表无此类代码且炸板/反包中仅出现 920 开头非涨停标的,则判定北交所当日 0 只涨停。 科创创业细分:300/301(创业板)、688(科创板)开头中 chg≈20% 的为 20% 涨停;其余主板为 10%。

Step 2 · 一字板与集合竞价封单

  • 一字板判定:板型为"一字板(涨停)"且涨停打开次数=0、09:25 封板。
  • 数据限制:通达信选股仅含收盘封单与盘中最大封单(涨停最大封单额),无 9:15/9:20/9:25 分时封单。报告中以"收盘封单 + 板型 + 盘中最大封单"替代,并明确提示需 Level-2 逐笔/盘口快照才能精确获取。不要在报告中编造集合竞价具体数字。已开通 Level-2 时:可在 Step 6.7 用 tdx_api_data(fixedTag=zjlx)拉取主力资金流增强「封板质量信号」(zjlx 提供当日主力/超大单/主买净额,但不含集合竞价分时封单)。

Step 2.5 · 封单增减(日环比,v1.1 新增)

  • 口径:封单增减(亿) = 今日收盘封单 − 昨日收盘封单(用户明确要求日环比,非盘中峰值对比)。
  • 昨日封单获取:通达信接口不提供历史封单。可用两个来源:
    1. 读取上一交易日的收盘复盘报告(HTML)——提取其涨停梯队表的"收盘封单(亿)"列(注意:旧版报告该列名为"封单额(亿)";若旧报告仅连板梯队带封单字段,则仅连板股可算)。
    2. message="昨日涨停" 选股可确认昨日涨停名单(48只示例),但该查询无封单字段,仅用于判断"昨日是否涨停"。
  • 显示规则:昨日未涨停(今日首板)或拿不到昨日封单数据的标的,该列输出整格 <td>—</td>,不编造、不估算(2026-09-07 教训:曾误输出裸 — 无 <td> 包裹,82 行末列错位 → 白底 + 该列排序失效)。
  • 口径声明:报告 notice 中须写明"昨日封单取自上一交易日收盘报告"。

Step 3 · 跌停封单补全

  • 跌停表部分标的通达信不携带封单字段,仅标注有值的(如百合花、速达股份、养元饮品)。其余标注"未返回封单字段",不编造。

Step 4 · 舆情/消息匹配

  • 利用涨停数据中的"原因揭秘""涨停原因""短线主题"字段,归类主线题材(如 mRNA疫苗、机器人、贵金属、锂电、重组、海运、煤炭、数字货币、光伏、种业等),与消息面催化对应。

Step 5 · (可选)月内累计涨跌前20

  • 用 Wind mcp__wind-finance__search_stocks:
    • question="筛选A股(剔除上市不足30天新股)YYYY年M月1日至今区间涨幅最大的前20只股票,返回代码、简称和区间涨跌幅"
    • 同样拉跌幅前20。
  • 删除"上市天数"列、补充"题材概念"(依据主营业务+当月主线手工标注,明确声明非 Wind 原字段)。
  • 统计窗口:"每月初第一个交易日"= 当月 1 日若为周末则顺延至首个工作日。

Step 6 · 生成 HTML 报告并归档

  • 使用 scripts/report_template.html 作为骨架,填入当日数据。
  • 归档路径(v1.1.1 新增,v1.1.2 改为绝对路径):报告统一保存到本地持久归档文件夹 C:\Users\悟空空\WorkBuddy\A股全市场涨停板复盘\(绝对路径,独立于日期工作区,长期留存),文件名 A股涨停复盘_YYYY-MM-DD.html。每日复盘均落入该目录,便于按日期回溯。
  • 生成报告后,同步更新归档索引 C:\Users\悟空空\WorkBuddy\A股全市场涨停板复盘\index.html:列出该目录下所有 A股涨停复盘_*.html(按日期倒序),提供链接跳转。运行技能 scripts/build_index.py 即可重扫目录自动重建(脚本默认指向上述绝对路径,无需特定 cwd)。
  • 顶部 8 卡片摘要(v1.1.3 新增):与昨日 08-24 复盘一致,固定 8 张指标卡(4×2 网格,颜色 .r/.g/.p/.o/.t/.pk/.y + 默认蓝),字段为:①非ST涨停(主板10%为主)②跌停(全部非ST)③科创创业20%涨停 ④炸板(触板未封) ⑤北交所30%涨停 ⑥一字涨停(判定)⑦反包(阳包阴形态)⑧连板最高:{名称}。占位符:__NONST_ZT__ __DT_NONST__ __KC_ZT__ __ZB__ __BJ__ __YIZI__ __FB_RAW__ __MAX_BOARD_TXT__ __MAX_BOARD_NAME__。
  • ⚠️ 连板最高卡片红线:__MAX_BOARD_TXT__(如"6板")与 __MAX_BOARD_NAME__ 必须取自真实连续涨停天数最高的个股(即从 s1 梯队表中 level 列最高者/非断板续者选取),严禁从「几天几板」的 Y 值取最大——断板票 Y 会虚高(如 8-27 神奇制药"11天7板"Y=7,真实连续仅 1,旧报告错填成"7板/神奇制药",应为"6板/深中华A")。

Step 6.5 · 市场涨停风格(平均总市值 / 平均涨停成交额 / 平均成交金额 + 60 日折线)

  • 位置:置于涨停梯队(<section id="s1">)之上,板块 id="s0",导航锚点"〇·涨停风格"。用三个指标刻画当日涨停股的市值结构与资金量级,并叠加 60 日双轴折线,判断行情是"大票/小票主导、资金充裕/偏紧"。
  • 取数(唯一数据源:通达信 MCP,严禁其它源/硬编码):
    1. tdx_screener(message="涨停", pageSize=200) → 取每只 涨停成交额(万)(单位万元,即推动该票涨停的当日成交额,仅封板期间)。
    2. 总市值(ZSZ) 与 全天成交金额(Amount) 统一用 tdx_quotes(code, setcode, hasCwInfo="1", hasHQInfo="1") 单码轮询取数(首选方法):返回 ExtInfo.ZSZ(总市值,元)与 HQInfo.Amount(当日全天成交金额,元)。多代码仅回首条,须单码逐个轮询(可并行,每批 ~10 只);对全部涨停股(含 ST)算术平均;报告注明含 ST 只数。
    3. tdx_indicator_select(message="<代码1>,<代码2>,… 的总市值", rang="AG") 仅作限流兜底:每批 ≤5 只(NLP 解析超过约 5 只会静默截断,多余代码被丢弃),易触发配额限流,失败批次须拆成每批 2-3 只重试。
    • 配额耗尽红线:若 MCP 配额中途耗尽(返回 Your usage quota has been reached),不得编造/插值——已采样本先算均值并明确标注「样本 N/总数」,配额恢复后补齐剩余再算全量;style_history.json 当日条目在补齐前保留 null + note,避免污染 60 日曲线。09-01 实战:18/86 样本 → 配额恢复后补齐至 86/86 全量,结论以全量为准。
  • 计算脚本:scripts/market_style.py(默认内嵌当日真实数据;也可 python market_style.py --data data.json 读取 screener/indicator 结果)。输出:
    • avg_mcap_yi / median_mcap_yi(平均/中位总市值,亿元)
    • avg_turnover_yi / median_turnover_yi(平均/中位涨停成交额,亿元,仅封板期间)
    • avg_amount_yi / median_amount_yi(平均/中位成交金额,亿元,当日全天)
    • 风格判定:cap_style(大票主导≥100亿 / 中盘均衡50-100 / 小票主导<50)、money_style(资金充裕≥10亿 / 资金适中5-10 / 资金偏紧<5)
    • 维护 style_history.json(仅保留最近 60 个交易日,按日期升序;含 avg_amount_yi),并渲染 60 日双轴折线 SVG(左轴=平均总市值,右轴=平均涨停成交额)。
  • 注入:scripts/inject_style.py 把板块注入 report_template.html 与当日报告(置于 s1 之前),模板用占位符 __STYLE_AVG_MCAP__ / __STYLE_AVG_TURNOVER__ / __STYLE_AVG_AMOUNT__ / __STYLE_MED_MCAP__ / __STYLE_MED_TURNOVER__ / __STYLE_MED_AMOUNT__ / __STYLE_COUNT__ / __STYLE_COUNT_ST__ / __STYLE_CAP__ / __STYLE_MONEY__ / __STYLE_CAP_DESC__ / __STYLE_MONEY_DESC__ / <!-- __STYLE_SVG__ -->,报告用真实值。
  • 红线:60 日历史为真实逐日累积,启用首日仅 1 个数据点,禁止插值/伪造;约 60 个交易日后形成完整窗口,可直观观察市值/资金风格的轮动。ST 股计入平均(报告注明含 ST 只数),不剔除、不单算以保口径统一。

Step 6.7 · Level-2 主力封板质量信号(v1.3.0 新增)

当环境已开通通达信 Level-2(用户确认或 tdx_api_data 可调通)时,在「一、涨停梯队(连板高度)」与「二、涨停板块分布」之间新增独立区块「📡 一-B、Level-2 主力封板质量信号(连板股资金剖析)」,用主力资金流标注每只连板/反包股的封板质量。

  • 取数(通达信 MCP):mcp__tdx-connector__tdx_api_data,参数 code=<纯数字代码>、fixedTag="zjlx"、mode="code-fixed-tag-extra"(自动路由到 TdxSharePCCW.tdxf10_gg_jyds 的 capital_flow 表)。返回字段:主力净额金额(元)/占比(%)、超大单净买入金额(元)/占比(%)、大单净买入金额(元)/占比(%)、主买净额金额(元)/占比(%)、收盘价。盘后仍返回当日真实数据(含 日期:YYYY-MM-DD 行),确认可用后再注入。

  • 覆盖范围:s1 涨停梯队表中全部非首板股(断板续 + 各连板高度)。2026-08-27 为 18 只(2 断板续 + 1×6板 + 1×5板 + 1×4板 + 5×3板 + 8×2板)。

  • 字段含义:主力净额 = 超大单净买 + 大单净买(机构/大资金方向);主买净额 = 主动买入 − 主动卖出(负值 = 涨停板上有主动抛压,被大资金承接)。两者背离是封板强弱关键:主买为负但主力/超大单为正 → 大单承接分歧(多为健康换手);主力也为负 → 主力撤退(弱封)。

  • 封板质量评级(彩色 chip,由数据推导):

    • ✅ 强封·主动买盘:主买净额 > 0(全场罕见,如 2026-08-27 金健米业)。
    • 🟦 稳封·大单托底 / 大单吸筹:主力净额 > 0 且绝对值靠前(湘财/金健/楚天龙/神奇/杭电)。
    • ⚠️ 反包·板上抛压极重:断板反包股主买净额深度负(神奇制药 −5.03亿/−74%)。
    • 🟧 一字·板上零主动买:一字板主买占比 −100%(全靠隔夜排队被动单,海鸥/冀衡/捷荣/新农/锦龙),次日开板直面真实抛压。
    • 🔴 弱封·主力净流出:主力净额 < 0(全场唯一,千金药业 −1.69亿),封单最弱、分歧最大。
  • 注入脚本:scripts/inject_l2_0827.py——内置 18 只(或当日实际)连板股 Level-2 数据列表(必须从 tdx 真实返回取得,禁止硬编码伪造),在 <section id="s2"> 之前插入 <section id="s1b">:表格列 = 连板/代码/名称/主力净额(亿)/超大单净买(亿)/主买净额(亿)/主买占比/封板质量信号;附表 5 张红黑榜卡片。并:① s1 末尾 notice 追加「已开通 Level-2」指向;② 顶部导航新增「一-B·L2封板」入口(href="#s1b");③ 报告内联 CSS 补 .l2-summary/.l2-card(网格卡片)。运行 python scripts/inject_l2_0827.py 即可(脚本默认指向 workspace 报告绝对路径)。

  • 红线:所有金额必须来自 tdx 真实返回;每次重算须 fresh-repull(tdx 易限流时拆批 2-3 只重试),不得插值或挪用历史硬编码值冒充当日数据。

  • 涨停梯队连板矩阵图(v1.1.5 新增,v1.1.6 美化 + 收窄口径,v1.1.7 动态高度 + 龙头股 + 断板反包):在「一、涨停梯队」章节顶部,仅展示 3 板及以上高标连板(剔除 2板/首板),同行内按收盘封单(亿)降序排列。连板高度动态:自动出现 6板/7板 等,无需改代码。7 板及以上(≥7板)列为「👑龙头股」(金色高亮,独立分组置顶)。「断板反包」组:原梯队表中「断板续」且 几天几板的有效板数 ≥4(即在 4 板之后断板又反包涨停) 的个股,单独成组、展示在 3 板以下位置(紫色高亮 + 「反包」角标)。美化版采用「高度阶梯(渐变色块 + 只数)+ 卡片流」布局:表头含标题/「3板+ / 龙头 / 断板反包」标签/排序说明,每行左侧渐变色块(3板橙→4板红→5板深红→6板紫红→龙头金),右侧卡片流展示个股名称、收盘封单(红色药丸)、题材(最多 2 行)、几天几板+首次时间+板型;底部汇总为各高度药丸 + 合计只数。数据来自当日涨停梯队表格,由 scripts/ladder_matrix.py 解析并注入;模板占位符为 <!-- __LADDER_MATRIX__ -->。

  • 题材主线连板高度梯队(v1.2.2/v1.2.3):在「二、涨停板块分布」表格下方,按每个题材主线生成独立的连板高度矩阵图。实现方式:scripts/ladder_matrix.py 解析 section#s2 板块分布表的"代表标的"列,按股票名称与 section#s1 涨停梯队表匹配,获取每只标的的连板高度、收盘封单、几天几板、首次涨停时间、板型、题材;每个主线内部按 1 板及以上连续板(v1.2.3 起含首板、2 板)、断板反包(有效板数 ≥4)、断板续(有效板数 2-3) 分组(紫色高亮 + 角标),同行内按收盘封单降序。每个矩阵表头显示主线名称与涨停总数,底部汇总各高度/断板组药丸。模板占位符为 <!-- __SECTOR_LADDER_MATRIX__ -->,由 scripts/ladder_matrix.py 在注入全市场连板矩阵后一并注入。

    • ⚠️ 注入位置红线(v1.3.3 修复):题材矩阵必须落在 <section id="s2"> 内部。旧实现的回退正则 (<section id="s2">.*?)(</table></div>)(\s*)(</section>) 在 s2 表格后还跟有 <p class="notice"> 时无法在 s2 内匹配,非贪婪的 .*? 会继续向后展开、误匹配到 s3 的结尾,把全部题材矩阵注入进「三、北交所 30% 涨停」章节(2026-09-01 即如此:10 个矩阵全部错位,肉眼不易察觉)。现改为先取 s2 的 <section id="s2" 起点与其后第一个 </section> 作为边界,再在该 </section> 之前插入。"scripts/qa_check.py" 已内置该项校验。
  • 版块十一·龙头股池 + 潜在补涨(v1.2.8 新增,v1.2.9 美化):置于「十、月内涨跌前20」之后(section id="s11")。顶部 sticky 导航含高亮"⚡ 龙头补涨"便捷按钮(a.nav-s11,橙色渐变胶囊)一键跳转。由 scripts/leader_pool.py 自动生成并注入,模板占位符 <!-- __LEADER_POOL__ -->(老报告无占位符时回退到 s10 之后、footer 之前,正则幂等清理旧注入,可重复运行不重复):视觉上三块内容各为一个带**编号徽章(①②③)**的白色面板卡片(.s11-sub / .s11-num / .s11-sub-h),分隔清晰、层级分明;潜在补涨标的前缀 ▲▼ 涨跌箭头、红涨绿跌(.pb-chip .up/.down/.ar)。

    1. 龙头股池:解析 s1 涨停梯队与 s2 板块分布表,按每个题材主线取连板高度最高(effective_height:连续板取 N,断板续取"几天几板"有效板数)的个股为龙头卡片(含主线名、几天几板、封单、题材、主线涨停只数);≥7 板标 👑龙头 角标。
    2. 断板反包/续核心:s1 中"断板续"且有效板数 ≥4 的核心高标(曾 4 板之后断板又反包/续),独立卡片组。
    3. 潜在补涨:读取同目录 scripts/leader_pool_data.json(由 AI 用 tdx_screener 围绕各主线高度板的主涨属性真实发散生成,含 theme/anchor/logic/stocks 四字段及当日实时涨跌幅 chg,红线禁止编造),渲染为「主线 → 龙头 → 发散逻辑 → 低位标的(涨跌幅)」卡片网格。
    • 数据红线:leader_pool_data.json 必须由 tdx_screener 真实选股结果填充,严禁虚构标的或涨幅。运行时 leader_pool.py 先尝试与脚本同目录的 JSON,再回退到报告同目录。
  • 报告含 12 个章节:市场涨停风格(〇) / 涨停梯队(一) / 板块分布(二) / 北交所(30%)(三) / 科创创业(20%)(四) / 一字板封单(五) / 跌停(非ST)(六) / 炸板(七) / 反包(八) / 舆情汇总(九) / (可选)月内涨跌前20(十) / 龙头股池+潜在补涨(十一)。连板股另含「一-B、Level-2 主力封板质量信号」子区块(v1.3.0,位于一与二之间)。

  • 涨停梯队表(v1.1 三列封单模型):收盘封单(亿)(通达信"封单金额"字段)|盘中最大封单(亿)("涨停最大封单额"字段/1亿)|封单增减(亿)(日环比,见 Step 2.5)。三列均参与全表头排序。

  • ⚠️ 连板高度红线(防错,2026-08-27 复盘后补):涨停梯队表首格「连板高度 level」只能取自 tdx_screener 返回的 连续涨停天数 字段(截至今日的真实连续涨停天数)。严禁用「几天几板」的 Y 值当 level——断板票 Y>N 会虚高(如金健米业「9天6板」真实连板仅 1,曾被错标 6板;万向德农「8天5板」真实连板 3,曾被错标 5板;神奇制药「11天7板」真实连板 1,曾被错标 7板/龙头股)。判定规则:① 连续涨停天数≥3 且今日涨停 → 标「N板」;② 连续涨停天数=1 且「几天几板」Y≥2(历史曾连板后断板今日反包/续)→ 标「断板续」(其 Y 仅供断板反包/续分组用,不作 level);③ 今日首板且历史无连板 → 标「首板」。可视化矩阵 ladder_matrix.py 仅读取本表 level 列,故 level 写错会直接污染矩阵与版块十一。

  • ⚠️ 生成顺序红线(v1.3.2 新增,v1.3.3 补第 3 步):梯队表写完后,必须按序跑完三步,缺一不可:

    1. python scripts/fix_level_labels.py <报告路径> —— 校验/修正 level 列;
    2. python scripts/ladder_matrix.py(inject(报告路径))—— 注入 s1 连板梯队矩阵 + s2 题材矩阵;
    3. python scripts/qa_check.py <报告路径> —— 交付前自检,FAIL 不得交付。

    跳过第 1 步且当日数据源把 ② 类个股写成「首板」时,矩阵「断板反包」组会静默取到 0 只(2026-09-01 实际踩坑:14 只断板反包全部漏掉,其中 5 只有效板数 ≥4);跳过第 2 步则 s1 完全没有梯队图(2026-09-01 同样踩过)。三个脚本均可重复执行、幂等。

  • 交互排序:scripts/sort.js 提供全表头排序——数值列按数字、时间列(HH:MM)按时间、文本列按 localeCompare('zh');默认降序列保持 ▼,点击切换 ▲/▼。v1.3.4 健壮性:单元格取值做缺格保护(a.children[ci] 可能为 undefined);数值列「—」/空值恒沉底(解析失败置 Infinity,但需显式 an===Infinity return 1 处理,不能用 bn-an 公式否则降序方向相反)。

  • 顶部镜像滚动条(v1.3.4):宽表横向滚动条在底部不便使用,新增 scripts/topscroll.js(在 <body> 末尾内联):为每个 .tablescroll 容器上方插入一条镜像滚动条,scrollLeft 与容器双向同步,表格不超宽自动隐藏。12 张宽表全部生效。

  • 列级筛选(v1.2.0):每个表格表头(th)右侧显示下三角 ▾,点击弹出该列唯一值多选菜单:支持搜索、全选、清空、反选;多列筛选叠加生效;已筛选列高亮显示。v1.3.4 起下三角与排序箭头合并为同一元素(span.arr.th-filter),避免双箭头叠放。filter.js 同时保留 v1.1.9 的章节标题全局关键词筛选,二者互不冲突。

  • 顶部 sticky 毛玻璃导航,9-10 节锚点跳转。

  • 响应式:表格外层 .tablescroll 横向滚动,小屏不溢出。

  • 数据来源/抓取时点/降级链路在 footer 如实标注。

Step 7 · 交付前强制自检(v1.3.3 新增,QA Gate · 不可跳过)

规则:报告生成完毕、调用 present_files 交付之前,必须执行一次 python scripts/qa_check.py <报告路径>。只要出现 FAIL(退出码 1),一律不得交付,须按提示补齐后重跑。

python scripts/qa_check.py "C:/Users/悟空空/WorkBuddy/A股全市场涨停板复盘/A股涨停复盘_YYYY-MM-DD.html"
python scripts/qa_check.py            # 省略路径 = 自动取归档目录最新一份
python scripts/qa_check.py <路径> --strict   # WARN 也判失败(发布前/CI 用)

校验项(★ = 历史踩过坑的强制项):

| 检查项 | 强制 | 说明 | |---|---|---| | 章节完整性 s0–s11 | 是 | 缺任一章节即 FAIL | | ★ s1 连板梯队矩阵存在 | 是 | s1 内必须有 <div class="ladder-matrix">,否则提示先跑 ladder_matrix.py | | ★ 梯队矩阵行数 lm-row ≥ 1 | 是 | 防"占位符在但矩阵是空的" | | ★ 梯队矩阵汇总药丸 lm-summary | 是 | 底部各高度药丸 + 合计只数 | | ★ 梯队高度轨 rail 解析 | 是 | 打印实际 rail(如 👑龙头股1只 · 6板2只 · 断板/反包5只)供肉眼复核 | | ★ level 标签红线 | 是 | 检出「首板 + 几天几板 Y≥2」误标,提示先跑 fix_level_labels.py | | 断板反包(累计≥4板) | 否(WARN) | 为 0 时提示人工确认当日是否确无反包 | | 梯队 level 分布快照 | 否(仅展示) | 打印 7板1 / 6板2 / … 供核对 | | s2 题材矩阵位置 | 是 | 必须全部落在 s2 章节内(防旧回退正则误注入 s3) | | s11 龙头股池+潜在补涨 | 是 | 未跑 leader_pool.py 会被检出 | | 残留占位符 __XXX__ | 是 | 已剔除 <script>/<style>,避免内联 JS 注释误报 | | 样本态标记 | 是 | 命中「样本 /采集中/配额已满/未绘入」即 FAIL,提示数据没算完 | | 全局 / s1 <div> 与 <section> 闭合 | 是 | 防注入脚本多/漏闭合标签 |

为什么需要这道关卡:2026-09-01 复盘同时踩了两个坑——s1 顶部连板梯队矩阵整块缺失、s1 表格 level 列把 14 只断板反包股误标「首板」。两者 SKILL.md 里其实都写了,但生成时靠"人记得执行"不可靠。故固化为可执行脚本,用退出码强制拦截。

Step 7.5 · 渲染与 HTML 生成回归自查(v1.3.4 新增,2026-09-07 连续 4 次用户截图反馈后固化)

背景:2026-09-07 一天内用户连续 4 次截图反馈显示问题(公司名称折行 → 卡片过密 → 龙头锚定截断 → 列排序失效+白底+滚动条位置),全部是「可防不可见」的渲染缺陷——qa_check.py 检测不出。以下红线每次交付前必须逐条 grep 复核,模板已内置正确值,若被误改/回退会立刻现形:

| # | 红线 | 正确写法(模板已内置) | grep 复核命令(报告内出现即正确) | |---|---|---|---| | 1 | 公司名称(连板矩阵 .lm-name / 龙头股池 .lp-name / 反包卡片 .rb-name)禁止折行 | 三个类都必须含 white-space:nowrap;word-break:keep-all;(仅 nowrap 挡不住 CJK 字符间断行);.lp-top/.rb-top 补 min-width:0 | grep -oE '\.(lm-name\|lp-name\|rb-name)\{[^}]*\}' | | 2 | 断板反包/连板卡片一行 ≤4-5 家,超出自动换行 | .lm-card{...flex:1 1 210px;max-width:250px;...}(1180px 容器下自然 4 列/行);.rb-wrap{...repeat(auto-fill,minmax(260px,1fr))...} | grep -oE '\.(lm-card\|rb-wrap)\{[^}]*\}' | | 3 | s11 潜在补涨「龙头」锚定胶囊(.pb-anchor)禁止 nowrap、文字必须完整显示 | white-space:normal;word-break:break-word;line-height:1.7;flex:1 1 220px;min-width:0;border-radius:10px;(多龙头锚定文字会自动换行;flex:1 1 220px 让它占满主题名右侧空间) | grep -oE '\.pb-anchor\{[^}]*\}' | | 4 | 空数据单元格必须输出 <td>—</td>,严禁裸 — 文本直接挂在 <tr> 内(模式 </td>—</tr>) | 所有生成空值的函数(如 fmt_delta)返回必须含 <td> 包裹;报告中 </td>—</tr> 出现次数必须为 0 | grep -c '</td>—</tr>'(必须返回 0;缺 td → 浏览器行末白底 + 该列排序 JS children[ci] 抛错点不动,2026-09-07 82 行全中招) | | 5 | 宽表横向滚动条必须同时在表格上方可见(用户反馈下方不便使用) | 生成尾模板内联 topscroll.js:为每个 .tablescroll 上方插入镜像滚动条,scrollLeft 双向同步、表格不超宽自动隐藏 | grep -c 'topscroll'(≥1) | | 6 | 排序脚本健壮性 | sort.js 取值须缺格保护(var ac=a.children[ci]; ac?...:'');数值列「—」无数据恒沉底(isNaN→Infinity、双 Infinity→0、an===Infinity return 1——不能用 bn-an 公式否则降序方向反) | 交付前用 jsdom 点表头实测(见 Step 7 备注方法) |

模板同步铁律:以上样式/脚本同时存在于 scripts/report_template.html(技能随包骨架) 与项目生成模板 tpl_head_0902.txt(head CSS)/tpl_tail_0902.txt(tail 脚本)。改任何一处必须三处同步,否则下次生成/打包会回退复发。

报告字段约定(A股红涨绿跌)

  • 涨幅为正用红色 .up,跌幅为负用绿色 .down。
  • ST/*ST 用 .zt 角标标记;用户若要求"非ST",则剔除或单列。
  • 封单金额单位:亿元。
  • 封单增减列:正(封单增加)红色 .up,负(封单减少)绿色 .down,无昨日数据输出 <td>—</td>(class 可不加)——必须整格输出、严禁裸 — 文本挂在 <tr> 内,否则破坏该列排序与行底色(见 Step 7.5 #4)。

注意事项

  • 时间均为北京时间;交易时段 9:30-15:00,复盘在收盘后执行。
  • 北交所 30%、创业板/科创板 20%、主板 10% 涨停阈值不同,分类时必须按代码前缀 + 涨跌幅双重校验。
  • 反包数据噪声大,优先呈现"涨停反包"(当日收盘仍封板且前一日收阴/断板)。
  • 若用户要求补齐集合竞价分时封单或 Level-2 数据:主力资金流(zjlx)已可用——经 tdx_api_data(fixedTag=zjlx)拉取主力/超大单/主买净额(见 Step 6.7);集合竞价分时封单仍依赖 Level-2 逐笔盘口,未配置则如实告知限制。
  • 历史封单不可得:通达信选股器不提供昨日/历史封单;"封单增减"仅当能从上一交易日报告取得昨收封单时计算,否则显示 "—"(红线:禁止估算/编造)。
  • 昨日报告若仅连板梯队带封单字段,则日环比仅能覆盖"昨日连板且今日续板"的少数标的,如实呈现即可。