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,已连接)。原计划链路在多数环境不可用,须逐级降级并在报告中如实标注:
- 东方财富涨停池
push2ex.eastmoney.com/getTopicZTPool→ 返回{"rc":102,"data":null},需鉴权,通常不可用。 - 东方财富龙虎榜
datacenter-web.eastmoney.com RPT_DAILYBILLBOARD_DETAILS→ 仅历史日有数据,当日返回空。 - 妙想 MCP(
mx-ds-mcp)→ 依赖MX_APIKEY,未配则不可用。 - 通达信 MCP
tdx_screener(自然语言选股,支持"涨停"/"跌停"/"炸板"/"反包")→ 主数据源。 - Wind 金融数据 MCP(
wind-finance,已连接)→ 用于区间涨幅/跌幅前20(同花顺 iFinD 密钥未配时降级至此)。 - 同花顺 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=100message="反包", 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 新增)
- 口径:
封单增减(亿) = 今日收盘封单 − 昨日收盘封单(用户明确要求日环比,非盘中峰值对比)。 - 昨日封单获取:通达信接口不提供历史封单。可用两个来源:
- 读取上一交易日的收盘复盘报告(HTML)——提取其涨停梯队表的"收盘封单(亿)"列(注意:旧版报告该列名为"封单额(亿)";若旧报告仅连板梯队带封单字段,则仅连板股可算)。
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,严禁其它源/硬编码):
tdx_screener(message="涨停", pageSize=200)→ 取每只涨停成交额(万)(单位万元,即推动该票涨停的当日成交额,仅封板期间)。- 总市值(ZSZ) 与 全天成交金额(Amount) 统一用
tdx_quotes(code, setcode, hasCwInfo="1", hasHQInfo="1")单码轮询取数(首选方法):返回ExtInfo.ZSZ(总市值,元)与HQInfo.Amount(当日全天成交金额,元)。多代码仅回首条,须单码逐个轮询(可并行,每批 ~10 只);对全部涨停股(含 ST)算术平均;报告注明含 ST 只数。 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.3.3 修复):题材矩阵必须落在
-
版块十一·龙头股池 + 潜在补涨(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)。- 龙头股池:解析 s1 涨停梯队与 s2 板块分布表,按每个题材主线取连板高度最高(effective_height:连续板取 N,断板续取"几天几板"有效板数)的个股为龙头卡片(含主线名、几天几板、封单、题材、主线涨停只数);≥7 板标 👑龙头 角标。
- 断板反包/续核心:s1 中"断板续"且有效板数 ≥4 的核心高标(曾 4 板之后断板又反包/续),独立卡片组。
- 潜在补涨:读取同目录
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 步):梯队表写完后,必须按序跑完三步,缺一不可:
python scripts/fix_level_labels.py <报告路径>—— 校验/修正 level 列;python scripts/ladder_matrix.py(inject(报告路径))—— 注入 s1 连板梯队矩阵 + s2 题材矩阵;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 逐笔盘口,未配置则如实告知限制。 - 历史封单不可得:通达信选股器不提供昨日/历史封单;"封单增减"仅当能从上一交易日报告取得昨收封单时计算,否则显示 "—"(红线:禁止估算/编造)。
- 昨日报告若仅连板梯队带封单字段,则日环比仅能覆盖"昨日连板且今日续板"的少数标的,如实呈现即可。
Scan to join WeChat group