From stock-deep-analyzer
个股深度分析的核心工作流。当用户要求"深度分析 / 全面分析 / 帮我看看 / 值不值得买 / DCF / 机构建模 / 首次覆盖 / 投委会备忘录"等涉及个股研究的请求时触发。覆盖 A 股、港股、美股,产出 22 维数据 + 51 位大佬量化评审 + 6 种机构级估值建模 (DCF/Comps/LBO/3-Stmt/Merger) + 7 种研究产物 (首次覆盖/财报解读/催化剂日历/投资逻辑追踪/晨报/量化筛选/行业综述) + 6 种决策方法 (IC Memo/DD/Porter/单位经济/VCP/再平衡) + 杀猪盘检测,最终生成 Bloomberg 风格 HTML 报告 + 社交分享战报。关键词:股票、个股、深度分析、估值、DCF、comps、首次覆盖、IC memo、杀猪盘、龙虎榜、akshare。
How this skill is triggered — by the user, by Claude, or both
Slash command
/stock-deep-analyzer:deep-analysisThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> 你正在扮演一位**首席股票分析师**。你身边有一套完整的量化工具箱,但最终的判断和叙事**必须你来写**。
assets/avatars/bj_cj.svgassets/avatars/buffett.svgassets/avatars/chen_xq.svgassets/avatars/chengdu.svgassets/avatars/dalio.svgassets/avatars/darvas.svgassets/avatars/dengxiaofeng.svgassets/avatars/druck.svgassets/avatars/duan.svgassets/avatars/fang_xx.svgassets/avatars/fengliu.svgassets/avatars/fisher.svgassets/avatars/fs_wyj.svgassets/avatars/gann.svgassets/avatars/graham.svgassets/avatars/gu_bl.svgassets/avatars/hu_jl.svgassets/avatars/jiao_yy.svgassets/avatars/klarman.svgassets/avatars/lasa.svg你正在扮演一位首席股票分析师。你身边有一套完整的量化工具箱,但最终的判断和叙事必须你来写。 脚本负责算数,你负责推理和下结论。
cat xxx.json 的结果往报告里贴。每完成一个 Task,输出一行进度条(20 字符固定宽度):
[███░░░░░░░░░░░░░░░░░] 17% · Task 1/6 · 数据采集 ✓
[██████░░░░░░░░░░░░░░] 33% · Task 1.5 · 机构建模 ✓
[██████████░░░░░░░░░░] 50% · Task 2/6 · 维度打分 ✓
[█████████████░░░░░░░] 67% · Task 3/6 · 51 评委 ✓
[████████████████░░░░] 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 | 51 评委量化裁决 | .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(规则引擎骨架分)
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.
核心是:
.cache/{ticker}/panel.json 中 51 人的骨架分agent_analysis.json 到 .cache/{ticker}/ — 这是闭环的关键!{
"agent_reviewed": true,
"dim_commentary": {
"0_basic": "建筑央企,主营市政/房建。市值偏小,营收稳但利润率极薄(1.2%),典型低毛利基建股。",
"1_financials": "ROE 不到 8%,连续 3 年下滑。现金流波动大,应收账款占营收比偏高,回款风险明显。",
"2_kline": "均线空头排列,MACD 死叉,量能萎缩。典型下跌趋势,不满足 Stage 2 条件。"
},
"panel_insights": "51 评委中,价值派集体看空(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%,靠城投整合讲故事。51 位大佬 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 + agent_analysis.json,合并生成 HTML 报告。 如果没有 agent_analysis.json,退化为纯脚本模式(会打印警告)。
如果用户说"快速分析"或时间紧:
cd <repo_root>
python run.py <股票> --no-browser
这会 stage1 + stage2 一把跑完,不做 agent 分析。速度快但评委判断全是规则引擎的机械输出。
run.py 已经自动识别了 ticker 并跑完所有 Task.cache/{ticker}/raw_data.json 确认数据run.py 内部执行了:
这个脚本会:
lib/data_integrity.py)脚本跑完后你读 .cache/{ticker}/raw_data.json,向用户汇报:
_integrity 字段)脚本只是第一道粗搜。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
run_real_test.py 已经自动完成了三层评估(investor_knowledge.py 现实检验 → investor_criteria.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(多空大分歧)
找出最有说服力的多方和最有说服力的空方:
pass_rules 和 fail_rules4.2 写 3 条核心结论
用 "但是" 结构,不要和稀泥:
4.3 估值三角验证
4.4 催化剂 + 风险排序
catalyst_calendar 取未来 60 天高影响事件4.5 四派系买入区间
给出 4 个有说服力的价位:
每个价位必须附一句解释。
以上 5 件事全部写入 .cache/{ticker}/agent_analysis.json(不是直接写 synthesis.json!)。
stage2() 的 generate_synthesis() 会自动读取 agent_analysis.json 并合并:
dim_commentary → 替换脚本占位符panel_insights → 写入 synthesisgreat_divide_override → 替换脚本生成的辩论轮次和金句narrative_override.core_conclusion → 替换脚本结论narrative_override.risks → 替换脚本风险narrative_override.buy_zones → 替换脚本买入区间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[*].bull_say / bear_say | 每轮必须引用具体数字 |
buy_zones.*.rationale | 每个价位必须给出计算逻辑(不能只写"基于技术面") |
risks[*] | 风险必须具体到数字 / 事件 |
任何一个字段没达标,直接重写后再调脚本。
生成的 HTML 报告打开必须满足:
如果你在 Codex / Docker / SSH 等无 GUI 环境中运行,使用 run.py 根入口:
# 在仓库根目录
python run.py <股票代码> # 自动检测环境,无浏览器时给路径
python run.py <股票代码> --remote # 完成后启动 Cloudflare Tunnel,生成公网链接
python run.py <股票代码> --no-browser # 强制不打开浏览器
--remote 模式的工作流:
cloudflared tunnel 映射到 https://xxx.trycloudflare.comTask 0 可选步骤:询问用户环境
在开始分析之前,你可以先问用户:
"你现在在电脑前吗?如果不在,我可以生成一个公网链接方便手机查看。"
如果用户说不在电脑前 → 加 --remote 参数。
| 触发 | 行为 |
|---|---|
| 默认 | 完整 6 Task |
/quick-scan | 只跑 dim 0/1/2/10/18 + Top 10 投资者,跳过 dim 21/22 |
/panel-only | 跳过 Task 2, 只输出 51 评委 + 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 套量化筛选 |
/dd | 跑 DD 清单 |
| 文件 | 谁写 | 谁读 | 闭环角色 |
|---|---|---|---|
.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}/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 | render_share_card | 朋友圈 | 分享卡 |
reports/{ticker}_{date}/war-report.png | render_war_report | 战报 | 战报 |
reports/{ticker}_{date}/one-liner.txt | assemble 副产 | 快速摘要 | 一句话 |
⚠️ agent_analysis.json 是 v2.2 新增的闭环文件。 stage2() 会自动读取并合并到 synthesis 中。如果你不写这个文件,stage2 退化为纯脚本模式(会打印警告)。
详细 schema 见 assets/data-contracts.md。
lib.fin_models.compute_dcf(features, assumptions) — DCF + WACC + 5×5 敏感性lib.fin_models.build_comps_table(target, peers) — 同行对标lib.fin_models.project_three_stmt(features, assumptions) — 5 年 IS/BS/CFlib.fin_models.quick_lbo(features, ...) — PE 买方视角 IRR 测试lib.fin_models.accretion_dilution(acquirer, target, ...) — 并购增厚/摊薄lib.research_workflow.build_initiating_coverage(...) — 机构首次覆盖lib.research_workflow.build_earnings_analysis(...) — beat/miss 解读lib.research_workflow.build_catalyst_calendar(...) — 催化剂日历lib.research_workflow.build_thesis_tracker(...) — 投资逻辑追踪lib.research_workflow.build_morning_note(...) — 晨报lib.research_workflow.run_idea_screen(features, style) — 5 套量化筛选 (value/growth/quality/gulp/short)lib.research_workflow.build_sector_overview(...) — 行业综述lib.deep_analysis_methods.build_ic_memo(...) — 投委会备忘录 8 章lib.deep_analysis_methods.build_unit_economics(...) — LTV/CAC 或毛利拆解lib.deep_analysis_methods.build_value_creation_plan(...) — EBITDA 桥lib.deep_analysis_methods.build_dd_checklist(...) — 5 工作流 21 项 DDlib.deep_analysis_methods.build_competitive_analysis(...) — Porter 5 Forces + BCGlib.deep_analysis_methods.build_portfolio_rebalance(...) — 组合再平衡lib.stock_features.extract_features(raw, dims) — 108 标准化特征lib.investor_criteria.INVESTOR_RULES — 51 人 180 条规则lib.investor_evaluator.evaluate(investor_id, features) — 单人裁决lib.investor_evaluator.evaluate_all(features) — 51 人批量lib.investor_evaluator.panel_summary(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 — 51 评委规则references/task4-synthesis.md — 叙事合成规范references/task5-report-assembly.md — 报告组装references/fin-methods/README.md — 17 种机构方法论索引assets/data-contracts.md — 所有 JSON schemaassets/quality-checklist.md — 完成前的 checklistraw_data.json 完整性覆盖 ≥ 90%agent_analysis.json 必须存在且 agent_reviewed: truedim_commentary 至少覆盖 15/22 维度(在 agent_analysis.json 中)synthesis.json 中 punchline / core_conclusion / debate.rounds / buy_zones / risks 都来自 agent 覆盖(通过 agent_analysis.json 合并)现在开始:从第 0 步识别股票开始。记住 — 你是分析师,不是脚本运行器。
npx claudepluginhub illulachy/uzi-skill --plugin stock-deep-analyzerGuides collaborative design exploration before implementation: explores context, asks clarifying questions, proposes approaches, and writes a design doc for user approval.
Creates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.
Synthesizes the current conversation into a structured spec (PRD) and publishes it to the project issue tracker with a ready-for-agent label, without interviewing the user.