← Back to skills
extension
Category: Data & AnalyticsAPI key required

同花顺股票二次分析

基于同花顺金融数据(hithink-finance)的 A 股/ETF 二次分析技能。当用户要研究 A 股个股或 ETF(速览卡、财务预测、估值贵便宜、全面分析、基金持仓穿透)、扫描 A 股市场(情绪面/涨停炸板连板、板块轮动、龙虎榜、业绩前瞻日历)、用本地日K回测交易策略、结合板块轮动与情绪与龙虎榜多能力交叉验证选股或复盘历史推荐、或做长期资产配置(定投方案、股债黄金配比、再平衡阈值)时使用。含 13 项能力——DuckDB 回测引擎、个股/ETF 速览卡、财务预测器、估值仪表盘、业绩前瞻日历、市场情绪扫描、板块轮动雷达、股票全面分析、穿透分析、组合风险管理、龙虎榜事件解读、多能力协同选股与推荐复盘、价值投资配置。前置条件是已安装 hithink-finance skill 并配置 API Key。

personAuthor: user_e285fd2ehubcommunity

同花顺股票二次分析(ths-stock-analysis)

概览

本技能是 hithink-finance 的上层二次开发,将同花顺原始行情/财务/估值数据加工为研究视角的分析产物。已落地能力:

| 序号 | 能力 | 资产 | 状态 | |---|------|------|------| | ⭐1 | DuckDB 回测引擎(重点功能):20大经典策略模板回测(10 经典 + 9 短线 + W底)+全策略对比 | scripts/bt_backtest.py + gen_backtest_report.py + strategies.json + references/回测引擎指南.md | ✅ 已实现 | | 2 | 个股/ETF 速览卡(Tearsheet) | scripts/gen_tearsheet_stock.py + gen_tearsheet_etf.py | ✅ 已实现 | | 3 | 财务预测器(三情景+敏感性)【仅个股】 | scripts/gen_forecast.py | ✅ 已实现 | | 4 | 估值仪表盘(历史分位/行业对比)【个股 + ETF 估值版】 | scripts/gen_valuation.py + gen_valuation_etf.py | ✅ 已实现 | | 5 | 业绩前瞻日历(披露高峰+市场期待)【市场级,无单标的版】 | scripts/gen_earnings_calendar.py | ✅ 已实现 | | 6 | 市场情绪面扫描器【市场级,无单标的版】 | scripts/gen_sentiment.py | ✅ 已实现 | | 7 | 板块轮动雷达(动量/信号/资金)【市场级,无单标的版】 | scripts/gen_rotation.py | ✅ 已实现 | | 8 | 股票全面分析(全维透视·单股研究)【仅个股,ETF 指引见正文】 | scripts/gen_comprehensive.py | ✅ 已实现 | | 9 | 穿透分析(基金持仓↔个股抱团)【ETF↔个股双向】 | scripts/gen_penetration.py + gen_penetration_zjky.py | ✅ 已实现 | | 10 | 组合风险管理(相关性/回撤/分散)【多标的组合版,天然含 ETF】 | scripts/gen_portfolio_risk.py | ✅ 已实现 | | 11 | 龙虎榜事件解读【市场级,无单标的版】 | scripts/gen_lhb.py | ✅ 已实现 | | 12 | 多能力协同选股(轮动×情绪×龙虎榜×回测 → 精选 N 股)【编排型:整合 #7/#6/#11/#1,无独立数据源;含 #8 验证关卡 + 推荐复盘】 | scripts/gen_reco_picks.py + scripts/review_picks.py | ✅ 已实现 | | 13 | 价值投资配置(长期配置 / 定投 vs 低价买入判据 / 三档配比)【框架型:不择时、不需频繁更新;首次生成、之后先判有效性、有效即直接返回】 | scripts/gen_value_investing.py + scripts/value_*.py(判定·证据·回测·估值) | ✅ 已实现 |

附加功能(不属于上述 13 个能力):本技能产出的 HTML 报告是自包含的(样式内联、无外部依赖),因此可以把它们搬到自己电脑上、用一个本地 Web 平台逐个点击浏览。完整构建方案(架构决策 / 数据区契约 / 日期门禁 / 验证方法论 / 全部踩过的坑)见 references/构建个人量化平台指南.md。

前置条件(重要)

  1. 必须已安装并配置好 hithink-finance skill(用户级 ~/.workbuddy/skills/hithink-finance/ 或项目级 .workbuddy/skills/hithink-finance/ 均可,WorkBuddy 自动发现),并已配置统一 API Key(%APPDATA%\hithink-finance\credentials.env 或用户级环境变量 HITHINK_FINANCE_API_KEY)。
  2. CLI 可用:hithink-finance --version 有返回值。 ⚠️ 报「找不到 CLI」时先别怀疑环境变量——实测 PATH 与 npm root -g 可能都是对的。 真因通常是 node 版本目录更换导致 npm 全局包丢失(WorkBuddy 每个 node 版本一个目录, 升级时旧目录被删、包跟着没了)。ths_cli.cli_command() 已内置版本无关目录探测 (<node根>/cli-shared/node_modules + versions/current 指针解析 node), 所以多半能自愈;仍失败则用国内镜像重装到 cli-shared(官方源会卡死)—— 完整诊断与修复步骤见 references/CLI与数据坑清单.md 坑 76。
  3. 数据来源铁律(最高优先级):hithink 能取到的一律走 CLI;接口没有的字段宁可用公开披露补齐并显式标注来源,也不编造。所有原始数据必须经 hithink-finance CLI 拉取(JSON 文件 command 字段可证);唯一例外=接口缺失字段(如龙虎榜买卖席位营业部名)→ 用 WebSearch 公开披露补齐,且页面必须显式标注"WebSearch 公开披露"、页脚口径写明,绝不冒充 hithink 数据。
  4. 数据必须交叉验证:接口返回看似合理的数据时,用业务常识校验(次新股上市日期、XD 除息标记、与涨停池/龙虎榜交叉比对)——详见 references/CLI与数据坑清单.md。
  5. 数据新鲜度门禁(开工必做):任何依赖本地 DuckDB 的分析开工前,先把数据更新到最新——本地库滞后会让本地查询缺最近数据(涨跌家数直接为空),被迫转远端 + WebSearch 兜底,费时且口径不一致(2026-09-03 教训:库停 08-21,情绪扫描涨跌家数折腾半天)。执行:
    • 一键:python scripts/ensure_data.py(落后则询问 y 同步 / n 跳过 / q 退出;Agent 非交互默认自动同步)或 --check 仅检查(exit 0=已最新 / 1=落后 / 2=未初始化 / 3=CLI 异常)、--yes 直接同步
    • 手动:db query --sql "SELECT max(date) FROM raw_kline_daily" 查本地最新 → 落后 ≤10 自然日 data sync 增量(约 1-3 分钟)→ >10 自然日全量重拉(坑 24,见 references/CLI与数据坑清单.md)
    • "最新完整交易日" = calendar 中 < 今天的最大日期(当日日K收盘后晚间才发布,盘中勿把当天当目标,坑 23 见 references/CLI与数据坑清单.md)
    • 当日收盘数据可用性快速探测(remote 类当日报告开工前,2026-09-07 实证):index history 拉上证 000001.SH 最近 5 日窗口(--source remote)→ 看 data.item[-1].date_ms 对应日期 == 今天 且 turnover 与近期交易日同量级(如上证 8979 亿 vs 前日 9383 亿)→ 判定当日完整收盘已发布、可开工;收盘后约 1.5h(16:30+)remote 通常已就绪,若仍停在上一交易日 → 如实告知用户"今日数据未发布,暂不做",勿用旧数据顶替(用户 2026-09-07 明确要求"没有数据就先不做")
    • 依赖本地库的能力:#1 回测(DuckDB/parquet)、#6 情绪(涨跌家数)、#7 轮动(板块历史量能)、#10 组合(个股复权K)——回测引擎已内置检查,其余能力用 ensure_data.py 或手动先行更新

通用收尾:构建后自检(做数据版脚本时必跑,2026-09-17 起)

