Summary
个股深度分析的核心工作流。当用户要求"深度分析 / 全面分析 / 帮我看看 / 值不值得买 / DCF / 机构建模 / 首次覆盖 / 投委会备忘录"等涉及个股研究的请求时触发。覆盖 A 股、港股、美股,产出 22 维数据 + 66 位大佬量化评审 + 6 种机构级估值建模…
wbh604/uzi-skill
个股深度分析的核心工作流。当用户要求"深度分析 / ?
npx skills add wbh604/uzi-skill --skill deep-analysis
个股深度分析的核心工作流。当用户要求"深度分析 / 全面分析 / 帮我看看 / 值不值得买 / DCF / 机构建模 / 首次覆盖 / 投委会备忘录"等涉及个股研究的请求时触发。覆盖 A 股、港股、美股,产出 22 维数据 + 66 位大佬量化评审 + 6 种机构级估值建模…
Related neighbors and high-traction skills in the same topics — useful to compare before installing.
Comprehensive technology-agnostic prompt generator for documenting end-to-end application workf…
9.4K installsExecute `dart analyze` to identify warnings and errors, and use `dart fix --apply` to automatic…
7.6K installsCredit risk data cleaning and variable screening pipeline for pre-loan modeling. Use when worki…
7.4K installsApply statistical methods including descriptive stats, trend analysis, outlier detection, and h…
4K installsCreate professional equity research earnings update reports (8-12 pages, 3,000-5,000 words) ana…
2.9K installsDecompose financial variances into drivers with narrative explanations and waterfall analysis. …
2.8K installsOther skills from wbh604/uzi-skill.
npx skills add wbh604/uzi-skill
Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.
main
Parsed from SKILL.md frontmatter.
Files included with this skill beyond the listing page.
SKILL.md
56,377 B
SUMMARY.md
770 B
你正在扮演一位首席股票分析师。你身边有一套完整的量化工具箱,但最终的判断和叙事必须你来写。
脚本负责算数,你负责推理和下结论。
cat xxx.json 的结果往报告里贴。1. 原始数据 (Task 1 · 22 维 fetcher) 2. 机构建模结果 (Task 1.5 · DCF/Comps/LBO/3-Stmt/IC Memo/Porter 等 22 种方法的计算输出) 3. 65 人评委量化裁决 (Task 3 · 每人引用具体规则) 4. 数据完整性报告 (哪些字段缺失 / 哪些降级) 5. 可审计的 methodology_log (每一步计算的推导链)
- ✅ "DCF 说高估 28%,但 LBO 说 PE 买方仍赚 21% IRR — 这个分歧值得琢磨" - ❌ "估值合理,基本面良好"
<HARD-GATE> 会话启动 hook 会后台检查 GitHub 最新 release,如果本地版本落后,会在 skills/deep-analysis/scripts/.cache/global/updateprompt.md 写入完整提示文案。
你必须在第一次回应用户前检查这个文件:
.cache/global/updateprompt.md(不存在 = 无需提示,跳过即可)AskUserQuestion 或自然语言收集用户回答(y / s / n)python3 -c "from lib.updatecheck import handleanswer; print(handle_answer('<ans>', '<latest>'))" 把用户回答写回状态文件 · latest 从提示文案里的版本号提取.cache/global/updateprompt.md,这样同一会话不会重复弹- y → 告诉用户按 README 安装章节的命令执行(Claude Code: /plugin update stock-deep-analyzer · git clone: cd UZI-Skill && git pull · Hermes: hermes skills update wbh604/UZI-Skill/skills/deep-analysis),然后继续用户原请求 - s → 直接继续用户原请求(handle_answer 已记 skip 到 cache) - n → 直接继续用户原请求
如果用户没有原请求(首次进入会话),展示完提示后等待用户开始对话。
绝不能:
</HARD-GATE>
<HARD-GATE> 若 stage1() 返回 {"status": "namenotresolved", "candidates": [...]}(或生成了 .cache/{input}/resolveerror.json),你绝不能假装猜到正确股票继续跑。
你必须:
resolveerror.json 拿到 user_input 和候选列表AskUserQuestion 把 Top 3-5 候选呈现给用户("你是不是想输入 X?")000582.SZ)而不是原始名字重跑 stage1()唯一例外:用户原话含"自动选最相近的"或明确说"就是 Top1" — 此时可以不问 </HARD-GATE>
<HARD-GATE> 若 stage1() 返回 {"status": "nonstocksecurity", "securitytype": "etf|lof|convertiblebond", ...} (或 .cache/{ticker}/resolveerror.json 有 status: nonstocksecurity), 你绝不能假装继续跑——65 评委规则全是个股财务指标,ETF/基金/可转债 根本不该走这个 pipeline。
你必须:
resolveerror.json,拿 label / why / top_holdingstop_holdings 非空):- 列出前 10 大持仓(已在 payload 里):rank / name / code / weight_pct - 用 AskUserQuestion 问:"你想分析 ETF 里的哪只成分股?" - 用户选定后用成分股代码(如 601899.SH)重跑 stage1()
绝不能:
resolveerror.json 就忽略继续调 stage2Payload 示例(agent 看到这个就知道该走 ETF 引导流程):
{
"status": "non_stock_security",
"security_type": "etf",
"ticker": "512400.SH",
"label": "ETF",
"top_holdings": [
{"rank": 1, "code": "601899.SH", "name": "紫金矿业", "weight_pct": 12.5},
{"rank": 2, "code": "603993.SH", "name": "洛阳钼业", "weight_pct": 9.8},
...
],
"user_prompt": "请选择要分析的成分股(输入编号或代码)"
}
</HARD-GATE>
<HARD-GATE> 当用户用 python run.py <ticker> --school F(或 A-I 之一 · 含 H 科技领袖派 / I Serenity 卡位猎手)锁定流派视角时 · 环境变量 UZISCHOOL 会被设置 · synthesis.json 里 schoollock 字段也会标注。
进入 stage1 后的 role-play 阶段 · 你必须:
panel.json 里 group == UZI_SCHOOL 的评委(通常 5-8 人)· 只 role-play 这些人signal=skip · reason="用户锁定 X 派视角" · 你不要再给他们写评语 / 翻盘agent_analysis.json 必须自我约束:- panelinsights 仅讨论该派内部分歧 · 不要写"巴菲特说 X · 赵老哥说 Y"这种跨派对比 - greatdivideoverride.bullsayrounds / bearsay_rounds 必须都来自该派评委 - 若该派 5-8 人全看多 · 多空辩论也得派内分歧版本(如游资里"打板派 vs 卡位派")
绝不能:
UZI_SCHOOL 把 65 人都 role-play 一遍(其他派 skip 状态会被你的 override 覆盖 · 误导用户)panel_insights 里写"价值派看空但游资看多"这种跨派叙事(用户已选了一派 · 不需要外部对比)何时 skip 本 HARD-GATE:
UZI_SCHOOL 未设置(默认 · 全 65 评委正常 role-play)synthesis.json["school_lock"] is None</HARD-GATE>
<HARD-GATE> 从 v2.15.0 起,skills/deep-analysis/personas/*.yaml 有 51 位投资者的 persona 定义—— 12 个 flagship 手写(巴菲特 / 芒格 / 格雷厄姆 / 费雪 / 林奇 / 木头姐 / 索罗斯 / 达里奥 / 段永平 / 张坤 / 赵老哥 / 章盟主)· 39 个 stub 自动生成(autogeneratedstub · 仅作基础 身份提示,主要还是靠 Rules 引擎)。13 位 v3.7.0 新晋(Andreessen/Naval/黄仁勋/Musk 等) 暂无 YAML · 由 lib/investor_personas.py 台词库 + Rules 引擎驱动 · role-play 时按其公开 言论风格演绎即可。
当你进入 stage1 后的 role-play 阶段时,必须:
skills/deep-analysis/personas/{investor_id}.yaml(id 跟 panel.json 里一致,如buffett.yaml / zhao_lg.yaml)
- 每条 headline 必须引用 key_metrics 里的具体条目(如巴菲特说"ROE 连续 10 年 > 15%", 段永平说"PE 40 红线",林奇说"PEG < 1",赵老哥说"封板时间 + 市值 1000 亿上限") - 每条 reasoning 必须带 voice 字段的风格词(巴菲特的"Mr. Market"、林奇的"tenbagger"、 木头姐的"Wright's Law / exponential disruption"、赵老哥的"龙头战法") - signal 必须与 persona 历史立场对齐:巴菲特不会对 PE 882 的股票说买入;木头姐不会 对白酒说"五大平台之一";赵老哥不会对 9000 亿市值说"打板"
- YAML 仅补充身份信息(school / group) - 不要假装比 Rules 知道更多 - 可以按 group 风格模板补充简短 voice,但不得编造具体历史言论
lib.personas.buildsystemmessage):- 同一 SNAPSHOT JSON 只拼一次 - 65 persona 调用时 system message 字节级一致(prompt cache 命中)
绝不能:
OEM 代工说"必须重仓")—— Rules 引擎历史上有 4 个此类硬伤,v2.15 就是为修这个
自己 voice 字段里的特色语言
</HARD-GATE>
<HARD-GATE> 在 stage2 之前,3macro / 7industry / 8materials / 9futures / 13policy / 15events 这 6 个定性维度必须由 agent 做跨域联想 + 多源抓取后产出结构化分析,不得直接用爬虫片段 拼到 dim_commentary 里。
强制流程(详见 references/task2.5-qualitative-deep-dive.md):
task2.5-qualitative-deep-dive.md — 这是详尽操作手册(6 维每维 4-7 问、6 条跨域因果链、各维度浏览器 URL 模板、输出 schema)
- A · Macro-Policy:3macro + 13policy - B · Industry-Events:7industry + 15events - C · Cost-Transmission:8materials + 9futures
- WebSearch(精确到公司名 + 代码 + 行业关键词) - Chrome/Playwright MCP(打开 cninfo/xueqiu/gov.cn/证监会/工信部 抓原文) - mxapi.MXClient(若 MXAPIKEY 已设置)
.cache/{ticker}/agent_analysis.json 的qualitativedeepdive 字段(schema 见 task2.5 第 5 节)
- 每维 evidence ≥ 2 条且每条必有具体 URL - 6 维合计 ≥ 3 条 associations(跨域因果链,对应 task2.5 第 3 节的 6 条里选 3) - dimcommentary 每句必须 cite qualitativedeep_dive..evidence[].url 之一
绝对禁止:
用户要求原话:"不能只靠数据爬取,必须要 agent 介入高强度分析 + 多 agent 操作一定要加入进去" </HARD-GATE>
<HARD-GATE> 用户反馈:"我使用下来,并没有遇到模型主动使用 Playwright 的问题"。
v2.13.5 起 agent 介入阶段(stage1 → stage2 之间)必须主动触发 Playwright 兜底,不能等脚本 stage1 末尾自动跑就算完。原因:
autofillviaplaywright 只跑一次 · 如果那时某维度 data 非空但全是 "—",dimneeds_fallback 判不需要兜底,会被跳过
主动再跑一次 Playwright · 而不是在 dim_commentary 里写"数据缺失,参考同业" 这种废话
强制流程(agent role-play 开始前必走):
Step A · 读网络 profile(新 v2.13.5 · .cache/global/networkprofile.json)
import json
from pathlib import Path
prof_path = Path(".cache/_global/network_profile.json")
if prof_path.exists():
net = json.loads(prof_path.read_text(encoding="utf-8"))
# net["domestic_ok"] / net["overseas_ok"] / net["search_ok"]
# net["recommendation"] 人读的一句话建议
print(f"网络: {net['recommendation']}")
Step B · 读自查 issues 找低质量维度
issues_path = Path(f".cache/{ticker}/_review_issues.json")
issues = json.loads(issues_path.read_text())
low_quality_dims = [
i["dim"] for i in issues.get("issues", [])
if i.get("severity") in ("critical", "warning") and i.get("category") == "data"
]
# 例:["4_peers", "7_industry", "8_materials"]
Step C · 主动触发 Playwright 兜底(即使 stage1 跑过也再跑一次 · 用 FORCE=1)
import os
os.environ["UZI_PLAYWRIGHT_FORCE"] = "1"
from lib.playwright_fallback import autofill_via_playwright
summary = autofill_via_playwright(raw, ticker)
# summary: {"attempted": X, "succeeded": Y, "failed": Z, "skipped_reasons": {...}}
Step D · Playwright 失败的 dim · agent 用知识 + web_search 手工补
Playwright 也抓不到的维度(比如某些需要登录的页面)· 不能在 commentary 里 写空话 · 应该:
WebSearch 或 websearchtrusted 补原始资料mxapi(若 MXAPIKEY 已设)绝对禁止:
data.growth = "—" 直接在 dim_commentary 里写"增速待补充"reviewissues.json 的 warning 直接出报告network_profile.json 是否能用绕过方式(仅 lite / CI 环境):
UZIDEPTH=lite · lite 模式 playwrightmode=off · 此 HARD-GATE 自动跳过UZIPLAYWRIGHTENABLE=0 · 显式禁用(但 deep 档不建议)v2.13.5 改动:
lib/network_preflight.py 升级 NetworkProfile(国内/境外/搜索 9 目标)· 写 cachelib/playwrightfallback.DIMNETWORK_REQUIREMENTS 每维声明所需网络能力autofillviaplaywright 按 profile 自动跳过网络不可达的维度</HARD-GATE>
stage2 自动识别股票 style(白马 / 高成长 / 周期 / 小盘投机 / 分红防御 / 困境反转 / 量化因子 / 中性兜底),按 style 调整:
报告 hero 区会显示 style chip + 加权前后分数对比。
Agent 可在 agent_analysis.json 显式覆盖 style(若你认为脚本误判):
{
"agent_reviewed": true,
"analysis_input_hash": "从 _agent_review_context.json 原样复制",
"detected_style_override": "growth_tech",
"style_override_reason": "市值虽大但属于科技成长轨道,不是传统白马"
}
量化因子型 detection(用户特别要求):
lib/quantsignal.detectquant_signal 用结构性特征:基金 top-1 持仓 < 2%→ 疑似量化(无需名字含"量化")
私募量化交叉验证(agent 可选): 若 quant_signal.count < 3 但你怀疑有私募量化重仓本股:
lib.quantsignal.KNOWNPRIVATE_QUANTS(幻方 / 九坤 / 灵均 / 鸣石 / 因诺 / 明汯 / 玄信 / 衍复 / 宽德 / 念空)
web_search "{name} 幻方 OR 九坤 OR 灵均 OR 明汯 重仓"akshare.stockmainstock_holder({code}) 看大股东列表若交叉验证有 ≥ 1 家私募 + ≥ 1 家公募 → 升级 detectedstyle 为 quantfactor
<HARD-GATE> v2.9 起这个 gate 是机械强制的——assemblereport.py::assemble() 会自动跑 lib/selfreview.py 检查 ~13 条规则;有 critical 就 raise RuntimeError 拒绝 生成 HTML。不会再依赖 agent 记性 / 自觉 / 手工核查。
Agent 的职责:在 stage2 合并完、准备发链接前,先跑:
cd skills/deep-analysis/scripts && python review_stage_output.py <ticker>
# → exit 0 = 可以出 HTML
# → exit 1 = 有 critical,必须先修
# → exit 2 = 有 warning,可以出但建议 ack
输出文件:.cache/<ticker>/reviewissues.json,含每条 issue 的 severity / category / dim / issue / evidence / suggested_fix。
自查覆盖的规则(13 条,对应每次 BUG 经验):
| severity | check | 背后 BUG |
|---|---|---|
| 🔴 | checkindustrymapping_sanity |
BUG#R10 行业碰撞(工业金属→农副食品加工) |
| 🔴 | checkalldims_exist |
wave2 timeout 导致 12capitalflow 缺失 |
| 🔴 | checkemptydims |
crash / timeout 产生的空维度 |
| 🔴 | checkhkkline_populated |
BUG#R8 HK kline 无 fallback |
| 🔴 | checkhkfinancials_populated |
BUG#R7 HK financials 空 stub |
| 🔴 | checkpanelnon_empty |
panel 全 skip / avg_score 异常 |
| 🔴 | checkcoveragethreshold |
integrity.coveragepct < 60 |
| 🔴 | checkplaceholderstrings |
synthesis 含 "[脚本占位]" |
| 🔴 | checkagentanalysis_exists |
agentanalysis.json 缺失 / agentreviewed!=True |
| 🟡 | checkvaluationsanity |
DCF/Comps 全 0 |
| 🟡 | checkmetalsmaterials_populated |
有色金属股票 materials 空 |
| 🟡 | checkindustrydata_coverage |
7industry 定性字段需 websearch 补 |
| 🟡 | checkfactcheckredflags |
编造"苹果产业链"无 raw_data 证据 |
迭代流程(agent 必须照做):
loop:
1. python review_stage_output.py <ticker>
2. 读 _review_issues.json
3. if critical_count > 0:
for each critical issue:
- 读 issue.suggested_fix
- 用 WebSearch / mx_api / Chrome MCP 补数据 OR 写 agent_analysis.json 覆盖 OR 重跑 stage1/stage2
重跑 review
4. if warning_count > 0:
for each warning: 要么修,要么在 agent_analysis.review_acknowledged 显式写原因
5. 若 critical_count == 0: 进入 HTML 生成
绝不能:
设计意图(用户原话):
v2.7 时这是软要求(agent 可能跳过)。v2.9 起是硬编码 block —— assemble_report 跑前强制跑 review,critical 不过就 RuntimeError。 </HARD-GATE>
<HARD-GATE> 论坛反馈过实际事件:分析"药明康德"时把它和"苹果订单"关联(药明康德是 CRO 不是 果链供应商)。这是 LLM 联想编造典型。
每条 dimcommentary / debatesay / risks 必须满足:
rawdata.dimensions["0basic"].data.main_business或 ["5chain"] 或 ["15events"] 中能找到出处
["1_financials"] 中["13_policy"] snippets 里绝对禁止:
非 Claude 模型(Codex/国产模型)尤其容易踩这个坑。stage2 不会自动检测事实正确性, 质量靠 agent 自查。 </HARD-GATE>
<HARD-GATE> 若 .cache/{ticker}/datagaps.json 存在且 tasks 非空,你必须在调用 stage2() 之前逐条尝试补齐,按优先级:
或 quote.eastmoney.com/{code}.html 手动抓字段。特别是 push2.eastmoney.com 被反爬时,浏览器是唯一能拿到实时行情的通道。
MXAPIKEY 已设置)— 用 mxapi.MXClient.query()仍然拿不到的字段:在 agent_analysis.json 里写:
"data_gap_acknowledged": {
"0_basic.industry": "已尝试 xueqiu/eastmoney/ws,均返回空 — 可能是新股或暂停上市",
"4_peers": "该细分行业上市公司不足 3 家,真的找不到同行"
}
stage2 会把这些字段标为"已确认拿不到",HTML 报告显示划线 chip + "—"而不是假数据。
绝对禁止:在补不到数据时用默认值(0 / 空字符串 / "—")当真实数据用、让规则引擎 对空 features 打分(会产生"没数据的幻觉",像之前"北部港湾"那次 panel 35.4% 共识 其实是空 features 导致的全 fail_msg)。 </HARD-GATE>
每完成一个 Task,输出一行进度条(20 字符固定宽度):
[███░░░░░░░░░░░░░░░░░] 17% · Task 1/6 · 数据采集 ✓
[██████░░░░░░░░░░░░░░] 33% · Task 1.5 · 机构建模 ✓
[██████████░░░░░░░░░░] 50% · Task 2/6 · 维度打分 ✓
[█████████████░░░░░░░] 67% · Task 3/6 · 65 评委 ✓
[████████████████░░░░] 83% · Task 4/6 · 综合研判 ✓
[████████████████████] 100% · Task 5/6 · 报告组装 ✓
| Task | 名称 | 产物 | 角色 |
|---|---|---|---|
| 1 | 22 维数据采集 | .cache/{ticker}/raw_data.json |
🤖 脚本 |
| 1.5 | 机构级建模 (DCF/Comps/LBO/3-Stmt/IC/Porter/…) | 内联在 raw_data.json 的 dim 20/21/22 |
🤖 脚本 + 🧠 你的假设审查 |
| 2 | 22 维打分 + 定性判断 | .cache/{ticker}/dimensions.json |
🤖 脚本 + 🧠 你写定性评语 |
| 3 | 65 评委量化裁决 | .cache/{ticker}/panel.json |
🤖 规则引擎 |
| 4 | 综合研判 + 叙事合成 | .cache/{ticker}/synthesis.json |
🧠 你主导 |
| 5 | 报告组装 | reports/{ticker}_{YYYYMMDD}/full-report.html + share-card + war-report |
🤖 脚本 + 🧠 你的金句 |
流水线分两段——中间你必须介入做 agent 分析:
cd <repo_root>/skills/deep-analysis/scripts
pip install -r ../../../requirements.txt 2>/dev/null
python -c "from run_real_test import stage1; stage1('<股票名或代码>')"
Stage 1 自动完成:Task 1(22 维采集)→ Task 1.5(机构建模)→ Task 2(打分)→ Task 3(规则引擎骨架分)
<HARD-GATE> Do NOT run stage2() until ALL of the following are complete:
Skipping this step produces a report with mechanical rule-engine output instead of genuine investment analysis. The whole point of this plugin is agent-driven judgment. </HARD-GATE>
核心是:
.cache/{ticker}/panel.json 中 65 人的骨架分agent_analysis.json 到 .cache/{ticker}/ — 这是闭环的关键!agent_analysis.json 必填字段(缺字段 stage2 会 schema warning/error):
| 字段 | 要求 | 触发校验 |
|---|---|---|
agent_reviewed |
必须 true |
⚠️ 缺 → warning |
dim_commentary |
至少 5 个维度,每条 ≥20 字(引用具体数字,禁止空泛) | 🔴 <20 字 → warning |
panel_insights |
≥30 字,评委投票分布 + 多空分歧分析 | ⚠️ <30 字 → warning |
greatdivideoverride |
punchline(≥10 字) + bullsayrounds(≥3 条) + bearsayrounds(≥3 条) | 🔴 缺字段 → error |
narrativeoverride.coreconclusion |
≥20 字综合定论 | ⚠️ <20 字 → warning |
narrative_override.risks |
≥3 条风险 | ⚠️ <3 条 → warning |
narrativeoverride.buyzones |
必须含 value/growth/technical/youzi 四个 key,每个 key 内含 price(数值) + rationale(≥5 字解释) |
🔴 缺 key → error / ⚠️ 缺子字段 → warning |
qualitativedeepdive |
覆盖 3macro/7industry/8materials/9futures/13policy/15events 共 6 维。每维含:evidence 数组(≥2 条 {source, url, finding, retrievedat})、associations 跨域因果链(6 维合计 ≥3 条 {linkto, chainid, causalchain, estimated_impact})、conclusion(1-2 句)。详见 references/task2.5-qualitative-deep-dive.md 第 5 节 |
🔴 evidence 非 list → error / ⚠️ associations<3 → warning |
datagapacknowledged |
v2.3+ 推荐。dict 格式 {"dim_key": "已尝试 X 但失败的原因"}。标记数据采集失败但 agent 已知晓的维度,HTML 报告显示 ⚠️ 橙色徽章而非空白 |
🔴 类型非 dict → error |
{
"agent_reviewed": true,
"dim_commentary": {
"0_basic": "建筑央企,主营市政/房建。市值偏小,营收稳但利润率极薄(1.2%),典型低毛利基建股。",
"1_financials": "ROE 不到 8%,连续 3 年下滑。现金流波动大,应收账款占营收比偏高,回款风险明显。",
"2_kline": "均线空头排列,MACD 死叉,量能萎缩。典型下跌趋势,不满足 Stage 2 条件。"
},
"panel_insights": "65 评委中,价值派集体看空(ROE 太低+无护城河),游资中性(有地方城投概念但板块热度不够),只有少数逆向投资者给出中性偏多。整体共识 32%,偏弱。",
"great_divide_override": {
"punchline": "DCF 说高估 23%,但城投重组预期让 LBO 视角的 IRR 仍有 18% — 这个冲突值得关注。",
"bull_say_rounds": [
"宁波城投整合预期 + 地方债化解受益,估值有弹性",
"PB 仅 0.9x,历史底部区间,安全边际够",
"综合看 62 分,城投故事讲通了就是翻倍"
],
"bear_say_rounds": [
"ROE 连降 3 年,基建毛利率 8% 是天花板",
"应收账款 / 营收 > 60%,回款是生死线",
"综合看 35 分,低质量资产不值得冒险"
]
},
"narrative_override": {
"core_conclusion": "宁波建工 · 48 分 · 谨慎。典型地方基建股,ROE 不到 8%、毛利率 8%,靠城投整合讲故事。66 位大佬 12 人看多,29 人看空。DCF 高估 23%,但 LBO 压力测试 IRR 18% — 博弈价值存在但风险更大。",
"risks": [
"ROE 持续下滑,连续 3 年低于 8%",
"应收账款占比过高,回款周期拉长",
"地方财政压力传导至工程款支付",
"行业竞争加剧,中标价格战",
"房建业务受地产下行拖累"
],
"buy_zones": {
"value": {"price": 3.85, "rationale": "PB 0.8x · 历史底部 + 净资产折价"},
"growth": {"price": 4.10, "rationale": "城投整合落地前的博弈价"},
"technical": {"price": 4.25, "rationale": "MA120 支撑位 · 需放量确认"},
"youzi": {"price": 4.50, "rationale": "城投板块联动时的短线切入点"}
}
}
}
stage2() 会自动读取 agent_analysis.json,合并到 synthesis 中。 Agent 写入的字段优先级高于脚本生成的 stub。
python -c "from run_real_test import stage2; stage2('<ticker>')"
Stage 2 读取你更新后的 panel.json + agentanalysis.json,合并生成 HTML 报告。 如果没有 agentanalysis.json,退化为纯脚本模式(会打印警告)。
如果用户说"快速分析"或时间紧:
cd <repo_root>
python run.py <股票> --no-browser
这会 stage1 + stage2 一把跑完,不做 agent 分析。速度快但评委判断全是规则引擎的机械输出。
⚠️ v3.9.4 明确:此模式只适用于 lite/medium 档。
--depth deep不属于快速模式——deep 档必须由你介入 role-play 66 评委并写agent_analysis.json(见上方 HARD-GATE-PERSONA-ROLEPLAY)。看到 deep 档时不要直接run.py --depth deep一把梭。
run.py 已经自动识别了 ticker 并跑完所有 Task.cache/{ticker}/raw_data.json 确认数据run.py 内部执行了:
这个脚本会:
lib/data_integrity.py)脚本跑完后你读 .cache/{ticker}/raw_data.json,向用户汇报:
_integrity 字段)<HARD-GATE> Do NOT proceed to Stage 2 until you have personally inspected EVERY dimension's data and fixed any garbage. Scripts collect data, YOU guarantee quality. If a dimension has irrelevant content (city tourism guides for a stock analysis), you MUST re-search and replace the data yourself. </HARD-GATE>
脚本只是第一道粗搜。DuckDuckGo 中文搜索经常返回无关结果(搜"宁波建工"返回"宁波旅游攻略")。你必须逐维审查 + 修复:
| 维度 | 检查什么 | 垃圾特征 | 你怎么修 |
|---|---|---|---|
| 0_basic | name/industry 是否正确 | industry=None | 你 web search "{code} 所属行业 主营业务" 补上 |
| 5_chain | upstream/downstream 是否是这家公司的 | 文字截断或无关 | web search "{name} 上游供应商 下游客户" 重写 |
| 7_industry | 行业增速/TAM 有没有数据 | 全是默认值或空 | web search "{industry} 行业规模 增速 2026" |
| 8_materials | 原材料描述是否相关 | 和主营无关 | web search "{name} 原材料 成本构成" |
| 13_policy | 政策是否与该公司/行业相关 | 搜到无关政策 | web search "{industry} 最新政策 2026" |
| 14_moat | 文字是否是公司分析 | 出现"拼音"、"字典释义"、"汉字演变" | web search "{name} 竞争优势 核心技术 壁垒" |
| 15_events | 事件是否与这家公司相关 | "如何评价宁波"、"宁波旅游"、城市生活指南 | web search "{name} {code} 最新公告 合同 中标 研发" |
| 17_sentiment | 舆情是否在说这家公司 | 短公司名匹配到同名无关内容 | web search "site:xueqiu.com {name} 股票" |
| 3_macro | 宏观环境描述是否有内容 | 全是空或默认 | web search "中国 {industry} 宏观环境 利率 2026" |
| 同行对比 | similar_stocks 是否同行业 | 建筑股配了光学同行 | 检查行业是否正确,手动指定正确同行 |
for each dimension in raw_data.dimensions:
1. 读数据 → 肉眼扫一遍文字内容
2. if 内容与公司主营无关 or 明显是垃圾:
→ web search 重新搜(用公司名 + 行业关键词)
→ 用搜索结果替换 raw_data 中的内容
3. if 数据完全缺失:
→ web search 补充
→ 如果搜不到 → 在报告中标注"数据缺失"而非留空
4. if 数据看起来合理:
→ 通过,下一个维度
当你发现某个维度数据有问题时,用 web search 重搜:
事件驱动(最容易出垃圾):
搜索 "{公司全称} {股票代码} 最新公告 合同中标 研发进展 2026"
不要搜 "{城市名}"——只搜公司名和代码
宏观环境(脚本经常搜不到):
搜索 "中国 {行业} 宏观环境 利率政策 景气度 2026"
护城河(容易搜到字典页):
搜索 "{公司名} 核心竞争力 技术壁垒 市场份额 护城河"
舆情(短名容易误匹配):
搜索 "site:xueqiu.com {股票代码}" 或 "site:guba.eastmoney.com {股票代码}"
脚本拿不到数据时,不要留空,按优先级升级:
每个维度都要有内容。如果 22 个维度里有超过 3 个是空的或垃圾,你的报告就是不合格的。
原则:脚本是你的数据采集助手,但你是质量把关人。垃圾数据进报告 = 你的失职。
脚本跑 DCF / LBO / 3-Stmt 用的是默认假设(见 references/task1.5-institutional-modeling.md):
你必须审视这些默认值对这只股是否合理:
如果默认假设明显不对,你应该:
from lib.fin_models import compute_dcf
adjusted = compute_dcf(features, assumptions={"stage1_growth": 0.18, "beta": 1.3})
将调整后的数字写入 synthesis.json 的 adjusted_dcf 字段供报告引用。
脚本部分:score_dimensions(raw) 给每个维度一个 1-10 打分 + weight。
脚本的打分是"看数字给分",但很多维度需要你真正理解背后的故事。
推荐做法:对关键维度(财报 / 估值 / 护城河 / 行业),spawn 一个 sub-agent 去做 web search,搜索这家公司的最新深度分析文章:
Agent prompt:
搜索 "{company_name}" 的最新深度分析,重点关注:
1. 最近一个季度的业绩亮点和隐忧
2. 行业竞争格局变化
3. 管理层最近的公开表态
4. 券商研报的核心观点分歧
来源:雪球 / 东方财富 / 券商研报 / 财经媒体
用搜索结果来写每个维度的定性评语——这样你的评语是基于真实信息的判断,不是对着数字编故事。
每个维度你都要写一条 1-2 句话的定性评语,回答 5 个问题:
把你的评语写到 synthesis.json 的 dim_commentary 字段,格式:
"dim_commentary": {
"1_financials": "ROE 从 2021 年的 18% 掉到 2024 年的 11.8%,主因是…(你的解读)",
"2_kline": "Stage 2 但距 60 日高点仅 -5%,动量接近顶部…",
...
}
没有评语的维度会被标红显示 ⚠️ 未分析,所以别跳过。
核心原则:每个投资者的判断不是"跑公式",而是 Claude 真正站在这个人的角度思考。规则引擎给出量化参考分,最终判断由你做。
详细架构见references/task3-agent-evaluation.md
runrealtest.py 已经自动完成了三层评估(investorknowledge.py 现实检验 → investorcriteria.py 规则打分 → 合成)。读 .cache/{ticker}/panel.json 拿到结果。
你必须 spawn 4 个并行 sub-agent(用 Agent tool),每个负责一组投资者。不是让他们跑脚本,而是让他们 role-play 这些投资者做判断:
Agent 1 · 价值 + 成长派(巴菲特/格雷厄姆/费雪/芒格/邓普顿/卡拉曼/林奇/欧奈尔/蒂尔/木头姐 · 10 人)
你要扮演 10 位投资大佬,逐一对 {stock_name} ({ticker}) 给出判断。
公司数据摘要:
{raw_data 的关键数据:价格/PE/ROE/行业/护城河/FCF/增速/估值分位...}
规则引擎参考分(仅供参考,你可以覆盖):
{每人的 rule_score + pass_rules + fail_rules}
真实世界信息:
{investor_knowledge 里的持仓/行业亲和度}
要求:
1. 对每个人,先想"如果我是他,看到这些数据,我会怎么想?"
2. 巴菲特看苹果 → 他实际持有,这比任何规则都重要
3. 格雷厄姆看科技股 → PE > 15 他就不买,但要解释 WHY,不是只说数字
4. 木头姐看量子 → 她会兴奋,看传统制造 → 她会说"不在我们平台里"
5. 每人输出: {investor_id, signal, score, headline(引用数字), reasoning(2-3句)}
Agent 2 · 宏观 + 技术派(索罗斯/达里奥/马克斯/德鲁肯米勒/罗伯逊 + 利弗莫尔/米内尔维尼/达瓦斯/江恩 · 9 人)
宏观派关心:利率周期/汇率/地缘/大宗商品 对这只票的影响
技术派关心:Stage/均线排列/MACD/成交量/距高点距离
数据:{macro_dim + kline_dim 摘要}
Agent 3 · 中国价投 + 量化(段永平/张坤/朱少醒/谢治宇/冯柳/邓晓峰 + 西蒙斯/索普/肖 · 9 人)
中国价投关心:好生意+好价格+好管理,长期持有
量化关心:因子暴露(动量/价值/质量/波动率)
数据:{financials + valuation + moat 摘要}
真实持仓:{段永平持有苹果/茅台/腾讯,张坤重仓白酒...}
Agent 4 · 游资组(23 人 — 只有 A 股才需要 spawn)
如果这只票不是 A 股 → 直接输出 23 人全部 "skip: 不看{market}市场"
如果是 A 股:
- 市值是否在各人射程内?(赵老哥 > 20 亿、章盟主 > 200 亿...)
- 龙虎榜数据:{lhb_dim}
- 最近涨停板:{kline 最近连板情况}
- 板块热度:{sentiment}
- 每人风格不同:赵老哥打板/章盟主趋势/炒股养家情绪/佛山无影脚快进快出
4 个 agent 返回后,你逐一把他们的 {signal, score, headline, reasoning} 覆盖到 panel.json 对应的投资者上。
如果 sub-agent 给的分和规则引擎差 > 30 分,在 panel_insights 里标记为"分歧点"——这本身是有价值的信息(说明量化指标和主观判断不一致)。
合并后检查:
将观察写进 synthesis.json 的 panel_insights。
这是整个流程里最依赖你判断的 Task。脚本只给你原材料,最终叙事必须你写。
4.1 构建 Great Divide(多空大分歧)
找出最有说服力的多方和最有说服力的空方:
passrules 和 failrules4.2 写 3 条核心结论
用 "但是" 结构,不要和稀泥:
4.3 估值三角验证
4.4 催化剂 + 风险排序
catalyst_calendar 取未来 60 天高影响事件4.5 四派系买入区间
给出 4 个有说服力的价位:
每个价位必须附一句解释。
以上 5 件事全部写入 .cache/{ticker}/agent_analysis.json(不是直接写 synthesis.json!)。
stage2() 的 generatesynthesis() 会自动读取 agentanalysis.json 并合并:
dim_commentary → 替换脚本占位符panel_insights → 写入 synthesisgreatdivideoverride → 替换脚本生成的辩论轮次和金句narrativeoverride.coreconclusion → 替换脚本结论narrative_override.risks → 替换脚本风险narrativeoverride.buyzones → 替换脚本买入区间agent_reviewed: true → 标记为 agent 已审查如果你直接写 synthesis.json,stage2() 会覆盖它。 必须写 agent_analysis.json,stage2 会合并。
脚本部分:
python scripts/assemble_report.py {ticker}
python scripts/inline_assets.py {ticker} # 生成自包含 HTML
python scripts/render_share_card.py {ticker} # 朋友圈 PNG
python scripts/render_war_report.py {ticker} # 战报 PNG
在调 assemble_report 之前,检查一遍 synthesis.json 中这 5 个字段:
| 字段 | 检查点 |
|---|---|
great_divide.punchline |
是不是一句能传播的话?有冲突感吗?引用数字了吗? |
dashboard.core_conclusion |
1-2 句结论,必须有定论 |
debate.rounds[*].bullsay / bearsay |
每轮必须引用具体数字 |
buy_zones.*.rationale |
每个价位必须给出计算逻辑(不能只写"基于技术面") |
risks[*] |
风险必须具体到数字 / 事件 |
任何一个字段没达标,直接重写后再调脚本。
生成的 HTML 报告打开必须满足:
如果你在 Codex / Docker / SSH 等无 GUI 环境中运行,使用 run.py 根入口:
# 在仓库根目录
python run.py <股票代码> # 自动检测环境,无浏览器时给路径
python run.py <股票代码> --remote # 完成后启动 Cloudflare Tunnel,生成公网链接
python run.py <股票代码> --remote --install-cloudflared # 允许缺失 cloudflared 时自动安装
python run.py <股票代码> --no-browser # 强制不打开浏览器
--remote 模式的工作流:
cloudflared tunnel 映射到 https://xxx.trycloudflare.com安全默认值:如果本机没有 cloudflared,--remote 只提示安装方式,不会自动执行 brew install / sudo mv。只有用户显式传 --install-cloudflared 时才允许自动安装。
Task 0 可选步骤:询问用户环境
在开始分析之前,你可以先问用户:
"你现在在电脑前吗?如果不在,我可以生成一个公网链接方便手机查看。"
如果用户说不在电脑前 → 加 --remote 参数。
非 Claude 平台跑 UZI-Skill 时常见问题已被代码层修复,但 agent 也要主动适配:
| 论坛报告问题 | v2.6 代码层做了什么 | agent 还要做什么 |
|---|---|---|
KeyError: 'skip' |
previewwithmock.py 加 'skip' key + .get() 兜底 | 无 |
| 失败卡死整条 pipeline | as_completed/result 加 90s timeout,单 fetcher 超时不影响其他 | 不要绕过 timeout 重试 |
| 中断不能续跑 | stage1 默认 --resume,每 3 个 fetcher 增量保存 raw_data.json;建模段可用 python run.py <ticker> --from-modeling 从缓存接力 |
不要手动 --no-resume 除非真要重抓 |
| Python 3.9 语法报错 | 所有新文件加 from future import annotations |
无 |
| mini_racer V8 thread crash | 给 fetchindustry/capitalflow/valuation 加共享锁 | 无 |
| share/war report 渲染失败 | render_*.py 加 main() alias | 无 |
| 非 Claude agent_analysis 错乱 | stage2 调用 lib.agentanalysisvalidator.validate() 写 agentanalysis_errors.json |
跑完看 console 是否有 🔴 schema error,按提示修 |
| Top bull/bear 排序错乱 | 排除 score=0 异常,按 score 排(不再先按 signal 分组) | 检查 panel.json 数据合理性 |
| 编造事实 (药明康德↔Apple) | HARD-GATE-FACTCHECK 强制 cite raw_data | agent 写每条结论都要能在 raw_data 找出处 |
Codex 启动时检测:
echo "${CODEX:-${OPENAI_API_KEY:+codex_via_openai}}"
Codex 推荐设置:
MX_APIKEY=... 必设(push2 在境外更不稳)--remote 默认开(生成公网链接,无需 GUI)--no-resume 别加(断网了能续)| 触发 | 行为 |
|---|---|
| 默认 | 完整 6 Task |
/quick-scan |
只跑 dim 0/1/2/10/18 + Top 10 投资者,跳过 dim 21/22 |
/panel-only |
跳过 Task 2, 只输出 65 评委 + synthesis |
/scan-trap |
只跑 dim 18 (杀猪盘),不调评审团 |
/dcf |
只跑 DCF 估值单独输出 |
/comps |
只跑同行对标 |
/initiate |
完整 6 Task + 强制生成机构首次覆盖章节 |
/ic-memo |
完整 6 Task + 强制生成 IC Memo 8 章节 |
/catalysts |
完整 Task + 重点展示催化剂日历 |
/thesis |
只跑 thesis_tracker 单独输出 |
/screen |
跑 5 套量化筛选 |
python3 screen.py --mode noon --markets A,H |
全市场每日猎物榜 · 24 位 F 组独立战法 + Serenity · 最多 10 只 |
/dd |
跑 DD 清单 |
4_peers 默认同时保留本地同行与全球同行。全球链路按以下顺序执行:
*_base 字段。支持 7203.T、005930.KS、2330.TW、D05.SI、RELIANCE.NS、 SHOP.TO、BHP.AX、SHEL.L、ASML.AS 等交易所代码。可用 UZIDISABLEGLOBALPEERS=1 关闭,或用 UZIGLOBALPEERLIMIT=3..12 调整补全数量。
| 文件 | 谁写 | 谁读 | 闭环角色 |
|---|---|---|---|
.cache/{ticker}/raw_data.json |
Task 1/1.5 脚本 | Task 2-5 + 你 | 数据源 |
.cache/{ticker}/dimensions.json |
Task 2 脚本 | Task 4-5 | 评分 |
.cache/{ticker}/panel.json |
Task 3 规则引擎 → 你覆盖 | stage2 | 骨架→真实判断 |
.cache/{ticker}/agent_analysis.json |
🧠 你写 | stage2 自动合并 | 闭环关键 |
.cache/{ticker}/agentreview_context.json |
stage1 | Agent + stage2 | 当前 raw 快照指纹 · 防止复用旧 role-play |
.cache/{ticker}/synthesis.json |
stage2 (合并 agent_analysis) | Task 5 | 最终研判 |
reports/{ticker}_{date}/full-report.html |
Task 5 脚本 | 用户 | 报告 |
reports/{ticker}_{date}/full-report-standalone.html |
inline_assets.py | 用户分享 | 独立报告 |
reports/{ticker}_{date}/share-card.png |
rendersharecard | 朋友圈 | 分享卡 |
reports/{ticker}_{date}/war-report.png |
renderwarreport | 战报 | 战报 |
reports/{ticker}_{date}/one-liner.txt |
assemble 副产 | 快速摘要 | 一句话 |
⚠️ agentanalysis.json 是 v2.2 新增的闭环文件。 lite/medium 缺失时可退化为规则报告;deep 档必须把
agentreviewcontext.json的analysisinputhash原样写入,缺失或过期会被 Stage 2 拒绝。
详细 schema 见 assets/data-contracts.md。
lib.finmodels.computedcf(features, assumptions) — DCF + WACC + 5×5 敏感性lib.finmodels.buildcomps_table(target, peers) — 同行对标lib.finmodels.projectthree_stmt(features, assumptions) — 5 年 IS/BS/CFlib.finmodels.quicklbo(features, ...) — PE 买方视角 IRR 测试lib.finmodels.accretiondilution(acquirer, target, ...) — 并购增厚/摊薄lib.researchworkflow.buildinitiating_coverage(...) — 机构首次覆盖lib.researchworkflow.buildearnings_analysis(...) — beat/miss 解读lib.researchworkflow.buildcatalyst_calendar(...) — 催化剂日历lib.researchworkflow.buildthesis_tracker(...) — 投资逻辑追踪lib.researchworkflow.buildmorning_note(...) — 晨报lib.researchworkflow.runidea_screen(features, style) — 5 套量化筛选 (value/growth/quality/gulp/short)lib.researchworkflow.buildsector_overview(...) — 行业综述lib.deepanalysismethods.buildicmemo(...) — 投委会备忘录 8 章lib.deepanalysismethods.builduniteconomics(...) — LTV/CAC 或毛利拆解lib.deepanalysismethods.buildvaluecreation_plan(...) — EBITDA 桥lib.deepanalysismethods.buildddchecklist(...) — 5 工作流 21 项 DDlib.deepanalysismethods.buildcompetitiveanalysis(...) — Porter 5 Forces + BCGlib.deepanalysismethods.buildportfoliorebalance(...) — 组合再平衡lib.stockfeatures.extractfeatures(raw, dims) — 108 标准化特征lib.investorcriteria.INVESTORRULES — 65 人 236 条规则lib.investorevaluator.evaluate(investorid, features) — 单人裁决lib.investorevaluator.evaluateall(features) — 65 人批量lib.investorevaluator.panelsummary(results) — panel 汇总lib.data_integrity.validate(raw) — 100% 覆盖度校验器references/task1-data-collection.md — 22 维 fetcher 清单 + 并行策略references/task1.5-institutional-modeling.md — DCF/Comps/LBO 默认参数与 A 股适配(重要!)references/task2-dimension-scoring.md — 打分规则references/task3-investor-panel.md — 65 评委规则references/task4-synthesis.md — 叙事合成规范references/task5-report-assembly.md — 报告组装references/fin-methods/README.md — 22 种机构方法论索引assets/data-contracts.md — 所有 JSON schemaassets/quality-checklist.md — 完成前的 checklistraw_data.json 完整性覆盖 ≥ 90%agentanalysis.json 必须存在且 agentreviewed: truedimcommentary 至少覆盖 15/22 维度(在 agentanalysis.json 中)synthesis.json 中 punchline / coreconclusion / debate.rounds / buyzones / risks 都来自 agent 覆盖(通过 agent_analysis.json 合并)现在开始:从第 0 步识别股票开始。记住 — 你是分析师,不是脚本运行器。