老唐估值法Pro
> 方法论来源:《价值投资实战手册》(唐朝著)
> 💡 两大核心升级:① 新唐估值法(折扣系数+自由现金流)→ 支持科技股/高资本投入型企业估值;② 大师视角(巴菲特/芒格/段永平第一人称分析)+ 企业估值对比汇总表
Design Mode: Pipeline + Gate + Reviewer + Gotchas
| 模式 | 位置 | 说明 |
|---|---|---|
| Pipeline | 全流程 | 7 Phase 顺序执行 |
| Gate | 每Phase出口 | 未通过不可进下一Phase |
| Reviewer | Phase 7前 | 输出前逐项打勾 |
| Gotchas | 安全红线下方 | 踩坑点,执行前先读 |
🚀 用户怎么用
直接对AI说:
| 场景 | 你说 |
|---|---|
| 分析一家公司 | 用老唐估值法Pro分析 贵州茅台 |
| 双企对比 | 分析 中航沈飞 和 中航西飞 |
首次使用前,需确保:
- mx-data skill 已安装并配置了 MX_APIKEY 环境变量
- 然后直接说企业名称或股票代码即可
领域知识(3条)
- 老唐估值法Pro = 老唐法 + 新唐法双轨:老唐法要求企业符合三大前提(利润为真、可持续、少投入),新唐法通过折扣系数包容不符合前提的企业。两种方法同时跑,互为补充。
- PE倍数来源:合理PE = 1 ÷ 无风险收益率。10年国债收益率(1.744%)→ 57倍,封顶50倍;AAA企业债收益率(2.18%)→ 46倍,取整45倍 → 保守取40倍,乐观取50倍。
- 数据来源:机构一致预期(mx-data)包含过去1年实际 + 未来3年预测。不硬编码年份,通过返回数据的行数动态判断未来第3年。
工具定义
Function(函数式工具)
| # | 工具 | 功能 | 输入 | 输出 |
|---|---|---|---|---|
| 1 | 机构预测查询 | 获取机构一致预期 | 股票代码 | 4行(1实际+3预测)含净利润/每股收益/营收 |
| 2 | 财务数据查询 | 获取最新财务指标 | 股票代码 | 市值/净利润/现金流/资本开支/负债/应收/非经常/折旧摊销 |
| 3 | 三大前提检验 | 检验利润为真/可持续/少投入 | 财务数据 | 每前提✅/❌/⚠️ + 详细分析 |
| 4 | 老唐估值计算 | 基于三大前提计算买点卖点 | 财务+预测+PE | 保守/乐观两套买点卖点 |
| 5 | 新唐估值计算 | 基于折扣系数计算买点卖点 | 财务+预测+PE+折扣 | 保守/乐观两套买点卖点 |
| 6 | 综合结论 | 双轨对比+投资建议等级 | 双轨结果 | ⭐⭐⭐/⭐⭐/⭐/等待/不建议 |
| 7 | 大师视角 | 三位大师第一人称分析 | 企业数据+双轨结论 | 每人200-400字+大师共识 |
| 8 | 估值对比更新 | 更新汇总表并排序 | 本次结果+已有数据 | 更新后的汇总表 |
CLI(命令行工具)
| # | 命令 | 功能 | 用法 |
|---|---|---|---|
| 9 | mx_data.py | 查询mx-data财务数据 | source ~/.profile && cd skills/mx-data && python ./mx_data.py "<代码> <字段>" /tmp/mx_output |
经验攻略
场景1:分析 1 家企业(单企报告)
用户说:"用老唐估值法Pro分析 贵州茅台"
| 阶段 | 你做什么 |
|---|---|
| Phase 0 | 检查是否首次启动 → 依赖+前置说明 |
| Phase 1 | 查机构预测 + 财务数据(老唐+新唐共用同一套数据) |
| Phase 2 | 三大前提检验→老唐估值计算 |
| Phase 3 | 确定折扣系数→新唐估值计算 |
| Phase 4 | 双轨对比→投资等级→明确建议(不得模糊) |
| Phase 5 | 调用大师视角技能输出三位大师第一人称分析 |
| Phase 6 | 更新估值对比汇总表 |
| Phase 7 | 按模板生成报告→checklist自检→send_file_to_user |
场景2:对比 2 家企业(双企对比报告)
| 阶段 | 变化点 |
|---|---|
| Phase 1 | 两家数据分别查,不共享 |
| Phase 2-5 | 两家分别走完 |
| Phase 6 | 两家数据写入汇总表 |
| Phase 7 | 双企对比模板 |
操作规程SOP(Pipeline 7 Phase)
Phase 0:首次启动初始化
检查首次运行标记文件是否存在(存放在skill目录外的data目录中):
- 不存在 → 执行首次启动:
- 检查skills/mx-data/mx_data.py存在 +$MX_APIKEY已配置
- 通过send_file_to_user发送本技能目录下的references/前置说明与版本对比.md给用户
- 创建标记文件标记首次启动完成
- 继续执行用户指令 - 存在 → 跳过,直接进入 Phase 1
> 🔐 Gate: mx-data就绪?前置说明已发?
Phase 1:数据获取
# 机构预测统计(返回 A/E/E/E 4行)
source ~/.profile && cd skills/mx-data && python ./mx_data.py "<代码> 机构预测统计" /tmp/mx_output
# 财务数据(含折旧摊销,新唐估值法需要)
source ~/.profile && cd skills/mx-data && python ./mx_data.py "<代码> 最新市值 最新年报净利润 经营现金流 资本开支 总资产 有息负债 应收票据及应收账款 非经常性损益 最新年报 固定资产折旧 无形资产摊销" /tmp/mx_output
🚨 读数据的正确方式
mx_data 输出 .xlsx 文件(Excel),不要自己写复杂脚本:
# 先看description文件获取概要
cat /tmp/mx_output/*_description.txt 2>/dev/null
# 用Python一行命令直接读xlsx
python3 -c "
import pandas as pd, os
for f in os.listdir('/tmp/mx_output'):
if f.endswith('.xlsx'):
df = pd.read_excel(f'/tmp/mx_output/{f}', engine='openpyxl')
print(f'=== {f} ===')
print(df.to_string(index=False))
" 2>/dev/null
必须读真实输出,不可凭印象填写。
📅 数据时效性检查(动态判定年份)
机构预测返回的数据格式:
年份: Y-1 Y Y+1 Y+2 (Y=当前年)
类型: A E E E
行数: 4行(1实际A + 3预测E)
判断规则:
- 查看数据中的年份列,找出实际值(A)的年份 → 那是上一年的数据
- 最后一个预测(最后一个E)对应的年份 = 未来第3年
- 示例(当前2026年):A=2025(实际),E=2026, 2027, 2028 → 第3年=2028
- 绝对不要硬编码年份,每次根据返回数据动态判断
> 🔐 Gate: 市值/净利润/现金流/资本开支/总资产/负债/应收/非经常/折旧摊销/机构预测4行 全部有真实值?任一缺失→重新查询。
Phase 2:老唐估值法
三大前提检验
| 前提 | 检验项 | 标准 | 分析说明 |
|---|---|---|---|
| 利润为真? | ①经营现金流/净利润 | ✅>0.5 ❌<0.5 | 比值>0.5说明利润有现金支撑 |
| ②应收票据及应收账款/总资产 | ✅<30% ❌≥30% | 应收占比高→利润可能是"白条" | |
| ③非经常性损益/净利润 | ✅<10% ❌≥10% | 非经常占比高→利润不可持续 | |
| 利润可持续? | ④被需要? | ✅/❌/⚠️ | 产品/服务是否长期被市场需要 |
| ⑤难被替代? | ✅/❌/⚠️ | 竞争优势(品牌/技术/牌照/网络效应等) | |
| ⑥价格不受管制? | ✅/❌/⚠️ | 是否有定价权 | |
| 少资本投入? | ⑦资本开支/净利润 | ✅<50% ⚠️50-100% ❌>100% | 赚到的钱需要多少再投回去维持生意 |
结论规则:每个前提的最终结论 = 该前提三项中的最差结果。
估值计算
- 有息负债率 < 70%:第3年自由现金流 = 第3年预测净利润
- 有息负债率 ≥ 70%:第3年自由现金流 = 第3年预测净利润 × 0.7
- 合理市值 = 第3年自由现金流 × PE(保守40倍 / 乐观50倍)
- 买点 = 合理市值 × 50%
- 卖点 = min(合理市值 × 150%, 当年净利润 × 50倍)
> 🔐 Gate: 每项检验有详细分析?保守/乐观两套估值都算完了?
Phase 3:新唐估值法
折扣系数确定(基于资本开支/净利润比值)
| 资本开支/净利润比值 | 企业类型举例 | 折扣系数参考 |
|---|---|---|
| < 30% | 成熟消费(茅台、五粮液) | 0.8-1.0 |
| 30%-60% | 轻资产服务(分众、腾讯等) | 0.7-0.9 |
| 60%-100% | 科技制造(立讯、海康) | 0.5-0.7 |
| > 100% | 重资产周期(京东方、宝钢) | 0.3-0.5 |
确定依据:综合三个维度决定
1. 资本开支/净利润比值(客观数据)
2. 行业特征(成熟消费 vs 科技 vs 重资产)
3. 企业生命周期(成熟期 折扣高 / 成长期 折扣低)
估值计算
- 自由现金流 = 第3年预测净利润 × 折扣系数
- 合理市值 = 自由现金流 × PE(40~50倍)
- 买点 = 合理市值 × 50%
- 卖点 = 合理市值 × 150%(⚠️ 新唐法不设"当年净利润×50倍"限制)
> ⚠️ 新唐卖点为什么取消了"当年净利润×50倍"限制?
> 因为老唐法的卖点限制来自三大前提——当企业利润可持续且少投入时,利润倍数有上限。新唐法服务于不符合三大前提的企业(如科技制造、周期股),这些企业当年净利润可能很低甚至亏损,"当年×50倍"会导致卖点 < 买点的荒谬结果。所以新唐法卖点 = 合理市值 × 150%。
> 🔐 Gate: 折扣系数有合理依据(资本开支/净利润比值+行业+生命周期三重考量)?
Phase 4:综合结论
判断规则
- 三大前提全通过(✅✅✅) → 以老唐估值法为主
- 有不符合项 → 以新唐估值法为主
- 两种方法差异大(买点差>30%)→ 需深入分析差异原因
投资建议等级(基于保守买点%)
| 保守买点% | 等级 | 含义 |
|---|---|---|
| > +50% | ⭐⭐⭐ 强烈买入 | 当前市值远低于买点,机会大 |
| +20% ~ +50% | ⭐⭐ 买入 | 已到买点,适合建仓 |
| 0% ~ +20% | ⭐ 可买入 | 刚触及买点,可轻仓试探 |
| -20% ~ 0% | 等待回调 | 接近买点但还没到,继续等 |
| < -20% | 不建议 | 远高于买点,没有安全边际 |
买点%解读要点
| 买点%值 | 实际含义 |
|---|---|
| 正数 | 当前市值低于买点 → ✅ 已到买点,建议买入 |
| 零 | 当前市值 = 买点 → ⚠️ 临界点 |
| 负数 | 当前市值高于买点 → ❌ 未到买点,继续等待 |
> ⚠️ 典型错误(必须避免):当前市值1.579万亿,买点1.91万亿,买点% = (1.91-1.579)/1.579 = +21% → 结论是已到买点(当前比买点低),而不是未到买点。买点%正数=已到买点,不是没到!
> 🔐 Gate: 建议明确(不是"关注一下""需确认"等模糊措辞)?
Phase 5:大师视角
调用大师视角技能进行第一人称分析。不是填空,而是让大师独立思考。
| 大师 | 调用技能 | 输出要求 |
|---|---|---|
| 巴菲特 | skills/buffett-perspective/SKILL.md 或类似 |
护城河+自由现金流+能力圈角度,200-400字 |
| 芒格 | skills/munger-perspective/SKILL.md 或类似 |
逆向思维+心理学偏见角度,200-400字 |
| 段永平 | skills/duan-yongping-perspective/SKILL.md 或类似 |
买股票就是买公司+做对的事情角度,200-400字 |
规则:
- 只在生成完整报告时调用
- 第一人称口吻输出("我会先看..."、"我认为..."),不是第三方案例分析
- 不是固定维度填空,让大师基于其心智模型独立思考
- 末尾加"大师共识"总结(三人共同看点和分歧点)
> 🔐 Gate: 第一人称口吻?风格符合大师标志性表达?有大师共识?
Phase 6:估值对比汇总表更新
更新(或创建)企业估值对比汇总表文件,保存到skill目录外的用户数据目录。
> 数据目录说明:所有分析报告、对比汇总表等用户个人数据均存储在 skill 目录外,skill 打包时自动排除。首次使用时 AI 自动创建数据目录。
计算规则:
- 保守买点 = min(老唐保守买点, 新唐保守买点)
- 保守卖点 = min(老唐保守卖点, 新唐保守卖点)
- 买点%(保守) = (保守买点 - 当前市值) ÷ 当前市值
- 按"买点%(保守)"降序排列
- 同行业标的中排前列
20列完整表结构(参见方法文件第8章):
企业代码 / 企业名称 / 行业 / 当前市值 / 市盈率 / 三大前提 / 老唐保守买点 / 老唐乐观买点 / 老唐保守卖点 / 老唐乐观卖点 / 新唐折扣系数 / 新唐保守买点 / 新唐乐观买点 / 新唐保守卖点 / 新唐乐观卖点 / 保守买点 / 乐观买点 / 保守卖点 / 乐观卖点 / 买点%(保守)
> 🔐 Gate: 数据写入正确?排序正确?行业分组?
Phase 7:报告输出
格式见 references/report-templates.md。前置说明见 references/前置说明与版本对比.md。
> 🔐 Gate: references/checklist.md 全部通过 → send_file_to_user 发送
报告文件命名规范(硬性要求 — 严格遵循)
单企分析:
【你好金乌】个股估值·{公司名}({YYYY.MM.DD}).md
示例: 【你好金乌】个股估值·贵州茅台(2026.06.20).md
双企对比:
【你好金乌】个股估值·{A公司}+{B公司}({YYYY.MM.DD}).md
示例: 【你好金乌】个股估值·贵州茅台+五粮液(2026.06.20).md
企业对比汇总表:
【你好金乌】个股估值·企业对比汇总表({YYYY.MM.DD}).md
> 所有用户(免费/付费)统一使用此命名规则。
命名检查(硬性Gate,未通过不得保存):
1. 确认新文件名不重复(扫描本地报告目录中已有的文件名)
2. 确认格式为【你好金乌】个股估值·{公司}({YYYY.MM.DD}).md(不允许 YYYY-MM-DD_公司_valuation-report.md 等旧格式)
3. 所有文件名必须通过此检查再保存
⛔ Gotchas(踩坑点 — 执行前先读)
- ❌ 数据只查一次 — 老唐新唐共用Phase 1数据,不要重复查询
- ❌ 不读数据直接写报告 — 必须读真实输出再写,不可凭印象
- ❌ 硬编码年份 — 根据机构预测返回结果动态判定未来第3年
- ❌ 自己写脚本读xlsx — 用Phase 1中的Python一行命令读,不要写复杂转换脚本
- ❌ 省略任一字段 — 财务数据表必须完整,缺失字段标"未获取"并注明原因
- ❌ 模糊措辞 — "需确认""通常健康""关注一下"不算结论
- ❌ 买点逻辑搞反 — 买点% > 0 = 已到买点(可买),不是未到买点
- ❌ PE倍数凭印象 — 先查10年国债真实收益率再计算PE,不是25倍/30倍
- ❌ 大师视角缺失或非第一人称 — 付费版核心功能,不可省略
- ❌ 对比表不更新或不排序 — 每次分析后必须更新,按买点%降序
- ❌ 两种方法只跑一种 — 无论企业是否符合三大前提,都要双轨跑
- ❌ 字段名用错查不到数据 — mx-data批量查询时用
应收票据及应收账款(标准财报字段名),不要用应收账款(单独查应收账款走的是账龄结构表,字段不对应)。如果批量查询仍取不到,单独查一次应收票据及应收账款
安全红线
- ❌ 禁止硬编码API密钥或密码
- ❌ 禁止包含危险命令(rm -rf /等)
- ❌ 禁止description夸大虚假
- ❌ 禁止使用营销诱导词
- ❌ 禁止侵犯知识产权
与人协作
| 场景 | 应对 |
|---|---|
| 用户只给了企业名没给代码 | 查询A股代码映射,找不到就问用户 |
| 用户说"你看着分析" | 默认保守PE 40倍,让用户确认 |
| 用户质疑结论 | 展示数据来源和计算过程,不隐瞒 |
| 企业不符合三大前提 | 老唐法标注"不适用",新唐法正常出估值 |
| 单企vs对比 | 默认单企。明确说对比时走双企流程 |
| 用户想跳过某Phase | 告知Pipeline必须按序执行,不可跳步 |
References
| 文件 | 内容 | 什么时候读 |
|---|---|---|
references/report-templates.md |
单企/双企完整报告模板 | Phase 7 生成报告时 |
references/checklist.md |
输出前逐项验证清单 | Phase 7 输出前打勾 |
references/data-reading.md |
数据读取方法(含xlsx转文本) | Phase 1 卡住时 |
references/前置说明与版本对比.md |
完整前置说明+版本对比 | Phase 0 首次启动时发送给用户 |
references/huawei-review.md |
华为上架自检清单 | 打包前检查 |