模板是「读 skill 模板 → 正则替换数据区 → 写成 gen_xxx_日期.py → 运行」。这一步的失败几乎都是静默的 (漏 NAME = 前缀、DATE 没换、模板数据区变量没重新定义…),靠记忆和事后 grep 逐个查成本极高。 现把判据固化成脚本,跑一次代替逐条排查:

  • scripts/check_build.py — 构建链路自检器(覆盖坑 28/33/42/44/46/52/53/54/55/56/58/59/60/61 + 63/64/65; 另含 L1 网格填不满、L2 顶部右块整块跳行 / 被 max-width 压扁(都表现为「右半边空」)、 L3 宽表装不进容器(.wrap 内容宽 < 最宽表 min-width → 用户要拉横向进度条)、 H7 补丁空壳(** ** / ():写补丁时反引号被 shell 吃掉)、H8 禁用行话(黑名单 BANNED_JARGON)、 P1 止损 < 入场区下限、 N1 叙述里手抄的当日数字 四类结构/口径检查):

    python "<skill>/scripts/check_build.py" --builder  build_xxx.py                       # 构建器静态检查
    python "<skill>/scripts/check_build.py" --script   gen_xxx_MMDD.py --template "<skill>/scripts/gen_xxx.py" \
           --expect-date 2026-09-17                                                        # 生成脚本
    python "<skill>/scripts/check_build.py" --html     产物.html --hist hist.json --expect-points 252 --expect-date 2026-09-17
    python "<skill>/scripts/check_build.py" --codes    codes.txt                           # 喂 CLI 的参数清单 CRLF(坑 28)
    python "<skill>/scripts/check_build.py" --selftest                                     # 自检:用故意写坏的样本证明检查器有效
    

    退出码 0=全过 / 1=有必须修的(❌) / 2=仅告警(⚠️)。出现 ❌ 必须先修再交付。

  • scripts/ths_indicators.py — 指标与 K 线口径的唯一实现:MA(简单均值) / RSI14(Wilder) / MACD(12,26,9) / 布林 %B(样本 σ,与 SQL stddev_samp 同口径) / 量比(不含当日) / 乖离 + 近一年 = 252 交易日窗口 + K 线双结构解析(本地 date/close 与远端 date_ms/close_price)与 round(2) 落盘;本地库路径运行时解析(HITHINK_DUCKDB → LOCALAPPDATA,禁止写死个人路径)。

  • scripts/report_artifact.py — 产物文件名契约的唯一实现(能力 #6 / #7 / #12 三个渲染器共用;新增渲染器一律接上): 渲染结束后按契约名实测产物在场、非空壳、是 HTML,且 mtime 不早于本轮渲染开始(not_before)。 失败时列出目录里实际有什么,并点出真因(数据区写坏了决定文件名的变量 / 忘了注入 THS_WORKSPACE)。 为什么必须有:模板的输出目录由 THS_WORKSPACE 决定、只改 cwd 无效(2026-09-21 踩过); 且文件名由数据区变量参与拼装(#12 的 N)→ 「subprocess 退出码 0」不等于「产物是对的」。 ⚠️ not_before 那一半不可省:模板落盘名被改掉时,上一轮遗留的同名旧文件会把失败伪装成通过(2026-10-09 实测)。 自检:python scripts/report_artifact.py --selftest(7 项,含 5 个负例)。

  • 日更链路(能力 #12 一键准备) —— 「取数 → 形态扫描 → 板块轮动 → 候选交叉」一条命令跑完,只剩「逐只写 why/risk/plan 叙述」与「渲染选股报告」两件人工步骤:

    • scripts/daily_prep.py --date YYYY-MM-DD [--workspace W] [--no-sync] [--main-kw A,B] — 总编排(同目标日的有效数据默认复用;--force-refetch 强制重取;上游限流致池缺失时用 --only-special 只补那批): ① 数据门禁(本地库 max(date) < 目标日才跑 data sync,且与 API 取数并行,因为 sync 实测 ~150s) → ② 并行取数(5 个当日池/龙虎榜 + 27 条指数历史 + 7 只板块 ETF + 指数快照) → ③ 导出前复权 parquet → ④ 形态扫描 → ⑤ 板块轮动 → ⑥ 候选交叉 → ⑦ 打印交接清单 (市场宽度 / 涨停结构 / 指数快照 / 板块前三 / 主线词 / 候选 Top12,全部算好供叙述直接引用,不要手抄)
    • scripts/sector_pool.py — 权威 26 行业板块池 + 上证基准(唯一来源);报告 featured 板块一律 top_by() 从数据取, 禁止写死板块名(09-21 教训:沿用上一交易日的「半导体/通信设备」当主线,当日实际第一是化学制药)
    • scripts/calc_rotation.py — 26 板块 1/5/20/60 日动量 + 量比 + 20日超额(能力 #7 口径唯一实现)
    • scripts/scan_signals.py — 全市场 W底 / 60日新高 形态扫描(find_w_bottom() 与 bt_backtest.py 同款)
    • scripts/render_sentiment_report.py --date <日> [--data narr.json] [--out <dir>] — 能力 #6 情绪报告渲染器: 数字全自动算(涨跌家数/中位数、涨停/跌停/炸板、封板率、近 5 个交易日涨停家数、板块热度关键词归并、 持续涨停≥3 天、龙虎榜净买 TOP6、指数收盘;交易日窗口按本地交易日历定位、自动跳过休市日); 叙述由 --data 传 JSON(HERO_SUB/DIAG_EXTRA/WEEK_/FOCUS_/PERSIST_INSIGHT/DIAG/SUMMARY/SECTOR_VIEW/SECTOR_TOP), 缺字段时用中性自动文本兜底(页脚标注「自动生成」),脚本永不因缺叙述而失败
    • scripts/render_rotation_report.py --date <日> [--out <dir>] — 轮动报告渲染:featured 板块、ETF 行、 洞察文案全部按当日数据取(今日最强/第二/20日榜首/最大资金池/收绿第一/20日垫底),ETF 无对应对照如实标注
    • scripts/sector_map.py --out-root <output> [--refresh] [--codes A,B] — 个股↔板块映射(90 个同花顺二级行业成分股, 缓存 <output>/sector_members.json,覆盖率 100%、每股唯一归属一个行业;--refresh 季度重取。 ⚠️ 缓存与板块池不一致时会自动重建(否则静默退化,见坑 71)
    • scripts/pick_facts.py --date <日> --codes A,B --dir <reco_MMDD> --out-root <output> — 候选事实卡: 一次给出「短线技术指标(import ths_indicators)+ 估值/中报(CLI 批量+并行)+ 当日池/龙虎证据」,写 why/risk/plan 直接用。 ⚠️ 可分批调用、结果按日合并(2026-10-04 起):同日多次跑会与已有 facts_MMDD.json 合并,不会覆盖 —— 早期是覆盖写,补跑候选会把前一批静默抹掉(终端表格照常打印,看着正常)
    • scripts/value_investing.py [--status|--force|--selftest] — 能力 #13 的有效性判定 + 缓存 + 渲染: 默认「先判有效 → 有效直接返回、失效/首次才重算」;--status 只看状态;--force 强制重算; 缓存 <工作区>/.workbuddy/output/value_investing/config.json(生成日/有效期/5 个锚点基准值)。 ⚠️ ANCHORS 必须与 gen_value_investing.py 的 ANCHOR_TEXT 一致(v5 去掉美元债QDII)
    • scripts/gen_value_investing.py — 能力 #13 的 HTML 模板(v8:4 区块 6 表,由 v7 的 8 区块 13 表精简 42% 体积): 01 执行总表(6 列:资产·操作方式 / 场外基金代码 / 三档占比 / 怎么投 / 怎么撤 / 现在该怎么做, 最后一列直接给动作:分批建仓·照常定投·一次性配足·本月不投·先留足;表下附「月结余 10,000 元」的金额换算示例; 紧接「现在贵不贵」估值表与再平衡铁律)/ 02 判据与证据(判据卡 + 跨资产同窗口对比 + 定投期限胜率 + 回测 + 逐年)/ 03 三个指标怎么看 / 04 理论依据与回避清单。 ⚠️ 单一数据源:配比只在 ALLOC 定义,执行总表的占比列由它生成; MAIN 的资产名必须与 ALLOC 一致(build() 有断言),value_backtest.py / value_investing.py 都读 ALLOC。 ⚠️ 不要写「去哪儿查」类教程(用户明确不要);估值要给当前值 + 历史分位 + 当下结论,并标注来源与日期。 ⚠️ 基金代码须联网核实后才能写(不许臆造),并注明核实日期。 ℹ️ 禁用行话(如「腿 / 一腿」)与页面宽度已由 check_build.py 机械校验 —— 分别是 H8(黑名单在 check_build.BANNED_JARGON)与 L3(.wrap 内容宽 ≥ 最宽表 min-width), 不必记规则,跑一次 --html 即知。本能力当前宽度 1200px(其余 15 个模板仍 960px,用户明确说不改)。
    • scripts/value_evidence.py [--selftest] [--compare-years N] — 能力 #13 的实测证据计算(可复现): 并列输出 5 种口径(A 等权每日再平衡 / B 等权月度再平衡 / C 等权买入持有 / D 个股收益分布 / E 官方指数), 含滚动持有与月度定投的胜率·IRR;--compare-years N 另出「同窗口跨资产对比」表(指数 + QDII ETF 混排)。 产物落 <工作区>/.workbuddy/output/value_hist/evidence.json。 ⚠️ 口径差异必须随结论一起讲(坑 75:A 口径含波动收割,比 C 高约 +4.9pct/年,不是可交易收益); ⚠️ 取数留 40 天窗口边距(SAFE_MARGIN_DAYS,坑 74:贴边 1826 天也返回空)
    • scripts/value_valuation_check.py [--fund|--top|--selftest] — 能力 #13 的「基金估值/股息率速查」: 取标的 ETF 的前十大重仓 + 权重(fund holdings,接口只给 top10)→ 批量取 PE(TTM)/PB(MRQ)(valuation snapshot;接口无股息率字段)→ 股息率用「近 12 个月前复权收益 − 未复权收益」反推(本地库 v_daily_qfq vs v_daily)→ 按权重归一加权 (PE 用调和平均,避免极低 PE 被拉偏)。 ✅ 已用已知标的校验:中国神华 6.11% / 工商银行 4.64% / 五粮液 3.35%(与实际相符)。 ⚠️ 这个口径是「已实现分红回报」,≠「分红 ÷ 现价」的预期股息率,两者都要看、别混用; ⚠️ 只有前 10 大重仓 → 是「重仓部分」口径;分位算不出(接口无指数估值历史)→ 须看中证指数官网/支付宝「指数红绿灯」
    • scripts/value_backtest.py [--all|--forward|--bond|--selftest] — 能力 #13 的组合历史回测: 权重直接读 gen_value_investing.py 的 ALLOC(不另写一份,避免双份数据漂移), 每日盯市 + 定期再平衡(D/M/Q/Y/N)+ 单边成本(--cost-bps,默认 10bp)。 输出累计/年化/最大回撤/波动/夏普/逐年/滚动 12 个月/换手率 + 各标的单独表现。 --all 出三档 × 四频率敏感度;--bond 换债券腿做敏感性;--forward 出前瞻中枢(加权算术,非预测)。 ⚠️ 数据源同 value_evidence:接口窗口硬上限 ~5 年(本地库无 ETF)→ 样本只有一轮市场环境,不可外推; ⚠️ ETF 未复权(分红被除权剔除)→ 系统性低估;❌ 现金腿不要用 511990 华宝添益(价格恒 100、收益走分红,序列收益恒 0), 用 511880 银华日利(净值随收益累积)
    • scripts/render_picks_report.py --date <日> --data <数据区文件> — 选股报告渲染:把数据区注入 gen_reco_picks.py, 注入前校验(DATE 一致 / STOCKS 存在 / TPL 要求的变量齐全 / N 必须等于 len(STOCKS))并自动跑 check_build --script 自检,通过后才渲染;渲染后再由 report_artifact.expect() 校验产物契约
    • scripts/cross_evidence.py — 形态 × (涨停池 / 龙虎榜 / 当日主线) 交叉取证;主线词由当日数据自动推导 (涨停热词 + 轮动强势板块名,并可 --main-kw 追加),避免每天手写/沿用旧主线
  • scripts/ths_cli.py — CLI 调用与并行取数助手(唯一实现,各脚本不要再各写一份 subprocess):cli_command() 运行时定位 CLI(env HITHINK_CLI → PATH → node_modules,不写死个人路径)、run(args) 单次调用(失败转 {"ok": false} 不抛异常)、run_many(arg_lists, workers=8) 并行(与输入同序、单项失败隔离)、duckdb_path() 解析本地库路径。自检:python scripts/ths_cli.py --selftest(实测并行加速比 + 命令名正/负例 + 稳定启动器 CRLF/ASCII)。 另含 SKILL_COMMANDS + verify_commands():拿 hithink-finance capabilities(104 条机器可读命令路径) 逐条校验本技能用到的命令路径;新增 CLI 调用后把路径加进 SKILL_COMMANDS 即可。 另含 _explain_unknown_command():任何调用(含临时探测脚本)写错命令名时, 报错里直接给「可用命令组 + 本技能别名指向」(如 lhb → special dragon-tiger)。 ⚠️ 注意区分:技能脚本一直是对的(daily_prep.py 自 2026-09-22 起就用对 special dragon-tiger); 踩坑的是"凭记忆手打命令名"的临时探测 —— 见坑 77①。 ⚠️ ≥3 个独立 CLI 调用必须并行:单次调用固定开销 ~1.2s,27 条指数历史串行 41.9s → 并行 12.4s(坑 68)。 另含当日市场口径:market_breadth(target)(涨跌家数/中位/均值,口径=收盘 vs 前收)与 limitup_pool_stats(json)(涨停家数/连板分布/热词 TOP,口径=交易所涨停池)—— 报告叙述里的当日数字一律从这里取,禁止手抄(坑 63/64)。 短线/口径类脚本一律 import 它,别再各写一遍(口径见 references/CLI与数据坑清单.md 坑 35/61)。

能力 #1:DuckDB 回测引擎(已实现 · 重点功能)

回答"这个策略历史赚钱吗?"——用本地 DuckDB 前复权日K对用户定义的交易策略做事件驱动回测。

资产:

  • scripts/bt_backtest.py — 回测引擎 v3.6(策略模板引擎:读同目录 strategies.json 定义,SQL 一次预计算 MA/RSI/布林/唐奇安/新高低/连板/KDJ/MACD/乖离/连阳等全部指标,按 buy_signal/sell_signal 分派信号;--strategy <id> 跑单个 / --all 批量 / --universe <thscode,...> 限定标的池 / --parquet <path> 自定义数据源(ETF/指数,默认 A 股 bt_qfq_1y.parquet)/ --force 跳过数据检查;内置数据就绪检查(交互式):启动即检测 DuckDB 本地库是否初始化 + 回测数据最新交易日是否 ≤30 天,不满足打印初始化/更新方法并询问用户是否先更新数据(y=更新后重跑 / n=跳过继续 / q=退出,非交互默认退出);v3.6 起自动加载/生成股票名称映射回填 trades.name;输出 bt_result_{id}.json + bt_all.json)
  • scripts/strategies.json — 20 大策略定义(五要素 + 信号 + 参数:10 经典 + 9 大短线策略 + 形态反转 W底双底突破);这是策略定义的唯一来源,引擎/报告生成器按脚本同目录读取
  • scripts/gen_backtest_report.py — 报告 HTML 生成器 v3.2(--strategy <id> / --out <dir> 指定报告输出目录;交易明细含选股日/买入日/卖出日/触发日/股票名称/候选数/当前资金列,05 卖出原因分布,06 区块为 20 策略横向对比表,07 优化与风险;每策略专家分析文案在 ANALYSIS 字典,新增 9 策略文案齐全;输出文件名自动净化 Windows 非法字符)
  • examples/10策略回测/ — 经典策略定义文档 + 20 份完整回测报告 HTML(2026-08-21 版:10 经典 + 9 短线 + W底双底突破),展示模板成品形态

✅ 路径约定(v3.5 起):策略定义 = 脚本同目录 scripts/strategies.json(永远以 skill 内版本为准,工作区不再需要副本);数据与产物 = <工作区>/.workbuddy/output/(自动创建)。 运行规范:直接用 skill 里的脚本跑,不要复制脚本到工作区再跑——优先保证 skill 正确。 THS_WORKSPACE="<工作区>" python "<skill>/scripts/bt_backtest.py" --all(未设 THS_WORKSPACE 时 = 当前运行目录) 两个脚本启动时都会打印实际读取的策略定义路径与个数,便于确认。自定义策略文件可用 THS_STRATEGIES 覆盖。

功能亮点(重点介绍):

  1. 策略模板化:strategies.json 中定义一个策略仅需五要素(买入时机/买入仓位/卖出时机/卖出仓位/选股条件)+ 信号 ID(buy_signal/sell_signal),引擎自动执行回测并渲染完整报告;自定义策略只需新增条目或扩展信号函数
  2. 内置 20 大经典策略开箱即用:趋势跟随(双均线金叉/MA20放量突破/海龟唐奇安/布林突破)、超跌反转(RSI超卖/60日新低)、动量追涨(120日新高/均线多头回踩)、打板博弈(涨停低吸/二连板接力)、形态反转(W底双底突破)、9 大短线策略(2026-09-10 新增):KDJ 低位金叉 / MACD 零轴下金叉 / 向上跳空缺口放量 / 缩量回踩 MA5-MA10 / 强势股首阴低吸 / 均线粘合向上突破 / 放量连续阳线接力 / 强势股缩量回踩 MA20 / 涨停基因缩量回踩——--all 一键批量回测(20 策略 ≈45 秒)
  3. 全指标 SQL 预计算:MA5/10/20/60、RSI14、布林±2σ、唐奇安通道、60/120日新高低、量比、连板 streak、KDJ(9,3,3)、MACD(12,26,9) 真 EMA、乖离 bias20、连阳 cnt_up、振幅 amp5、前后状态 LAG 列一次算齐,Python 端仅做信号分派与事件循环(132 万行 × 20 策略 ≈ 45 秒)
  4. 交易明细完全透明:每笔交易含 选股日/买入日/卖出日/触发日/股票名称/买价/卖价/收益/持有天数/当日候选数/当前资金(100万滚动)/卖出原因 13 列;卖出日=信号触发日次日开盘成交口径显式标注(策略定义如此,非延迟执行)
  5. 候选选择规则(用户可配置):当日满足买入信号的股票常达数十上百只(海龟平均 245 只/日、RSI 超卖 821 只/日)——回测前提示用户选择候选排序规则,默认取「当日成交额最大」1 只(热度代理 [ASSUMED]);用户可选择默认,或自定义规则(如换手率最高/龙虎榜净买最强/自定义打分公式,改 bt_backtest.py 选股处即可)
  6. 20 策略横向对比:每份报告 06 区块自动展示全部策略排名表(bt_all.json 驱动、按总收益排序、当前策略 ★ 高亮),任何单策略报告都带全市场视角
  7. 双口径收益:总收益含期末未平仓浮动(标准回测口径)+ 每笔平仓后 equity(落袋口径)并列展示
  8. 视觉统一:浅色金融仪表盘、深蓝#1f3a93+金#c9a227、红涨绿跌、insight 金色结论条——与其余 11 项能力完全一致
  9. 数据就绪检查(防坑前置·交互式):回测启动即自动检查 ①DuckDB 本地库是否初始化 ②回测数据最新交易日是否在一个月内——不满足则打印初始化/更新方法(data init 全量重拉 / data status 查落后 / data sync 增量),并询问用户「是否先更新数据再回测?」(y=去更新 / n=跳过检查继续 / q=退出,非交互环境默认退出);确需强制用旧数据可 --force
  10. ⚠️ 稳健性检验(坑 40,必做):单标的满仓 + 短样本期极易产出"单笔驱动"的假优势——strong_pullback_ma20 表面 +161.2% 排第 1,剔除单笔 +143.41% 后仅 +0.8%、中位数 -1.05%。任何策略排名必须先算「剔除最大单笔/前 3 大单笔」后的收益并在报告显式标注,不得只看总收益下结论

⚠️ 策略五要素确认(强制,回测前必做):回测引擎执行前,必须先确认用户策略包含以下五项,缺任何一项 → 明确提示用户补充,不得擅自假设:

  1. 买入时机:何时买(如"次日开盘 ≥ 昨收 -3% 买入")
  2. 买入仓位:买多少(满仓/半仓/分批,单笔比例)
  3. 卖出时机:何时卖(止盈/止损/持有天数规则,如"当日收阴第 3 天开盘卖""单日跌超 7% 止损")
  4. 卖出仓位:卖多少(清仓/分批)
  5. 选股/筛选条件:买什么(连板数/均线形态/板块强势/热度等过滤) 五要素映射到 bt_backtest.py 的 CFG:买入时机=buy_signal+gap_threshold、买入仓位=仓位规则、卖出时机=sell_signal+stop_single+stop_consec_sum、卖出仓位=清仓比例、选股条件=strategies.json 的 buy_signal 参数。 自定义策略时按 assets/自定义策略五要素模板.json 逐项填写,追加到 skill 内 scripts/strategies.json(唯一来源,与脚本同目录)。

执行工作流:

  1. 数据就绪检查(引擎自动,无需手动):运行 bt_backtest.py 时引擎自动检测 ①DuckDB 本地库是否初始化(market.duckdb 存在)②回测数据 bt_qfq_1y.parquet 是否存在 ③最新交易日是否 ≤30 天——不满足打印完整方法后交互式询问「是否先更新数据再回测?」(y=更新后重跑 / n=跳过检查继续 / q=退出):
    • 未初始化 → 同花顺开放平台签预签名 URL 下载 daily-k+adjustment-factors → hithink-finance data init --kline <文件> --events <文件> → data status 验证
    • 数据过期 → hithink-finance data status 查落后天数 → ≤7 交易日 data sync 增量 / >7 交易日全量重拉(同 init 流程)→ 重新导出 bt_qfq_1y.parquet(db export --sql "SELECT ... FROM v_daily_qfq WHERE date>=..." --output bt_qfq_1y.parquet --file-format parquet,回测窗口最近一年+前 120 日预热)
    • 选 y → 提示按方法更新后重跑;选 n → 警告后继续回测;选 q 或非交互环境(无 TTY)→ 退出
    • 确需强制使用当前数据 → 加 --force 参数(跳过交互直接继续,结果可能基于缺失/过期数据,慎用)
  2. 五要素确认(见上,缺项先问用户)。
  3. 策略定义:自定义策略 → 在 skill 内 scripts/strategies.json(唯一来源)新增条目(buy_signal/sell_signal 从引擎支持的信号表选,或加新信号函数);经典策略直接用内置 20 个(10 经典 + 9 短线 + W底)。
  4. 跑回测:THS_WORKSPACE="<工作区>" python "<skill>/scripts/bt_backtest.py" --strategy <id>(或 --all;直接用 skill 里的脚本,不要复制到工作区)→ 输出 bt_result_{id}.json(总收益含期末未平仓浮动,equity=每笔平仓后资金)+ bt_all.json 到 <工作区>/.workbuddy/output/。
  5. 名称映射(v3.6 起引擎自动,无需手动):本地 v_symbol.name 全为 NULL → bt_backtest.py 启动时自动加载 <工作区>/.workbuddy/output/bt_name_map.json(thscode→name)回填每笔交易 name 字段;文件缺失时自动调 hithink-finance symbol list --asset-type a-share --exchange SH,SZ,BJ --limit 10000 --output <path> 生成,失败则告警回退代码。启动打印 名称映射: <路径>(N 条)。

    ⚠️ 若明细「股票」列左右都是代码(曾复发)→ 说明 name 未回填:跑一次 bt_backtest.py(会自动重建映射)再 gen_backtest_report.py。报告侧已有兜底:缺名称时渲染「代码 + 金色待补名称」并控制台告警,不再重复显示两遍代码。

  6. 渲染报告:python "<skill>/scripts/gen_backtest_report.py" --strategy <id> → 输出 DuckDB回测引擎_{策略名}_{YYYYMMDD}.html(默认到工作区根目录,--out <dir> 可改;每策略独立报告,06 区含全策略对比)。
  7. 校验:区块编号 01-07 唯一、交易明细列齐全(卖出日/触发日/名称/当前资金/候选)、无占位符残留、06 对比表当前策略 ★ 高亮、配色正红负绿(A股惯例)。

关键口径:涨停=前复权相邻日收益率(主板 +9.8%/创业板科创板 +19.8%);连板 streak=非涨停日分组+组内行号-1;RSI14=SMA 均值口径 [ASSUMED];布林=MA20±2σ(stddev_samp);唐奇安=前 20 日最高/前 10 日最低(不含当日);KDJ(9,3,3)=SMA 平滑口径 [ASSUMED];MACD(12,26,9)=真 EMA 递推;乖离 bias20=close/MA20-1;连阳 cnt_up=截至当日连续收阳天数;板块强势=市场情绪代理(涨停≥20 家且上涨占比>50% [ASSUMED]);热度=成交额代理 [ASSUMED];候选选择=当日满足买入信号的全部股票中选当日成交额最大 1 只(20 策略实测:海龟平均 245 只/日、RSI 超卖 821 只/日、二连板仅 6 只/日);卖出日=信号触发日(跌超/死叉/破位/止盈/到期)的下一交易日,按开盘价成交(trades 含 signal_date 触发日 + cand_cnt 候选数两字段,报告明细列展示);开盘价成交、满仓单标的、单边 0.03% 费率(印花税未含);当前资金=初始 100 万按每笔清仓滚动累计;总收益/收益率配色=正红负绿(曾写反,用户纠正)。

已实测结论(20 大策略,2025-08-22~2026-08-21,同期沪深300 +17.1%):

| 排名 | 策略 | 总收益 | 胜率 | 盈亏比 | 回撤 | |---|---|---|---|---|---| | 1 | ⚠️ 强势股缩量回踩 MA20 | +161.2% | 42.9% | 3.84 | -31.9% | | 2 | 海龟唐奇安通道突破 | +79.0% | 28.6% | 5.55 | -43.2% | | 3 | W底双底突破 | +76.3% | 42.9% | 3.34 | -23.1% | | 4 | KDJ 低位金叉 | +9.1% | 38.1% | 1.95 | -41.2% | | 5 | RSI 超卖反转 | -1.7% | 58.3% | 0.76 | -37.1% | | 6 | 涨停基因缩量回踩 | -3.1% | 33.3% | 2.20 | -44.7% | | 7 | MACD 零轴下金叉 | -9.5% | 33.3% | 2.08 | -46.8% | | 8 | 均线粘合向上突破 | -18.1% | 31.2% | 1.69 | -48.2% | | 9 | 二连板打板接力 | -18.8% | 26.9% | 3.10 | -61.4% | | 10 | 120日新高强势追涨 | -19.7% | 44.4% | 1.19 | -48.0% | | 11 | 向上跳空缺口放量 | -24.1% | 34.0% | 2.00 | -55.1% | | 12 | 布林带突破 | -27.1% | 21.1% | 3.29 | -42.2% | | 13 | 强势股首阴低吸 | -31.4% | 30.4% | 2.13 | -61.4% | | 14 | MA20 放量突破 | -34.9% | 24.0% | 2.01 | -39.6% | | 15 | 缩量回踩 MA5/MA10 | -38.2% | 27.3% | 2.04 | -69.0% | | 16 | 放量连续阳线接力 | -39.3% | 30.0% | 1.83 | -63.0% | | 17 | 均线多头回踩 | -51.5% | 34.2% | 1.06 | -72.2% | | 18 | 60日新低超跌反弹 | -54.3% | 42.4% | 0.55 | -56.7% | | 19 | 双均线金叉趋势跟随 | -54.4% | 22.2% | 1.43 | -61.7% | | 20 | 涨停次日低吸 | -66.3% | 37.0% | 1.02 | -75.0% |

⚠️ 排名第 1 是假优势(坑 40,务必同读):强势股缩量回踩 MA20 的 +161.2% 中,单笔贡献 +143.41%(688820.SH,2026-04-29 买入、16 个交易日 +143%、92.5→229 元含多板);剔除该笔后仅 +0.8%,35 笔中位数单笔 -1.05%、平均 +4.41% 全由极值拉动。结论:真正有效的只有海龟 +79.0% 与 W底 +76.3%(均为"等突破确认后右侧买入");看排名必须同时看收益集中度。

核心发现:①20 策略真正有效的仅 2 个(海龟/W底,均属"突破确认后右侧买入"),第 1 名经稳健性检验不成立——"追强"(20 日新高突破+宽容离场)完胜抄底/打板/均线交叉;②胜率与盈亏比不可兼得但盈亏比才是盈利关键(RSI 胜率 58.3% 最高却打平 vs 海龟胜率 28.6% 大赚);③抄底策略全军覆没(弱市"超卖可以更超卖":RSI -1.7%、60日新低 -54.3%、MACD零轴下金叉 -9.5%);④打板派追板(-18.8%)优于低吸(-66.3%),但**"买回踩不买涨停"成立**——涨停基因缩量回踩 -3.1% 是打板家族最优;⑤离场规则比入场信号更重要(紧离场系统性误杀,海龟 -10% 止损 + 10 日通道离场最优);⑥连板高度敏感性:二连板 -18.8% vs 三连板 -83.57%(越高越差);⑦W底双底突破:+76.3%、回撤 -23.1% 全场最优——唯一跑赢的底部类策略,"等突破确认再买"完胜左侧抄底;⑧9 个新增短线策略中 8 个负收益——仅 KDJ 低位金叉 +9.1%(但集中度高、剔除最大笔转负);"回踩系"整体弱于"突破系"(缩量回踩 -38.2%、均线多头回踩 -51.5%、首阴低吸 -31.4% vs 海龟 +79.0%、W底 +76.3%)。

ETF 回测(2026-09-02 实测,红利质量ETF华夏 159758.SZ):

  • 本地 parquet 无 ETF(v_daily_qfq 仅 A 股 60/00/30/68/92)→ ETF 数据走 fund history(远端结构 data.item[]+date_ms/open_price/close_price/volume/turnover)→ 转本地格式 parquet(thscode/date/open/high/low/close/volume/amount,amount=turnover 元)→ --parquet <etf文件> --universe <代码> --tag <名> 回测
  • 基准对比用 ETF 自身区间收益(如红利质量ETF华夏 2025-08-22~2026-08-21 买入持有 +3.9%、回撤 -11.4%),不是沪深300(A 股基准口径仅适用股票池)
  • 打板类策略在 ETF 上 0 笔(ETF 无涨停/连板概念)——streak_2/limit_low_open 不适用属正常;趋势/形态/反转类适用
  • 实测结论:双均线金叉 +8.0%(6 笔/胜率 50%/盈亏比 3.18/回撤 -4.4%)最优——低波动慢牛品种低频择时完胜高频突破(金叉抓主升、死叉躲回调,回撤 -4.4% vs 买入持有 -11.4%);布林 -9.9%/回踩 -3.5% 等高频磨损最差;11 策略全榜见报告 06 区

能力 #2:个股/ETF 速览卡 Tearsheet(已实现)

触发场景:用户说"生成 XX 的速览卡/一页纸/汇总"、"XX 这只股票怎么样"(需要完整研究卡片时)。

资产:

  • scripts/gen_tearsheet_stock.py — A 股个股速览卡生成器(模板)
  • scripts/gen_tearsheet_etf.py — ETF 速览卡生成器(模板)

执行工作流(个股):

  1. 消歧:hithink-finance symbol search --q "<名称或代码>" --format json 确认 thscode(注意同名多标的、旧代码误认——如"航天发展"实为 000547.SZ 而非 600677,必要时 WebSearch 验证)。
  2. 取数(按需并行,均为远端接口):
    • 行情:market snapshot --thscodes <code>
    • 估值:valuation snapshot --thscodes <code>(PE/PB/PS/PCF)
    • 财务指标:financials indicators --thscode <code> --report <期>(先 financials income --period quarterly --limit 2 判断最新报告期)
    • 利润表:financials income --period annual --limit 5 + --period quarterly --limit 3
    • 资产负债表:financials balance-sheet --period quarterly --limit 1
    • 现金流量:financials cash-flow --period annual --limit 3
    • 分红:market corporate-actions --thscode <code>
    • 历史K(近1年前复权,走本地库):market history --thscode <code> --start-ms <近1年> --end-ms <今天> --adjust forward --output <path>
  3. 查证主营与简介:用 WebSearch 查公司年报/官网口径,填入 CONFIG["biz"] 与 CONFIG["intro"]。
  4. 填模板:编辑 gen_tearsheet_stock.py 的 CONFIG 与数据字典(SNAP/VAL/IND/INC_Y/BS/CF/DIVS/RPT/FY25),并更新 HIST 指向历史K文件。
  5. 渲染:运行脚本 → 输出 {公司名}_{YYYYMMDD}.html → 校验关键数据 → present_files 展示。

执行工作流(ETF):数据走 fund.* 接口(fund snapshot / fund returns / fund profile / fund holdings / fund dividends / fund history),填 gen_tearsheet_etf.py 对应字典。

能力 #3:财务预测器(已实现 · 适用对象:仅 A 股个股)

触发场景:用户说"XX 未来 3 年营收/利润会怎样"、"财务预测"、"预测 XX 业绩"。

资产:scripts/gen_forecast.py — 财务预测器 HTML 生成器(模板,带 2026-08-21 亨通光电示例数据)

ETF 不适用原因:预测依赖财报历史(营收/归母/毛利率/ROE),ETF 无单标的财报——无 [MISSING] 替代,跳过不强做。

分析框架(专家六维 → 六大区块): 01 预测综述(判定徽章 + 五维结论)→ 02 历史业绩回顾(5年营收/归母柱状图+增速表)→ 03 成长驱动与假设(4 驱动卡)→ 04 未来 3 年预测(三情景分组柱状图+假设表)→ 05 敏感性分析(2028E 营收×净利率 3×3 矩阵)+ 券商预测对照 → 06 风险提示

执行工作流:

  1. 历史报表:financials income --period annual --limit 5(近5年营收/归母/EPS,注意返回为倒序且无 yoy 字段需自算)+ --period quarterly --limit 3(最新季度判断拐点)+ financials indicators(毛利率/ROE/增速)。
  2. WebSearch 驱动与券商预测:行业驱动(订单/产能/价格)+ 券商一致预期与分机构预测(高盛/中信/建投/大摩等)→ 作为三情景锚点;页脚标注来源(数据来源铁律)。
  3. 三情景模型([MODEL]/[ASSUMED]):乐观/中性/悲观各设 2026-2028 营收与归母;中性贴近券商区间中枢(一致预期含激进机构时明确提示参考中枢而非均值,如亨通一致预期 79 亿 vs 分机构 40-50 亿)。
  4. 敏感性矩阵:以 T+2 年为基准,营收(悲观/中性/乐观)× 净利率(悲观/中性/乐观)3×3 归母净利区间。
  5. 填模板:替换 BASE/DATE/WEEKDAY + 数据区(CFG/HIST_YEARS/SCENARIOS/SENS/DRIVERS/BROKERS/RISK/SUMMARY/NOTE)。
  6. 渲染与校验:运行 → 财务预测器_{名称}_{YYYYMMDD}.html → 校验数值 + 区块编号 01-06 + grep 旧标的名 → present_files。

关键口径:预测全部标 [MODEL]/[ASSUMED](模型输出非公司指引);券商数据来源显式标注;三情景差值大(差 50-100%+)属正常,用敏感性区间表达不确定性而非单点预测。

能力 #4:估值仪表盘(已实现 · 适用对象:A 股个股 + ETF 估值版)

触发场景:用户说"XX 贵还是便宜"、"估值仪表盘"、"分析 XX 的 PE/PB 历史分位"。

资产:scripts/gen_valuation.py — 估值仪表盘 HTML 生成器(模板,带 2026-08-21 紫金矿业示例数据)

分析框架(专家五维 → 五大区块): 01 估值判定(贵/中性/便宜徽章 + 五维综述)→ 02 历史分位(PE/PB 5年折线图带均值/中位/当前值 + 5年/3年/1年三窗口分位判定条)→ 03 行业对比(PE 蓝 / PB 绿双条形图,目标股金色高亮 + 行业中位线 + 解读)→ 04 估值锚点(近4年业绩 + 券商一致预期 forward PE)→ 05 风险提示

执行工作流:

  1. 确认 A 股标的:symbol search 消歧;hithink 估值/行情接口仅支持 A 股(港股/美股不可用,如实告知)。
  2. 取数(并行):
    • 当前估值:valuation snapshot --thscodes <code>(PE_TTM/PB/PS/PCF)
    • 行情:market snapshot(价格/涨跌幅;无市值字段,回溯法不需要股本)
    • 历史K(5年前复权,本地库):market history --start-ms <5年前> --end-ms <今天> --adjust forward
    • 行业可比:valuation snapshot 批量 6 家同行(按标的主营选同行:如电网设备/黄金铜业)
    • 财务锚点:financials income --period annual --limit 4(近4年营收/归母/EPS)+ financials indicators(最新ROE/毛利率/增速)
  3. 计算历史分位(回溯法,接口无历史估值):历史PE_i = 当前PE_TTM × (前复权收盘_i / 当前收盘),算 5年/3年/1年窗口的当前值百分位 + 均值/中位/区间。
  4. WebSearch 补动态估值:券商一致预期归母净利与目标价(forward PE)→ 填 FC;页面页脚标注来源(数据来源铁律)。
  5. 填模板:替换 BASE/DATE/WEEKDAY/HIST + 数据区(CFG/PERC/INDUSTRY/IND_MED/EARN/H1/FC/RISK/SUMMARY/NOTE/PE_NOTE/PB_NOTE/IND_NOTE/FC_NOTE)。
  6. 渲染与校验:运行 → 估值仪表盘_{名称}_{YYYYMMDD}.html → 校验数值 + 区块编号 01-05 + grep 旧标的名清理残留(模板已参数化,insight 全部在数据区)→ present_files。

关键口径:判定=历史分位 + 行业对比 + 动态 forward PE 三视角综合(如紫金"结构分化":5年96%分位 vs PE 仅行业 6 成);盈利高增股(净利 5 年翻倍+)回溯法按当前 TTM 净利会低估历史 PE,页脚/风险区必须注明;回溯口径统一标 [ASSUMED]。

ETF 估值版(2026-09-03 新增,scripts/gen_valuation_etf.py)——"这只 ETF 贵不贵?"核心=跟踪指数的估值分位:

  • 数据链路:① hithink CLI:fund snapshot(现价/涨跌/换手/成交额)+ fund profile(规模/费率/经理/单位净值)+ fund history --thscode <代码> --source remote(净值历史 → 区间收益/走势图;无 --fund-type)② 跟踪指数识别:fund profile 无跟踪指数字段 → WebSearch"<基金名> 跟踪指数 代码"(159758 → 中证红利质量 931468.CSI)③ 指数估值分位=WebSearch 公开指数估值源(hithink valuation 仅 A 股个股、ETF 报 FUYAO_3001;index 接口正则白名单仅 SH/SZ/BJ/TI,不覆盖中证指数 931468.CSI)——乌龟量化/A股行情指标表(cs931468)/中证官网/理杏仁多源交叉,多源有差异取主源+辅助源并标注 ④ 10Y 国债收益率 WebSearch(如 1.70%)→ 股息率利差 = 指数股息率 − 国债收益率(红利类 ETF 核心安全垫锚)⑤ 折溢价估算 = (现价−单位净值)/单位净值 [ASSUMED](非 IOPV)
  • 五大区块:01 估值判定(徽章+五维综述)→ 02 跟踪指数估值分位(PE/PB 10年/5年/3年三分位刻度条 + 判定条)→ 03 股息率利差(指数股息率 vs 10Y 国债 vs 利差 + 安全垫解读)→ 04 ETF 交易面与档案(净值走势 + 区间收益/规模/费率/折溢价)→ 05 风险提示
  • 页面铁律:src-banner/页脚显式提示"同花顺数据不含 ETF/指数估值接口——PE/PB 及分位为公开指数估值源,标注来源与时点";指数发布年数 < 分位窗口(如 931468 发布 2020-05 约 6 年,"10 年分位"为公开源外推口径)标 [ASSUMED];多源数值不同属正常(时点/口径差异)页脚全列
  • 执行:填 BASE/DATE/HIST 与数据区(CFG/IDX/DIV/SNAP/RET/RISK/SUMMARY/NOTE + PE_NOTE/PB_NOTE/DIV_NOTE)→ 运行 → ETF估值仪表盘_{名称}_{YYYYMMDD}.html → 校验编号 01-05 + grep 旧标的名/旧指数名清理残留
  • 已实测(红利质量ETF华夏 159758.SZ,2026-09-03):指数 PE_TTM 16.24、10年分位 21.5%/5年 24.2%/3年 36.0%、近1年股息率 3.06%、10Y 国债 1.70%、利差 1.36pct → 判定"合理(红利中枢偏下)";examples/估值仪表盘/ 有 ETF+个股共 4 份成品示范

能力 #5:业绩前瞻日历(已实现 · 适用对象:市场级,无单标的版)

触发场景:用户说"未来两周谁要发财报"、"业绩前瞻日历"、"市场在期待什么"。

资产:scripts/gen_earnings_calendar.py — 业绩前瞻日历 HTML 生成器(模板,带 2026-08-24~09-04 中报冲刺期示例)

ETF 不适用原因:披露节奏本质是成分股公司的事件日历,ETF 自身无财报披露——市场级能力,无单只 ETF 的"业绩前瞻"语义,跳过不强做(需要时用速览卡 #2 覆盖基金档案即可)。

分析框架(专家六维 → 六大区块): 01 披露日历总览(逐日披露量条形图 + 五维综述)→ 02 未来两周重点披露(业绩预告 + 盲盒权重表)→ 03 市场在期待什么(三主线:已披露参照 → 待披露看点)→ 04 万亿"盲盒"权重清单(+估值快照)→ 05 财报周策略提示(券商观点+节奏)→ 06 风险提示

执行工作流:

  1. 确认窗口:当前日期 → 未来两周(10 个交易日);market calendar 仅返回一年窗口(2025-08~2026-08),窗口在一年内可核对,超出则按 A 股默认交易日推算(8-31 中报截止等规则日历)。
  2. 披露安排(WebSearch,hithink 无披露日历接口):搜"<年份>年 <月> <日>至<日> 中报/财报 披露时间表 重点公司 业绩预告"→ 获取逐日披露量分布、重点公司披露日、业绩预告区间;页脚显式标注来源(交易所预约+新闻报道,数据来源铁律)。
  3. 重点股估值:valuation snapshot 批量拉盲盒权重/重点预告股 PE/PB(hithink)。
  4. 市场期待分析:已披露龙头(工业富联+96%/江波龙+715倍/平安 1075 亿等)→ 待披露看点(中际旭创/长鑫科技等)三主线梳理。
  5. 填模板:替换 BASE/DATE + 数据区(CFG/DAILY/KEY_DISCLOSURE/BLIND_BOX/EXPECT_LINES/STRATEGY/RISK/SUMMARY/NOTE)。
  6. 渲染与校验:运行 → 业绩前瞻日历_{YYYYMMDD}.html → 校验数值 + 区块编号 01-06 + grep 旧日期/旧公司名 → present_files。

关键口径:披露日期/预告区间为交易所预约与业绩预告公开披露(非 hithink 接口,页脚标注);披露量分布为新闻报道口径(各源略有差异取主源);盲盒清单标注统计时点(8-14 时未披露口径),提示可能已提前披露。

能力 #6:市场情绪面扫描器(已实现 · 适用对象:市场级,无单标的版)

触发场景:用户说"做情绪扫描/情绪面分析"、"最近一天市场情绪怎么样"、"生成某交易日的情绪分析"。

资产:scripts/gen_sentiment.py — 情绪面扫描 HTML 生成器(模板 v3.4 全参数化,带 2026-01-05 示例数据;8 处当日叙事硬编码已占位符化→只改数据区不动 TPL)

ETF 不适用原因:情绪面=全市场涨停/炸板/连板梯队/龙虎榜生态,语义上是市场宽度而非单标的属性——单只 ETF 无涨停概念、情绪扫描对它无意义(用户定稿:市场级能力不强做 ETF 版),跳过。

分析框架(专家六维 → 七大区块): 01 情绪综述(整体+热门板块+高热度个股)→ 02 市场温度(涨停/跌停/炸板/封板率图表+市场宽度)→ 03 指数表现 → 04 板块热度(热度TOP10双色条+热度vs走势解读)→ 05 一周持续关注(涨停家数趋势+资金关注焦点+持续涨停股)→ 06 龙虎榜资金 → 07 情绪诊断(温度分+多空论据+后市观察)

执行工作流:

  1. 数据新鲜度门禁(必做,第一步):涨跌家数依赖本地库 → 先 python scripts/ensure_data.py 确认本地库已更新到目标日前一日;⚠️ --check 的判据是「日历中 < 今天 的最大日期」,永远不含当天(2026-09-21 实测:晚间 --check 报「已最新 2026-09-18」,但实际当日包已发布)→ 当天收盘后要产出当天报告,必须直接跑 data sync 并以返回的 release_id / 本地库 max(date) 为判据(滞后会致涨跌家数查询为空,2026-09-03 教训:库停 08-21 被迫 WebSearch 兜底、口径不一致折腾半天)。
  2. 确认交易日:market calendar --format json 返回过去一年窗口(~243 交易日,含最近交易日),必须完整解析 JSON(python 解析取最大日期),禁止 head -c 截断看开头(2026-09-03 曾见全 2025 条目误判"不含 09-02")→ 确定目标日与一周窗口(含目标日前 3-5 个交易日)。
  3. 当日核心数据(--date-ms <当日0点毫秒>):
    • 涨停池:special limit-up-pool --date-ms <ms> --size 200 --sort-field continue_day_cnt --sort-dir desc(limit_up_reason 含板块标签→板块热度数据源;continue_day_cnt 连板数)
    • 跌停池:special limit-down-pool --date-ms <ms> --size 100
    • 炸板池:special limit-break-pool --date-ms <ms> --size 100
    • 连板梯队:历史日从涨停池 continue_day_cnt 重建(limit-up-ladder 仅返回最近 30 个交易日,不含远期历史)
    • 龙虎榜:special dragon-tiger --date <YYYY-MM-DD>(净买入 TOP6 + 机构/游资净额;无买卖席位明细)
    • 涨跌家数:本地库 db query(SELECT COUNT(*), SUM(CASE WHEN close>open ...) FROM raw_kline_daily WHERE date=DATE '...',须先过门禁更新);本地库缺目标日/未更新 → WebSearch 公开披露兜底并显式标注(页脚注明双口径:新闻口径涨停常含未开板新股,与 hithink 涨停池有差,2026-09-02 新闻 54 vs hithink 49)
    • 指数:index history --thscode <code> --start-ms <窗口> --end-ms <次日> 拉窗口,取目标日与前收计算涨跌幅
  4. 一周数据(持续性分析):
    • 逐日涨停池(3-5 天)→ 板块热度关键词统计(见脚本 SECTOR_KW 模式)+ 持续涨停个股(出现天数≥2/3)
    • 热榜历史不可回溯(坑 1,见 references/CLI与数据坑清单.md)→ "热榜三巨头"区块改为"资金关注焦点"=龙虎榜净买 TOP3 替代
  5. 填模板:替换 BASE/DATE/WEEKDAY + 数据区(TEMP/INDEX/WEEK_UP/SECTOR_TOP/PERSIST_STOCK/FOCUS/LHB/DIAG/SUMMARY/SECTOR_VIEW/NOTE + HERO_SUB/DIAG_EXTRA/WEEK_INSIGHT 等叙事字段,模板 v3.4 已全参数化,只改数据区不动 TPL)。
  6. 渲染与校验:运行脚本 → 输出 市场情绪扫描_{YYYYMMDD}.html → 逐项校验数值 → 检查错误数据残留(旧日期的个股名/日期串不能出现在新报告中)→ present_files 展示。

能力 #7:板块轮动雷达(已实现 · 适用对象:市场级,无单标的版)

回答"钱在流向哪个板块?"——N 个行业板块(22~30+,09-04 实测 26 个)的动量排名+轮动信号+资金流向。

ETF 不适用原因:轮动雷达=行业板块指数间的动量比较(881xxx.TI),语义是"钱在板块间怎么流",不是单标的属性——单只 ETF 只是某板块的载体,用板块轮动雷达直接回答"哪个行业 ETF 强"即可,无需单标的 ETF 版(用户定稿:市场级能力不强做),跳过。

资产:scripts/gen_rotation.py — 轮动雷达 HTML 生成器(模板 v1.6 全参数化,带 2026-08-21 22 板块示例数据)+ examples/板块轮动/(09-04/09-07/09-08/09-09/09-10 数据版成品示范)

四区块结构:01 轮动综述(判定徽章+五维+主线→ETF 映射小节)02 板块轮动表(N 板块 × 60/20/5/1 日动量矩阵 + 当日成交 + 量比 + 超额20日)03 轮动信号(加速/回暖/回调/放量/滞涨 6 信号)04 资金流向(成交额池+量比)。

v1.6 说明:KPI 第 2 格标签占位符化为 KPI["pos_cnt_k"](原硬编码"20日正收益板块",换周期无法复用——09-10 普跌日全场 26 板块仅 4 个红盘,标签需写"今日红盘板块"才准确)。教训:模板里任何会随行情变化的展示文字都必须占位符化,KPI 的"值+标签"成对进数据区,渲染后 grep 一次 KPI 区确认值与标签口径一致(09-10 曾出现"4 个/20日正收益板块"错配)。

v1.5 说明:①判定词两档——hero KPI 显示 CFG.verdict_short(≤6 字,如"农业独强"),01 综述徽章显示 CFG.verdict(必须带具体板块,如"种植业+25.18%独强 · 通信低位反弹 · 贵金属/煤炭高位退潮",用户反馈无板块名的"低位反弹试错/高位退潮"表述不合格);②ETF_ROWS=元组(板块定位, ETF 名称+代码, 覆盖口径说明),渲染在 01 综述卡底部"🎯 主线→ETF 映射"小节——ETF 名称/代码必须 fund profile/snapshot 实测,跟踪指数 WebSearch 公开披露核对,板块行业指数≠ETF 成分的口径差写进说明列(实测教训:881102.TI 20日+9.46% vs 930707 20日+4.55%;"种植业"无一一对应 ETF、中证农业 000949 种植权重仅 ~9%;931160 前十大=光模块/光纤龙头,ETF 涨幅可显著>板块指数,515880 单日+5.95% vs 881129.TI +3.77%)。

当日开工链路(2026-09-07 实证;"今天数据能获取吗,能就做"类需求的标准流程): 0. 探测数据可用性(见前置条件第 5 条子项):上证 index history 末条 == 今日且量级正常 → 才开工;否则明确告知"今日未发布,暂不做"

  1. 板块清单:复用 catalog/上次 rotation_{date}.json 的 rows(板块代码稳定、当日不必重拉 catalog),名称映射沿用上次(name_of 由 code→name)
  2. 批量拉 60 日:index history --thscode <code> --start-ms <60+交易日> --end-ms <次日> --source remote 循环 27 个(26 板块 + 000001.SH),输出 idx_<code转_>.json(先 sed -i 's/\r$//' 清清单 CR,坑 28)
  3. 计算落 json(calc 脚本):校验每板块最新日 == 目标日(不符标 [STALE])→ 1/5/20/60 日动量 + 量比(5/20 日均 turnover)+ 当日成交亿 + 20 日超额(-上证)
  4. 数据版构建(build 脚本,09-05/09-07 模式):读 rotation json → 正则替换模板数据区(含 verdict/verdict_short/ETF_ROWS/SUMMARY/KPI/INSIGHT_* 数据叙事)→ 生成并运行数据版脚本 → HTML
  5. ETF 映射:主线/信号板块 → fund profile/snapshot 实测名称规模与当日涨跌 → WebSearch 核对跟踪指数 → 填 ETF_ROWS(含成分口径差说明);关联度低或未核的板块不硬填
  6. 校验:占位符零残留 + grep 旧日期/旧板块名/旧数值 + 区块 class="no" 出现次数 + ETF 代码各出现(生成后立即用宽式断言,勿用磁盘字节数,见模板约定"校验时机")

执行工作流:

  1. index catalog --tag industry 取行业板块指数目录(881xxx.TI 一级行业,返回 300+ 条含 884xxx 细分)——按名称关键词先查 catalog 实际名再选(勿凭记忆拼板块名,坑 27 见 references/CLI与数据坑清单.md)
  2. index history 拉各板块 60 日收盘+成交额(板块指数历史含 turnover,data.item[] 时间升序、最新交易日=item[-1])→ 上证 000001.SH 同期做基准
  3. 计算动量(1/5/20/60 日涨幅)+ 量比(5日均成交/20日均成交,>1 放量)+ 20 日超额(-上证)
  4. 轮动信号:5日 vs 20 日比较(加速/减速)+ 量比(放量/缩量)
  5. 填模板数据区(v1.6 全部进数据区:CFG/SECTORS/SIGNALS/FLOW/SUMMARY/NOTE + KPI(hero 最强板块/正收益家数/最大资金池,值与标签成对:strong/strong_k、pos_cnt/pos_cnt_k、pool/pool_k)+ TABLE_HINT(板块数与上证基准)+ INSIGHT_TABLE/SIGNAL/FLOW + HL(高亮行板块名)+ ETF_ROWS(主线→ETF 映射,v1.5))→ 渲染 板块轮动雷达_{YYYYMMDD}.html → 校验编号 01-04 + grep 旧日期/旧板块名/旧数值三查残留 + 读 KPI 区确认值与标签口径一致
  6. 数据版可复现构建(09-05 模式):扫描数据落 json(rotation_0904.json 含 date/sh_m20/rows[板块×动量量比超额] + idx_*.json 含 turnover)→ 构建器读 json 正则替换模板数据区 → 生成并运行数据版脚本 → HTML;改模板结构后再构建,务必重跑并复查(v1.3 TPL 硬编码曾致新数据版仍输出旧 hero 值)

关键口径:动量=板块指数收盘价涨跌幅;量比>1 放量;板块指数为同花顺行业指数(881xxx.TI);轮动信号为模型综合判断(模型输出)。

已实测(2026-09-04,26 板块,上证 20日-0.3%):种植业与林业 20日+22.4%/量比1.45 双断层第一(猪周期反转+农业政策),养殖业 +11.2% 共振成农业链主线;保险/银行 5日放量接力(量比 1.29/1.24,退潮防御);文化传媒 5日+6.8%/量比1.57 低位抢筹;贵金属 60日+31.3% 最强但 5日-4.3% 缩量回调;半导体/小金属/航天装备 20日为负+量比<0.75 退潮——"增量低位 + 存量高位"的退潮期结构,与情绪扫描(封板率 44%)互证,多能力协同研判可用 #6情绪+#7轮动+#1W底形态扫描 三视角组合(09-04 推荐研判实证)。

已实测(2026-09-07,26 板块,上证收 3932.70、20日-0.85%):种植业与林业 20日+25.18% 断层第一续强(今日+4.33%、量比1.42、超额+26pct)——农业链第二周霸榜;养殖+9.46% 共振;通信设备今日+3.77% 低位反弹窜第3(60日-2.07 超跌属性、量比0.85 未放量);文化传媒量比1.58 全场最高、游戏5日+4.32% 低位持续放量;大金融歇脚(保险今日-2.45%);贵金属 20日转负、煤炭 5日-6.80% 放量下跌(高位退潮);航天-10.29/小金属-9.19/光伏-5.54/电池-4.02 垫底、半导体今日+2.54% 弱反弹。ETF 映射实证:种植→无一一对应 ETF(中证农业 000949 种植仅~9%)、养殖→159865(930707 66.6亿)、通信→515880(931160 397亿 今日+5.95%)、传媒→512980(399971 43.9亿)。

能力 #8:股票全面分析(已实现 · 适用对象:仅 A 股个股)

回答"这只股票到底怎么样?该不该买?"——全维透视单只股票:整合能力 #2 速览、#3 财务、#4 估值、#5 业绩前瞻、#6 情绪、#7 轮动、#9 穿透、#11 龙虎榜的结论,一站式给出研究观点与投资指导。

ETF 指引(2026-09-03 定稿:标注指引,不新建模板):全面分析的十区块(财报/预测/披露日历/龙虎榜/市场环境)依赖个股财报与市场事件,套用到 ETF 上大半区块无数据、强行填充全是 [MISSING]——故不做 ETF 版全面分析。ETF 的"全面研究"= 能力 #2 速览卡 ETF 版(gen_tearsheet_etf.py,档案/净值/收益/持仓/分红)+ 能力 #9 穿透(gen_penetration.py 正向区,重仓股+持有人)+ 能力 #4 ETF 估值版(如需估值视角) 三者组合即可覆盖,引导用户走这条链路而非要求 ETF 全面分析模板。

触发场景:用户说"全面分析 XX""XX 值不值得买""综合研判 XX"——需要多维整合结论而非单一视角时。

资产:scripts/gen_comprehensive.py — 股票全面分析 HTML 生成器(模板,带 2026-08-21 中天科技示例数据;十区块:01 总览 → 02 公司速览 → 03 财务分析 → 04 估值分析 → 05 成长预测 → 06 业绩前瞻与催化剂 → 07 市场环境 → 08 机构与资金 → 09 风险清单 → 10 投资指导)

执行工作流:

  1. 取数(并行):market snapshot(行情/市值)、valuation snapshot(PE/PB/PS/PCF + 同行批量)、financials income(5 年 + 最新季)、financials indicators(毛利率/ROE)、market history 1 年前复权(52 周高低/近 1 年涨跌)。
  2. WebSearch 补齐(数据来源铁律):主营构成、券商一致预期/目标价(forward PE 锚点)、机构持仓(基金/北向)、在手订单/催化剂、近期龙虎榜——页脚显式标注。
  3. 整合多能力视角:估值→能力 #4 口径(TTM vs forward)、成长→能力 #3 口径(三情景+一致预期)、环境→能力 #7 板块位置 + 能力 #6 情绪温度、机构→能力 #9 穿透口径。
  4. 填模板:替换数据区(CONFIG/SNAP/BIZ/FIN_Y/FIN_Q/VAL/FC/CATALYST/ENV/INST/RISK/GUIDE/NOTE/TITLE_SUB + HIST 路径)→ 渲染 全面分析_{名称}_{YYYYMMDD}.html。hero 大标题=股票名(CONFIG['name']),TITLE_SUB 为报告类型小字——禁止把"股票全面分析"硬编码为大字(v1.1,2026-09-03 用户纠正)。
  5. 校验:区块编号 01-10、无占位符残留、grep 旧标的名、配色正红负绿。

关键口径:forward PE=市值/券商一致预期(利润高增股 TTM PE 高≠贵,必须看 forward);市值=股价×股本估算 [ASSUMED];券商预测/机构持仓/订单 WebSearch 标注;市场情绪/板块数据可引用既有能力产物(标注口径日期);结论必须含"结论/数据含义/情景/操作/跟踪"五维投资指导。

已实测:中天科技(600522.SH)——AI 光纤涨价 +650% + 海缆订单 308 亿,2026Q1 归母 +46.4%,PE(TTM) 34.2 但 2026E 一致预期 70 亿 → forward 15.4 倍,结论"高景气、估值消化中",机构目标价 56.32 元(+68%)。

模板坑:snap_rows 渲染的 kv 行 span 写 flex:0 0 76px 但 CSS 漏定义 .kv{display:flex} → 标签与数值粘连("开盘33.42");必须与速览/估值/财务模板保持一致:.kv{display:flex;justify-content:space-between;align-items:baseline;...}。新建模板时先对照既有模板抄 CSS 骨架,再写渲染函数。

验证关卡职责(v1.1,与能力 #12 协同):能力 #8 同时承担能力 #12 选股的验证关卡——对定稿 N 只逐一跑全面分析,按「不值得买五维否决标准」(估值透支/基本面恶化/成长证伪/硬风险/位置风险,一次性 vs 经营性亏损须区分)判读,命中即剔除并补位重找(详见能力 #12 步骤 10-12 与坑 29/30)。

能力 #9:穿透分析(已实现 · 适用对象:ETF ↔ 个股双向)

回答"这基金重仓什么?这股票被谁抱团?"——基金持仓↔个股反向穿透。

两种模板(按标的类型选):

  • gen_penetration.py:ETF↔个股版,五区块——01 穿透总览(徽章+五维)02 正向穿透·ETF重仓什么(前十大持仓表+集中度+基金档案+持有人结构)03 反向穿透·股票被谁抱团(核心卡+前十大持有基金表+闭环高亮)04 抱团全景(重仓股双条形图+解读)05 解读与风险
  • gen_penetration_zjky.py:个股抱团版(无 ETF 正向区),五区块——01 总览 02 机构抱团分层(公募/北向/社保险资/全口径条形)03 前十大流通股东表 04 抱团质量与结构 05 解读与风险

天然双向适配:正向(用户拿 ETF 来 → 查它重仓什么)与反向(用户拿个股来 → 查谁持有它)都覆盖,ETF 适配无需改造。

执行工作流:

  1. fund holdings --fund-type exchange 取前十大持仓(hold_ratio 占净值%/position_capital 市值/period_increase_rate_pct 期间增减)→ fund holders(ins_position 机构占比/psnl_rate 个人/holder_amount 户数)→ fund profile(规模/经理)→ fund snapshot(行情)
  2. 反向穿透:hithink 无"个股被哪些基金持有"接口 → WebSearch 新浪财经基金持股页/巨丰财经/东吴证券等公开披露(持仓基金数/占总市值比例/前十大持有基金)——页脚显式标注来源与口径
  3. 闭环验证:正向 ETF 前十大里的重仓股,反向持有基金表中应能找到该 ETF 本身(561380 持亨通 7.82亿 ↔ 亨通第 6 大基金股东=国泰恒生A股电网设备ETF)——闭环成立证据,换标的必须重新验证
  4. 填模板数据区(CFG[kpis]/ETF_HOLD/STOCK_CORE/STOCK_FUNDS/HERD[含META/MAX2]/各类 NOTE/CLOSE_ROWS/RISK_ROWS/SUMMARY)→ 渲染 → 校验编号 01-05 + grep 旧标的名残留
  5. 结论必须含"数据含义"+"投资指导"(01 综述精炼版 + 05 详解版 + CLOSE_INSIGHT 金色 insight)——用户要求穿透报告必须有实战指导

关键口径:持仓=2026Q2 季报、持有人=2025-12-31 年报(报告期不同分别标注);反向数据口径差异需注明(渤海=主动权益基金数、巨丰=全口径、东吴=占总市值比例);占流通/占净值均为百分数直接加%;穿透结论为模型综合判断(模型输出)。

能力 #10:组合风险管理(已实现 · 适用对象:多标的组合,天然含 ETF)

回答"我的持仓风险集中吗?"——多标的组合的相关性/回撤/仓位集中度/分散建议。

天然适配:组合标的可以是"多只 ETF"(工作流第 1 步 fund history 就是拉组合内各 ETF 日线)也可以是"多只个股"(本地库 v_daily_qfq),ETF 适配无需改造——ETF 组合是此能力的标准用法之一。

六区块结构:01 组合总览(判定徽章+六维:结论/相关性/集中度/分散方案/数据含义/投资指导)02 风险指标对比(各标的+组合:区间收益/年化/波动/最大回撤/回撤区间)03 相关性分析(双资产相关系数条形图,红>0.7/橙0.4-0.7/蓝0-0.4/绿<0 着色+解读)04 集中度诊断(行业/风格/波动/回撤/对冲五维+月度收益柱状图)05 分散建议(配置模拟表)06 操作建议与风险(三档方案+再平衡+风险)。

执行工作流:

  1. fund history 拉组合内各 ETF 同期日线(远端结构 data.item[]+date_ms/close_price)→ 对齐日期取交集
  2. index history 拉候选分散资产(沪深300 000300.SH/贵金属板块 881169.TI/红利指数 000015.SH)——测"组合 vs 候选"相关性找真实分散工具
  3. 计算:年化收益/波动(252 日换算)、日收益率相关系数(组合内部+vs 候选)、最大回撤(含区间)、50/50 组合净值
  4. 分散模拟:组合 × 红利/黄金 不同权重回测(不同量纲必须先各自归一化到 1 再加权,ETF 价格 0.87 vs 指数点位 2500 直接加权会淹没收益)→ 波动/回撤/收益对比
  5. 填模板数据区 → 渲染 → 校验编号 01-06 + 数值复核

关键口径:相关系数基于日收益率;最大回撤为收盘价口径;分散模拟为历史窗口回测标 [MODEL];结论必须含"数据含义"+"投资指导"(同穿透分析约定);相关性着色约定(>0.7 红/0.4-0.7 橙/0-0.4 蓝/<0 绿);"名义分散 vs 实质集中"判断(同链标的分散效果差——如电网海缆×半导体同属 AI 算力链)。

能力 #11:龙虎榜事件解读(已实现 · 适用对象:市场级,无单标的版)

触发场景:用户说"龙虎榜解读/龙虎榜复盘"、"生成 XX 日期的龙虎榜事件解读"。

资产:scripts/gen_lhb.py — 龙虎榜事件解读 HTML 生成器(模板,带 2026-01-28 示例数据)

ETF 不适用原因:龙虎榜上榜主体是异动个股(ETF 极少上榜且无席位博弈语义),解读对象=当日全市场龙虎榜生态——市场级能力,无单只 ETF 的事件版,跳过不强做。

分析框架(专家八维 → 八大区块): 01 综述(资金生态/整体机构游资分线)→ 02 资金净买榜 TOP8 → 03 机构动向(净买TOP6+净卖TOP3+买卖家数)→ 04 游资动向(净买TOP6+净卖TOP5+知名游资席位表)→ 05 分歧与筹码交换(机构vs游资对手盘+筹码结构提示)→ 06 题材热度(概念上榜次数双色条形图)→ 07 重点个股解读(6卡)→ 08 后市推演(三情景概率+操作警示)

执行工作流:

  1. 拉普通榜:special dragon-tiger --date <YYYY-MM-DD> --format json(含 net_value 净买/hot_money_net_value 游资净买/concept_list 概念/change 涨跌幅/limit_reason 涨停原因;注意 change 为小数比例 0.10=+10%)
  2. 拉机构榜:special dragon-tiger --date <YYYY-MM-DD> --board-type org --format json(含 org_net_value 机构净买/org_buy_num/org_sell_num 机构买卖家数——机构分析核心字段,普通榜没有)
  3. 合并同股多榜:同一股票可能因多种触发原因多次上榜(如康希诺 2 条),按 ticker 合并净买/游资净买;hot_money_net_value 部分条目缺失用 .get(...,0)
  4. 统计排序:净买TOP/机构净买TOP/游资净买TOP/净卖TOP、概念热度 Counter、涨跌分布、合计净买
  5. WebSearch 补充席位:接口无买卖席位营业部明细 → 搜"<日期> 龙虎榜 游资 席位"补知名游资动向,页面显式标注"WebSearch 公开披露"(数据来源铁律)
  6. 填模板:替换 BASE/DATE/WEEKDAY + 数据区(OVERVIEW/NET_TOP/ORG_BUY/ORG_SELL/HM_BUY/HM_SELL/SEATS/DIVERGE/THEME/FOCUS/SCENARIO/WARN/SUMMARY/NOTE)
  7. 渲染与校验:运行脚本 → 校验数值 + 区块编号 01-08 唯一 + 旧日期硬编码残留检查(模板 insight/副标是当日叙事,换日期必须逐一替换;席位副标日期已用 DATE 占位符)→ present_files 展示

关键指标口径:Hero 合计净买正负号用 {:+.2f} 格式化(禁止硬编码"+"前缀,否则负值显示"+-");机构净买=org_net_value;"边拉边出货"判断=涨停股净买为负且机构/北向大额卖出。

能力 #12:多能力协同选股(已实现 · 适用对象:编排型,A 股个股推荐)

触发场景:用户说"基于板块轮动/市场情绪/龙虎榜/经典策略回测,推荐 N 只股票并给理由"、"今天适合买什么"、"结合这些能力选股生成报告"。

资产:scripts/gen_reco_picks.py — 精选 N 股推荐报告 HTML 生成器(模板 v1.2 全参数化,带 2026-09-10 精选 5 股·短中线技术指标版示例数据;v1.1 新增:卡内 chk 验证行 + ★验证记录面板 AUDIT_ROWS + EVID 第 5 列「能力#8 验证」+ tag「主线低吸」;v1.2 新增:每卡 tech 短线技术指标区 + tnote 技术研判 + 涨跌自动红绿 hl() + KPI .hot 红色热度指标 + 短中线定位)+ examples/多能力选股/(成品示范,含 09-08 验证版 / 09-09 / 09-10)。编排型能力:不新增数据源,把已有能力(#7 轮动 × #6 情绪 × #11 龙虎榜 × #1 经典策略信号 × #8 全面分析验证)的当日输出交叉取证,选出 N 只股票输出「精选 N 股推荐报告」。

复盘能力(v1.3 新增):能力 #12 不只「产报告」,还负责校验自己的历史推荐准不准。

  • 触发:用户说「复盘一下之前的推荐」「这些票后来涨了还是跌了」「这套选股策略准不准」「要不要改策略参数」。
  • 资产:scripts/review_picks.py(通用复盘器,自动扫历史报告 → 查本地前复权日线 → 算逐笔与汇总 + 分期超额)+ references/荐股复盘指南.md(口径、结论、方法论)。两条取数路径:优先 hithink CLI,CLI 不可用自动回落直读本地 DuckDB (CLI 是 npm 全局包,node 版本目录切换后会丢失;回落口径相同,日期已统一为 ISO 字符串);--no-benchmark 可关超额计算。
  • 口径:建仓=推荐日次一交易日开盘;平仓=最新交易日收盘;基准=沪深300;必须同时声明三条局限(持有期可能未走完 / 未计交易成本 / 「次日开盘买入」与正文「只做回踩」不一致)。
  • 两项必做检验:① 剔除最大盈利单笔后是否更差(防「单笔驱动的假优势」);② 换用事前可算的特征重新分组(防「事后归因当规则」)。
  • 结论纪律:样本 < 50 笔时只报数字与局限,不据此改策略参数。

★ 定位纪律(v1.2,用户明确要求):一律短中线思维,不推长线。持有周期口径 = 3~10 个交易日(最长 20 个交易日);每只必须给出 ①入场技术位(回踩 MA5/MA10/颈线/前低)②止损位(跌破即走)③短线目标或减仓条件。禁止"长期持有/价值投资/穿越牛熊"类表述——基本面只作「短线不做接刀」的安全垫,破位即走,不因基本面好而转长线。

当日开工链路(先探数据可用性,无今日数据则不做):

  1. 探测:index history --thscode 000001.SH --source remote 末条 date_ms==今日且量能正常 → 可开工
  2. 本地库:data sync(注入 HITHINK_FINANCE_DUCKDB_MEMORY_LIMIT=4GiB)→ 供涨跌家数与前复权扫描
  3. 情绪 #6:涨停/跌停/炸板池 + 龙虎榜(普通+--board-type org)→ 封板率/连板梯队/机构动向/热词方向
  4. 轮动 #7:板块 60 日历史 calc 出主线(若当日已出轮动雷达,直接复用 rotation json)
  5. 经典策略 #1:db export 前复权 parquet → 复用 find_w_bottom 形态逻辑做 W底突破 + 60日新高放量 双信号扫描
  6. 交叉验证:候选须命中「主线 or 情绪热词 or 龙虎榜资金」至少一条 + 形态信号至少一条 → market snapshot 实测当日行情 + bt_name_map 映射名称(涨停池 JSON 常无 name 字段)
  7. WebSearch 核实题材(政策/涨价/事件,页面标"WebSearch 公开披露",禁编造)
  8. 【妖股剔除】区间涨幅复核:用前复权 parquet 算候选 1/5/20/60 日涨幅——20日已 +50~100%+ 的剔除(09-08 教训:金健米业看似农业补涨,实际 20日 +140% 是妖股);区分「已大涨补涨」与「60日仍负的干净首次突破」
  9. 定稿 N 只:定位分层 tag(主线右侧/主线首板/机构主买/超跌回踩/弹性博弈/主线低吸,颜色在 CLS 注册)——当日涨停/连板股只给"回踩参与"不给追高(回测纪律引用)
  10. ★能力#8 验证关卡(v1.1 必做):对定稿 N 只逐一跑能力 #8 全面分析取数(market snapshot + valuation snapshot + financials income/indicators 最新报告期 + 历史K;必要时 WebSearch forward 一致预期/目标价锚点)→ 按五维否决标准判读
  11. 剔除重找 + 反查补位:不值得买的从候选池(W底/60日新高/龙虎榜净买/涨停池同题材名单)重找补位,补位者同样过 #8 验证;某题材涨停资金票全部不过(PCB/存储/传媒常见)→ 沿产业链上溯到涨价/景气真受益方反查补位(09-08 案例:中京电子被剔→覆铜板龙头生益科技 H1 归母+130% 入选,tag=主线低吸,须 WebSearch 验证涨价事实);候选池耗尽仍无合格 → 宁缺毋滥(降 N 或留档位空缺),报告写明放弃方向(09-08 晚:AI出版影视涨停潮无低位高性价比标的 → 方向整体放弃)
  12. 渲染校验:每卡填 chk((ok, 短句) → ✅/⚠️ 验证行)+ ★验证记录(AUDIT_ROWS)→ 填数据区运行 → 精选{N}股推荐_{YYYYMMDD}.html → 校验区块 01-05 + ★面板 + 零残留
  13. ★短线技术指标(v1.2 必做):对定稿 N 只用本地前复权 parquet 自算 6 项短线指标 → 填每卡 tech(6 格)+ tnote(技术研判句):
    • MA5/10/20/60 排列(多头/空头/纠缠 + 站上哪条)· RSI14(>70 超买 / <30 超卖)· MACD(12,26,9)(金叉/死叉、零轴上/下)· 量比(今量÷前5日均量:<1 缩量回踩 / >1.5 放量)· 布林(20,2) %B(>100 破上轨=超买)· 关键位(支撑=MA5/10/20 或前低,压力=20日高/颈线)
    • 判读纪律:RSI>70 + %B>100 + 乖离 MA20>8% 三者同现 = 短线超买 → 操作必须写"回踩 MA5/MA10 再参与",不给追高(09-10 宁波银行案例:RSI 75.3/%B 106.6/创 20 日新高 → 报告明确等回踩 34.8)
    • 技术面与基本面必须互证:09-10 华正新材(乖离 MA20 +20.3%、%B 118、20日+43%)技术面独立佐证基本面否决 → 写入 AUDIT 增强说服力
    • 现成范式脚本:工作区 calc_tech_*.py(读 bt_qfq_scan.parquet,输出各标的 MA/RSI/MACD/量比/%B/区间涨幅/距20日高低)

不值得买五维否决标准(能力 #8 verdict 判读,命中任一 → 剔除):

  • A 估值透支:forward PE 显著高于同行且无增速支撑(利润高增股看 forward 不看 TTM;MRQ/单季 PE 极端放大须警觉)
  • B 基本面恶化:最新报告期营收/归母双降、ROE 持续下行、由盈转亏且无兑现逻辑
  • C 成长证伪:券商一致预期下修 / 2026E 净利负增长且无新催化(上海电影案例:机构预测净利同比下滑 + 两连板高位)
  • D 硬风险:ST/立案调查/大额商誉减值/审计非标/清仓减持
  • E 位置风险:60 日涨幅过大追高、龙虎榜高位净卖、板块刚由热转冷
  • 一次性 vs 经营性亏损必须区分:PE_TTM 为负先 WebSearch 核实事件 + 看扣非/Q1 趋势——北大荒 H1 -5.37 亿系一次性补税 14.1 亿(6 月缴清无处罚、Q1 主业 +7.8%)→ 利空出清保留(谨慎档);金正大 -4.97 亿系经营性由盈转亏(ROE -26.6%、流动比率 0.88)→ 否决

区块结构:01 市场环境速写(核心研判 banner + 4 KPI + 指数 + 主线 lines + insight)02 精选 N 股卡(每卡=定位徽章/证据 chips/标题/理由/6 数据格/📐短线技术面 6 格 + tnote 研判(v1.2)/操作参考·短中线/主要风险/✅能力#8 验证行 v1.1/五能力证据圆点)03 信号证据交叉矩阵(动态生成:N 股 × {4 能力 + 能力#8 验证} 矩阵 ●○)→ ★能力#8 验证记录(v1.1:AUDIT_ROWS 审计表——原选/候选逐一判定、剔除/补位全程留痕,宁缺毋滥) → 04 操作纪律(短中线口径首行"短中线持有不做长线" + 能力 #1 回测实证表)05 口径与免责(须写明"定位短中线 3~10 个交易日,非长线推荐")。

关键纪律(均已实测 2026-09-08/09):①标题/文件名自动带 N(精选{N}股推荐_…,len(STOCKS) 驱动);②矩阵动态化=增删股票自动适配;③中报亏损股交易的是涨价/产能预期(示例中京电子 -8985 万)→ 卡标"高风险档",risk 写明基本面背离;④报告页脚必写"均以回踩/企稳分批为操作前提,非追高推荐";⑤NOTE 动态拼 DATE;⑥验证口径(v1.1):EVID 第 5 列=能力#8 验证(通过者均 True);chk=(ok,短句) 缺省不渲染(向后兼容 v1.0 数据);AUDIT_ROWS=[] 则 ★ 面板不渲染;⑦09-08 晚实测案例:原 5 只跑 #8 剔除 3 只——金正大(H1 归母 -534% 由盈转亏/ROE -26.6%)、上海电影(H1 -71.6%/MRQ PE 333x/两连板高位,成长估值双否)、中京电子(H1 亏 -0.90 亿/二连板)→ 补位粤桂股份(同主线 H1 +182.8%,补位质量反超被剔标的)与生益科技(沿 PCB 涨价链反查的覆铜板真受益方,当日 -1.3% 回踩低吸位)→ AI出版影视方向整体放弃 → 5 只成稿(4 强 + 1 高风险边缘票三孚股份,卡内显式标高风险档);验证关卡的核心价值=把「博预期的涨停资金票」与「业绩兑现的真受益方」区分开(涨停池当日 90% 是 PE<0 或 PE>50 的题材票,坑 30)。⑧09-09 第二日实跑补充:昨日剔除的 金正大(再 3 板+龙虎榜+2.05 亿)、中京电子(+3.54 亿)、上海电影(机构净买+1.93 亿)次日仍被资金大买——短线资金热度≠值得买,基本面否决跨日维持,报告 AUDIT 面板必须留痕以证口径一致(同日也证明了高位题材退潮判断:传媒/游戏领跌 -3.4%);「转观察」机制:北大荒(一次性补税 14.1 亿出清 + 营收 -29.4% 系购销→代销口径变化、主业利润 9.39 亿仅 -0.16%)与三孚(两日 +16% 兑现、博弈性价比降)非否决但移出主推 → 观察档行也进 AUDIT("ok/转观察"),保证推荐 5 只始终是当下最优而非"上次的最优";资源主升日(煤炭+3.35%/铝地缘点火)推荐应给「回踩参与」而非追高开。 ⑨短中线定位(v1.2,用户明确要求):全部推荐按 3~10 个交易日 口径给操作(入场位/止损位/短目标),不推长线;plan 首标"【3~10 个交易日】"、卡片标签写"操作参考 · 短中线"、04 区块首行加"短中线持有,不做长线"纪律、页脚写明"非长线推荐"。 ⑩红绿着色规范(v1.2,用户明确要求):①个股涨跌一律红涨绿跌——chg 字段按数值正负自动判类(chg_cls(),严禁硬编码 class:v1.1 曾全部写死 up 致下跌股显示红色);卡片数据格/技术指标格文本走 hl() 自动把 ±x.x% 包红绿;②涨停家数、封板率等"市场热度"类 KPI 一律用 .hot 红色(不受当日涨跌方向影响,09-10 曾因退潮日填 dn 而显绿);跌停/降温类用 .dn 绿。 ⑪复盘驱动的三条入场/离场纪律(v1.3,2026-09-16 首次复盘后确立):①止损必须有硬上限——止损价取「支撑位下方」与「入场参考价×(1−止损幅度)」中的较高者,本报告取更保守的 −5%(复盘依据:20 笔样本中持有平均 −1.73%/最差 −13.65%,加硬止损后 −1.02%~−1.55%/最差 −5.0%~−8.0%;⚠️ 样本不足以区分 −5% 与 −8%,不可宣称某档最优);②每张卡必须给可执行的「执行前提」——次日高开 >3% 放弃、回踩至入场位且缩量企稳才买、不回踩则不做,与正文口径冲突时以执行前提为准(原报告 plan.entry 写「次日开盘」而正文写「只做回踩」,读者无法同时遵守);③同一标的 5 个交易日内不重复推荐(除非出现全新更强的触发信号并在验证记录留痕)。详见 references/荐股复盘指南.md。

⑫🔴 第二次复盘(2026-10-04,11 期 55 笔)追加的荐股纪律 —— 每次荐股都要遵守(依据见 references/荐股复盘指南.md 第七节):

  • 本策略整体是减分的:分期超额(组合 − 全市场等权)−4.01%,只跑赢 3/11 期 → 默认按「尚未验证有效」处理,不做乐观假设、不因"昨天对了"就加大仓位。
  • 必须坚持 v1.3 新规则(涨停 ≤2 配额 + 所属二级行业红盘过滤 + 5 日不重复): 新规则期超额 +0.24% vs 旧规则期 −6.44% —— 规则改版是目前唯一被数据支持的正向变化,别退回"涨停优先"。
  • 「5 个交易日内不重复推荐」必须硬执行:跨期重复的标的全部是负贡献 (中际旭创 4 次上榜,四次收益 −13.3% / −9.2% / −10.0% / −9.2%)。同一标的多期上榜 ≠ 多期机会。
  • 持有期口径按 T+3 ~ T+5 写,不要写"可持有 10 个交易日": T+5 超额 −1.54%(各口径最优)、T+10 恶化到 −6.85%;持有越久越差。
  • 报告必须给「同期市场参照」:普跌段绝对收益天然为负,只报"平均 −5%"会让人误判为选股问题。 首次事实:组合 −5.09% 而全市场等权仅 −1.08% —— 差额才是选股的真实贡献。
  • ⚠️ 不要凭单次复盘改策略参数:首次复盘(20 笔)得出的「均线离场更差」在 55 笔上已翻转。 目前稳的只有一条:「有离场规则」显著优于「持有到期末」(−2.6%~−4.2% vs −5.09%, 最差单笔从 −25% 压到 −5%~−15%);具体档位(均线 vs 固定止损、−5% vs −8%)仍不可宣称优劣。 ⑬ 🔴 数据区的 N 必须写成 N = len(STOCKS)(2026-10-09 实测事故):模板用 N 拼 「精选 {N} 股推荐」标题与文件名(FILE = f"精选{N}股推荐_{DATE}.html"),写成叙述串会产出 精选周五 · 收盘后生成(…)股推荐_20261009.html 这种文件名;而渲染器当时只查 N = 是否存在、不查内容 → 日志显示渲染成功、文件名全错。已代码化,不必靠记:render_picks_report.py 校验 N 的写法, 渲染后再由 report_artifact.expect() 实测契约名 + 本轮新写。

能力 #13:价值投资配置(已实现 · 适用对象:框架型,跨资产长期配置)

触发场景:用户说"做个长期资产配置"、"哪些资产适合定投、哪些适合低价买入"、"怎么配比/怎么再平衡"、"红利/美股/黄金/债券怎么投"、"这套组合历史收益多少"。

能力特征(与其余 12 个能力的根本差别):框架型 · 不择时 · 不依赖当日行情。首次询问生成报告 + 落盘缓存; 之后每次都先判有效性(≤180 天 且 5 个锚点漂移均未超阈值)→ 有效则直接返回已有报告,失效才重算。 --status 只看状态、--force 强制重算、--selftest 自检判定逻辑。缓存 <工作区>/.workbuddy/output/value_investing/config.json。

5 类核心资产(全部核心,无"可选"项):A股红利低波(低价买入·收息)/ 美股宽基 QDII(定投主力)/ 国内债券(一次性配置)/ 黄金(定投或回调分批)/ 现金货币(流动性)。

资产:scripts/gen_value_investing.py(HTML 模板)+ scripts/value_investing.py(有效性判定 / 缓存 / 渲染)+ scripts/value_evidence.py(定投与长期收益实测证据)+ scripts/value_backtest.py(组合历史回测)+ scripts/value_capital.py(从真实账本算可投资金 / 月结余 —— 把「月结余口径」的三条剔除规则固化成代码)+ scripts/value_dca_freq.py(定投频率回测 每日/每周/每两周/每月,同窗口同总投入 + 滚动起点)+ scripts/value_valuation_check.py(估值 / 股息率速查)+ references/价值投资指南.md。

报告结构(v13 定稿:5 节 / 8 表 · 编号即阅读顺序): 01 每月怎么做(每月分配表 资产 / 每月投(元)/ 怎么投 + QDII 限额卡)→ 02 五类资产:买什么 · 怎么投 · 怎么撤(主表 6 列 = 资产·操作方式 / 场外基金代码 / 三档占比 / 怎么投 / 怎么撤 / 现在该怎么做;下接「再平衡与执行铁律」)→ 03 现在贵不贵(估值表 + 来源小字)→ 04 判据与证据(判据卡 + 跨资产同窗口对比 + 定投期限胜率 + 组合回测 + 逐年)→ 05 不做什么(八条硬约束)。 ⚠️ 教学性内容一律不进报告:PE/PB/股息率怎么读、六位作者理论(出处已在页脚 NOTE 首句列举)都不再单列一节 —— 2026-10-08 用户要求「整个 html 重新整理一下,简洁明了」后删除(删了什么见 references/价值投资指南.md 第十五节)。

关键纪律: ① 配比只在 ALLOC 定义——执行总表的占比列由它生成,build() 断言 MAIN 与 ALLOC 的资产名一一对应; value_backtest.py / value_investing.py / value_capital.py 也都读它(单一数据源,改配比只改一处); ⚠️ 但报告里另有多处硬编码跟着「平衡档」走(MAIN 的「月结余 × N%」、QDII_WARN 的金额、 BT2 回测数字等)——改配比后跑 check_build.py --script gen_value_investing.py, V1 校验会查三列合计 / 风险资产占比 / 月结余与按N% 系数 / 前瞻中枢(含正反例自证); ② 每档的具体金额由真实账本驱动:CAP_CASH / MON_INCOME / MON_EXPENSE / MON_SURPLUS / RES_EMERGENCY / RES_EXTRA 六个参数 → 改参数即全表联动。 用 scripts/value_capital.py --ledger <账本目录> --as-template 生成参数块。 ⚠️ 月结余的口径必须剔除三类(一次性收入 / 理财进出 / 出差垫付),否则高估约 6 倍——已代码化 + 负例自证; ⚠️ RES_EXTRA(婚期/职业转换专项)不是账本实测值,报告里必须标明「可调」并给敏感性,不得当成实测算出来的; ③ 基金代码必须联网核实并标注核查日期(不许臆造); ④ 不写"去哪儿查"教程——估值只给「当前值 + 历史分位 + 当下结论」,来源与日期标在表下小字(用户明确要求); ⑤ 报告的结构与文案红线已由 check_build.py 机械校验(H7 空壳 / H8 禁用行话 / L3 宽表溢出),不必靠记忆; ⑥ 页面宽度 1200px(本能力单独放宽,其余模板仍 960px); ⑦ 报告文件名由模板 DATE 驱动 → 它读环境变量 THS_VALUE_DATE(由 value_investing.render() 注入并校验落盘); VALID_UNTIL 由 DATE + 180 天 派生。换一天重新生成若不给这个变量,会覆盖上一期报告。 ⑧ 🔴 美股档的执行频率由「QDII 单日限额」决定,不由偏好决定(2026-10-08 核实): 限额是「单日单账户单基金」(81 只美股 QDII 中位数 100 元/日、25 只 ≤10 元/日), 所以它约束「某一天能买多少」而非「一个月能买多少」——本报告 917 元/月若集中一天买,差 6 倍买不满; 周投也不行,只有日投可行(约 44 元/日,须拆 5~6 只且跨基金公司——额度按基金公司合并)。 ⚠️ 但收益上日投与月投实测无实质区别(value_dca_freq.py)→ 报告里必须把 「买不到」与「收益更好」分开说,不得包装成收益优势;并明确给出**场内 ETF(不限购)**这条主力替代路径。

⑨ 「目标金额」不是停止线,且每月结余必须按「缺口」分(2026-10-08 用户问「到了怎么办」): 目标金额 = 可投资金 × 配比,会随组合总值同步长大 → 判够不够看占比、不看金额。 ⚠️ 不能只投美股 + 黄金:那样红利低波/债券永远拿不到新钱 → 12 个月后现金从 18% 漂到 27.3%、 红利从 21% 掉到 15.7%;24 个月现金 32.9%(这张自证表已移入本指南,不再渲染进报告)。 正确:结余按「目标占比 × 新总值 − 当前值」的缺口分配。 只有三种情况停投单档:触上限(美股 50%/黄金 20%)/ 触发减仓规则 / 月结余没了;整体定投不该停。

⑩ 呈现硬纪律:能写进表格的,不要写成表下大段文字(2026-10-08 用户明确「别再下面写那么多文字不想看, 直接在表格里写清楚」)。金额表已收敛为 3 列(资产 / 每月投(元)/ 怎么投)+ 表内脚注行 承载规则;不要再另起 insight 段落重复。 ⚠️ 同时两条口径:① 「一次性配足」只指建仓那一下,之后每月仍按缺口给每一档加钱(用户每月 10 号发薪); ② 黄金已由「每季」改「每月」(用户原话「每季我怕忘了」)。

⑪ 🔴 算「可配置资产」必须先把「已持有的场外基金」算进来(2026-10-08 用户告知两笔持仓后补): 用户 7/10 买了两只基金(013225 景顺长城安景一年持有混合A 5万、001235 中银国有企业债A 2万), 买入时钱已从现金账户划走 → 8-21 账户快照里没有它们,若只按现金算会漏算 7 万、并误判「债券档没配过」。 正确:总金融资产 = 现金类 + 已持基金现值,再减应急金与专项。 模板已内置 HOLD(含代码/类型/归属档/现值/赎回约束)→ HOLD_BY_LEG / HOLD_TOTAL / TOTAL_ASSETS; 该档金额与「已超配」判定写进每月表脚注与主表的「现在该怎么做」列(金额表本身只讲每月动作)。 ⚠️ 锁仓与赎回费是硬约束,必须查清并写进报告(013225 每份锁定一年 → 2027-07-10 前不可赎; 001235 满 6 个月免赎回费 → 2027-01-10)。超配且锁仓时,正解是「该档停买、靠新钱摊薄」,不是赎回。

⑫ 🔴 报告只讲「每月怎么办」,不摆"存量盘点"(2026-10-08 用户明确:「合并整理一下吧,看着还是太乱了… 目标金额能不能换个说法…你别考虑我现有存款了,只根据我以后的收支,告诉我每月应该怎么办就行」): 关键认知:月结余 = 收入 − 支出,与"有多少存款"无关 → 整块静态盘点(总资产 / 可配置资产 / 目标金额 / 已持有 / 还差 / 敏感性 / 配比漂移自证)全部删除,正文只留一张表: 资产 / 每月投(元)/ 怎么投 + 一行脚注(债券为何暂停、唯一会停的情况)。 ⚠️ 禁用「目标金额」这个词(用户明确说看着乱);也不要再在表下写大段 insight。 账户口径(CAP_* / HOLD / RES_* / TOTAL_ASSETS / CAPITAL / AMT)保留在模板里作数据留档、 本期不渲染,并已注明"日后要恢复存量视角按此口径算回来"。 ⚠️ 同理:MAIN 里"现在该怎么做"列若出现"这一档的目标金额…"这类说法,也要改成动作导向(如「本档暂停买入」)。

版本沿革:v2 合并总表换资产(删港股高股息与大A板块,加 REITs、可转债)→ v3 删 A股宽基(同窗口实测落后标普500 16.8pct/年、回撤还大 13pct)→ v5 删 REITs / 美债 / 可转债(只剩 5 类,有效性锚点 6 → 5 个)→ v6 加场外基金代码 + 「QDII 额度是硬约束」警示 → v7 接受额度限制并据此定策略 + 估值与股息率速查 → v8 大幅精简(8 区块 13 表 → 4 区块 6 表,删掉全部"去哪儿查"教程)→ v9 执行总表加「现在该怎么做」列、清除行话「腿」→ v10~v12 页面宽度四轮收敛至 1200px → v13 整份重排(4 区块 → 5 节、编号即阅读顺序;删掉三节教学性内容与重复 insight,可见正文 −16%)。

模板约定与 CLI/数据坑清单(详见 references/)

生成任何报告前必读:视觉/口径/纪律约定与全部 CLI/数据/模板坑统一收在 references/ 三份文档。SKILL.md 能力正文只保留与能力强绑定的要点与「坑 N」编号引用,不再维护长清单:

| 文档 | 内容 | 维护规则 | |---|---|---| | references/模板约定.md | 主题配色 / 顶部两栏盒子与 KPI 行的自适应布局规范(含 L1/L2 检查) / 百分比口径 / 数据标注 / 免责 / 命名 / 输出目录通用性(禁个人路径)/ 报告期参数化 / 编号与占位符唯一性 / 零硬编码残留 / insight 凸显 | 新约定加在此文件 | | references/CLI与数据坑清单.md | 获取数据/模板类坑 1-43(每坑含适用能力+实测日期)+ 其他已知坑 | 新踩的坑追加 44+ 并递增编号 | | references/回测引擎指南.md | 能力 #1 回测引擎专项(数据初始化 / 引擎参数 / 产物规范) | 引擎改动同步 | | references/荐股复盘指南.md | 能力 #12 的策略有效性校验:复盘口径(建仓=次日开盘/基准改为全市场等权/三条样本局限)、scripts/review_picks.py 用法(含分期超额,CLI 不可用自动回落本地库)、历史报告解析的两个致命坑(验证前/验证后版本、必须匹配推荐卡结构)、首次复盘(20 笔)结论 + 第二次复盘(55 笔)结论、「事后归因 ≠ 可执行规则」方法论 | 每轮复盘后追加新一节的结论 | | references/构建个人量化平台指南.md | 附加功能(非能力):把本技能的 gen_*.py 当作渲染模板,在自己电脑上搭一套本地 Web 平台逐能力浏览报告——架构决策 / 数据区契约 / 日期与新鲜度门禁 / 前端要点 / 验证方法论(含产物文件名契约,见指南 §4.5) / 环境铁律与坑速查 | 平台方案或坑更新时同步 | | references/价值投资指南.md | 能力 #13 的框架与证据:六位作者 → 规则映射、「定投 vs 低价买入 vs 一次性配置」的核心判据、资产→操作方式映射表、实测证据(A~E 五种口径 + 结论叙述口径 5 条)、股息率/PE/PB 分位怎么看(含 ETF 与免费查询渠道)、有效性机制、三档配比与再平衡、已知边界、报告结构定稿(5 节)与每次简化删了什么 | 改判据 / 配比 / 证据口径 / 报告结构时同步 |

正文引用约定:SKILL.md 中「坑 N」即指 CLI与数据坑清单.md 编号条目;「模板约定/命名/insight」类要求即指 模板约定.md。

附加功能:把能力报告搬到自己的电脑上浏览(非能力,可选)

本节不是一个能力,而是一个可选的附加玩法:本技能的 13 类报告都是自包含 HTML(样式内联、无外部依赖),把 scripts/gen_*.py 当作渲染模板、用一个本地小后端驱动,就能得到一个可点击浏览的个人量化平台。

触发场景:用户提出「把 skill 的报告做成一个能浏览的网站 / 本地平台」「想有个界面点点看,不想每次敲命令」「把各能力的报告统一到一个页面里」这类需求时,再读本节的指向文档。

核心原则(务必遵守):不要用前端重新实现报告的排版——那条路必然产生结构与视觉漂移(本项目最初就是这么走错的,被用户连续三次指出"和 skill 生成的不一样、是自己编的")。正确做法是让平台充当本技能脚本的宿主:

后端算出「数据区」→ 注入 gen_*.py → 子进程运行该脚本 → 取它产出的 HTML → 前端原样呈现(iframe srcDoc)

这样平台页面与本技能直接生成的报告在结构与样式上逐字节一致(可用 <style> 逐字节比对 + class 多重集比对来证明)。

要读的文档:references/构建个人量化平台指南.md —— 覆盖模块设计(registry / splicer / runner / skillenv / laststore)、数据区契约与占位符差集自检、日期三口径与新鲜度门禁、模板参数化规范、前端双模式(只看上次结果 / 点「生成」才重算)、验证方法论(结构一致性、skill 安全性回归、浏览器级 E2E、"HTTP 契约全绿≠页面正确"),以及环境铁律与坑速查表(含沙箱批量删除守卫、本地 DuckDB 单文件锁与多进程抢锁、前端构建 cwd 坑、Python/Node 依赖被系统策略拦截的绕法)。

开工顺序建议:先读该指南的「从零复刻步骤清单」和「坑速查表」两节,再动手。