股票价值分析器(Stock Value Analyzer)v2.4
> v2.4 更新(2026-09-29)— 取数脚本两类「静默故障」修复:不抛异常,但让结论全错
>
> 这两个 bug 的共同特征是脚本照常返回 0 退出码,errors[] 也是空的,
> 于是 AI 以为取数成功,继续往下写报告 —— 这比直接报错危险得多。
>
> ① AkShare 行情静默返回空
> 全市场快照接口返回空表(限流/风控)、代码列名漂移(代码→symbol)、代码格式不匹配
> (00700 vs 0700 vs hk00700)、字段值为 0 —— 四种情况旧版都不抛异常,
> spot 静静变成 {},报告只是「没有现价」,极易被顺手用研报目标价或 52 周区间顶替(v1.3 的血泪教训重演)。
> - 新增 _fetch_diagnostics:每个接口每一步都记账(ok / empty / not_found / schema_drift / field_missing / error)
> - 代码匹配改为归一化比对,兼容前导零与市场前缀;代码列名多候选自动识别
> - 港股新增两级价格兜底(东财日线 → 新浪快照)、A 股新增跨域兜底(新浪日线,脱离东财单点依赖)
> - 缺价/兜底/量纲异常一律写入顶层 errors 与 meta.data_health,并新增 --strict(不达标以退出码 3 硬失败)
> - 附带修复 1:yfinance 限流时会产出「字段齐全但值全为 null 的空壳 models」,旧判据据此认为
> models_ok=True 而整段跳过 AkShare 明细兜底 → 现要求 time_series.fiscal_periods 非空
> - 附带修复 2(同类静默空,影响更大):非日历财年被硬编码 -12-31 滤空。
> 苹果 9 月底、微软 6 月底、英伟达 1 月底、大量港股 3 月底 —— 明细接口返回几百行,
> 却被筛成 0 行,time_series 空、models 全 null 且不报错。更隐蔽的是采用 52/53 周财年历
> 的公司(苹果财年末在 09-24~10-01 间浮动),若只按「MM-DD 众数」筛,会得到
> 「2025 / 2014 / 2008 / 2003」这种跨 20 年的稀疏序列 → "上一期"变成 11 年前,同比与 CAGR 全错。
> 现改为 pick_annual_dates():按财年结束月(含跨月漂移窗口)圈定 + 每财年只取最晚一期。
> 实测 AAPL:修复前营收 CAGR 21.1% / ROE 120.9%(均错),修复后 7.58% / 171.42%(与 API ROE 完全一致)。
>
> ② 杜邦分解单位错乱导致 ROE 失真
> ROE = 净利率 × 周转率 × 权益乘数,分子来自利润表、分母来自资产负债表,是跨表比率。
> 一旦两表量纲不一致(千元 vs 元)、股东权益科目错位、或把 API 的百分数 ROE 当小数用,
> ROE 会整体偏离 10^k 倍。实测:东财港股接口 ROE_AVG=21.13(百分数)被直接透传,
> 与杜邦 ROE 0.2113 相差 100 倍,前置 6 的「差异 >15% 须并列两者」形同虚设。
> - 新增 value_models.check_unit_consistency():硬锚点定量修正 + 软锚点告警
> - 硬锚 1 资产负债表恒等式 (总资产−总负债)/股东权益 ≈ 1 → 定位股东权益量纲偏离
> - 硬锚 2 API 报告 ROE → 定位利润表相对资产负债表的量纲偏离
> - 软锚 3 四类比率合理区间(ROE / 周转率 / 折旧÷固定资产 / 经营现金流÷净利)
> - 只认 10 的整数次幂:单位错乱必为 10^k;1.3 倍、3 倍的偏离是口径差异
> (年报/TTM、归母/含少数股东、平均/期末),只告警、不修正,避免把口径差异洗掉
> - 不可定量 → 不硬凑:dupont/roic/growth_consistency.roe_* 全部置 applicable=False,报告必须标 NA
> - 全引擎百分数字段统一 ÷100 并标注 _unit;新增 models._unit_health 一眼可读「ROE 能不能引用」
> - 自检脚本新增 C10(量纲与 ROE 越界引用)/ C11(取数健康度披露) 机器门禁
>
> ---
>
> v2.3 更新(2026-08-09)— 跨市场税负差异强制纳入择市决策
>
> 原框架对多地上市标的(AH /ADR / 多重上市)只比名义价差,这会导致择市结论反向。
>
> 实测教训(中国移动 2026-08):按名义 AH 溢价 27.5% 判定「A 股在溢价 >20% 时均不构成价值投资标的」;计入 H 股港股通 20% 股息税后,税后实际溢价仅约 1.9%,纯红利投资者选 A 股税后到手反而多 25%——结论直接反转。
>
> v2.3 修正:
> 1. 新增前置 7「跨市场税负差异校验」铁律:多地上市标的禁止仅用名义价差下择市结论。
> 2. 新增税负临界溢价公式 prem* = (1−t_A)/(1−t_H) − 1:与股价、股息、汇率全部无关,只取决于税率差。港股通 H 股 vs A 股长持的临界溢价恰为 +25%。
> 3. 择市结论必须按投资目的分层(纯红利 / 红利+估值修复 / 成长 / 短期),禁止给单一的「买 A 还是买 H」。
> 4. 税率取决于「投资者身份 × 持有渠道 × 标的注册地」,不是「标的在哪上市」:同一只港股,港股通持有 20%、香港券商直持 H 股 10%、直持红筹股 0%。
> 5. 新增 references/cross-market-tax-guide.md:主要市场股息/资本利得税对照、隐性成本(ADR 托管费、港股通汇兑价差、双边印花税)、三张必备产出表。
>
> ---
>
> v2.2 更新(2026-07-30)— 评分体系数学自洽化 + 量化模型口径修正
>
> v2.0/v2.1 建立了双层架构,但执行层存在会导致结论反向的硬伤。v2.2 专治这些问题:
>
> 1. 评分归一为纯 100 分制:公司分把时序补为正式维度(护城河 35 + 财务质量 30 + 管理层 20 + 时序 15 = 100),不再是"90 分池 + ±10 校准";逆向/定价权明确为加法绝对分并纳入分母,消除"±10%"是乘法还是加法的歧义。
> 2. 估值硬模型占实分:反向 DCF 与情景/EPV/SOTP 从"不占分"升级为估值模块 60 分主体,兑现"便宜要用模型证明"。
> 3. 一票否决分两档:造假类 → ❌ 出局;破产/结构类 → 🔴 封顶,且必须显式写"原始分 → 否决结果"。
> 4. Altman Z 双版本路由:按资产结构自动选 原始 Z(制造业)或 Z''(非制造业,剔除 X5)。轻资产/科技股此前被原始 Z 系统性低估(实测差 3.67),存在"破产高危"误杀风险。
> 5. 反向 DCF 抗操纵:基准 FCF 默认近 3 年均值(不再单年快照,实测单年口径可虚高隐含增速 11pct);折现率/永续增速/年限可传参;强制输出 WACC 敏感性矩阵。
> 6. CAGR 按实际年跨度计算:修复"缺失年致分母缩水、CAGR 被高估"(实测高估 6.75pct,直接污染贵/便宜判断)。
> 7. 模型可用性护栏升级:Piotroski 新增 data_coverage/applicable(覆盖不足禁引总分);行业判别新增 confidence,低置信度禁止 M/Z 否决——修复港股分支曾把公司名当行业传入、致金融股被跑造假模型的误杀风险。
> 8. A 股能力对齐港股:改用三大报表明细,M-Score / Z-Score / 反向 DCF 从"全 NA"变为可用。
> 9. 历史估值分位有了取数路径:该项占估值分权重却长期无数据源(幻觉高发区),现由脚本取真实历史序列。
> 10. 交卷前自检脚本化:新增 scripts/self_check.py,把量化一致性、算术回验、越界引用检测从"靠自律"变为机器门禁。
>
> 核心理念:用合理的价格,买好行业里的好公司,然后拿得住。信条——定性看方向,定量定边界,两层都过才算数;模型不可用时诚实标注 NA,绝不硬凑;跨市场必看税后到手。
概览
本 Skill 基于邱国鹭《投资中最简单的事》的投资方法论,对单只股票进行系统化的价值投资评估,输出"能不能买、该不该买、什么价位买"的结构化结论。
做的事:
- 从行业、公司、价格三个维度做双层评估(量化硬模型 + 定性框架)
- 反向 DCF 反解市场隐含增速,判断当前价格"打的什么算盘"
- 用 F-Score / M-Score / Z-Score 给财务质量打分、识别造假与破产风险
- 用杜邦分解区分"经营驱动 ROE"还是"杠杆堆出来的 ROE"
- 看 5-10 年时间序列趋势,而非单年快照
- 识别护城河、定价权、估值陷阱,逆向思维检查市场情绪
不做的事:
- 不预测短期股价涨跌、不做技术面分析(K线/均线)
- 不推荐具体买卖时点、不替代用户的独立判断
- 不依赖任何个人持仓/组合数据——本 Skill 为通用、可独立发布的分析框架
方法论框架
核心公式
投资价值 = 好行业 × 好公司 × 好价格
三个维度缺一不可。任一维度得分过低,整体结论就是"不适合投资"。
双层判断架构(核心)
每个维度都按"量化层 → 定性层"两层评估,缺一不可:
┌─────────────────────────────────────────────┐
│ 量化层(可复现硬模型,由脚本计算) │
│ 反向DCF / 情景估值 / EPV / 杜邦 / ROIC │
│ F-Score / M-Score / Z-Score / 盈余质量 │
│ 时间序列趋势 / CAGR / 归一化盈利 │
└──────────────────┬──────────────────────────┘
│ 提供客观证据与边界
▼
┌─────────────────────────────────────────────┐
│ 定性层(邱国鹭三好框架,人类判断) │
│ 行业格局 / 护城河 / 定价权 / 管理层 / 逆向 │
│ 波特五力 / 生命周期 / 产业链 / 资本配置 │
└─────────────────────────────────────────────┘
- 量化层定边界:给出客观区间(如反向 DCF 隐含增速 = 12%),回答"市场已经定价了什么"。
- 定性层定方向:判断量化结果是否合理(如"12% 增速在成熟期消费股上明显过度乐观")。
- 两层冲突时:以更保守的一方为准,并在报告中显式说明分歧来源。
时间维度权重
| 维度 | 最重要的因素 | 说明 |
|---|---|---|
| 短期(<1年) | 时机/情绪 | 靠运气,不可靠,本器不预测 |
| 中期(1-3年) | 估值 | 买贵了,再好的公司也要还债 |
| 长期(3年+) | 品质 | 只有好公司能穿越周期 |
→ 本分析器聚焦中期和长期维度。
🔴 前置环节:取数与校验(强制,不可跳过)
> 冗长的校验细则已下沉到参考手册,主文件只保留铁律与挂载点。每一条铁律违反即视为校验未通过,报告不得发布。
前置 1:API 优先取数(铁律 + 自动算模型)
铁律:能用 API 绝不用网页。yfinance + AkShare 双引擎是第一信源,网页抓取仅作兜底。
每份报告第一动作必须执行取数脚本:
# 港股 / A 股 / 美股 / 韩股(v2.2 新增 KR/JP/TW/UK/SG/IN/DE)
python .codebuddy/skills/stock-value-analyzer/scripts/fetch_stock_data.py --symbol 0700.HK --market HK
python .codebuddy/skills/stock-value-analyzer/scripts/fetch_stock_data.py --symbol 600519 --market A
python .codebuddy/skills/stock-value-analyzer/scripts/fetch_stock_data.py --symbol AAPL --market US
python .codebuddy/skills/stock-value-analyzer/scripts/fetch_stock_data.py --symbol 005930 --market KR
# 金融股必传(禁用 M/Z-Score 防误杀);周期股基准 FCF 用归一化
--industry-type financial
--fcf-base normalized
# 折现率按个股资本结构调整(成熟蓝筹 0.08-0.10 / 高 beta 成长股 0.10-0.13)
--wacc 0.11 --terminal-growth 0.025
# 港股财报人民币、市值港币时必传汇率,否则反向DCF与 Z-Score 的 X4 失真
--fx-market-to-report 0.917
# 换假设复算无需重新联网(避免限流)
--offline ./.svadata/value_analysis_0700_HK.json --wacc 0.10
# v2.4:严格模式 —— 现价缺失或量纲体检未通过时以退出码 3 硬失败(防"静默降级"蒙混过关)
--strict
输出 JSON 字段组:
| 字段组 | 内容 |
|---|---|
| price / valuation / profitability / financials / dividend / growth / shares / company / analyst | 原九大字段组(契约不变) |
time_series |
5-10 年三大报表序列(index 0 = 最近期)+ fiscal_periods |
models |
脚本自动计算:杜邦、ROIC、F-Score、M-Score、Z-Score、盈余质量、反向 DCF(含敏感性矩阵)、CAGR 一致性、_veto_eligibility |
valuation_history(v2.2 新增) |
PE-TTM / PB 历史序列的当前值、中位数、极值与分位数 |
meta.data_health(v2.4 新增) |
price_status / price_source / roe_usable / unit_check_ok / silent_empty_apis —— 一眼看清"哪些字段其实是空的、哪些数字不能引用" |
_fetch_diagnostics(v2.4 新增) |
每个接口的逐步取数结果(ok / empty / not_found / schema_drift / field_missing / error) |
models.unit_consistency + models._unit_health(v2.4 新增) |
量纲一致性体检结论、已应用的 10^k 修正、ROE/ROIC 是否可引用 |
- 跨市场标的(AH/ADR)必须分别独立调用,禁止汇率换算。
- 取数后必检查
meta.engines_used/errors;两引擎都失败时报告首页 ⚠️ 标注"数据降级"。 - v2.4 铁律:必读
meta.data_health。price_status=MISSING→ 禁止继续估值分析,须人工换源取价
(绝不允许用研报目标价 / 52 周区间 / 分析师预期顶替现价);price_source含hist/daily/sina/derived
→ 报告须标注"非实时收盘价 + 取数时点";silent_empty_apis非空 → 在 K.4 说明哪些接口本次无数据。 - 百分数与小数口径已在 v2.4 统一为小数(
profitability.* / dividend.*均带_unit标注)。
引用任何比率前先看_unit,禁止把21.13与0.2113混着写进同一张表。 - 必读
models._data_source_level:report_detail= 明细级(模型可信);abstract_only= 摘要级(M/Z/反向 DCF 为 NA,须标"数据降级")。 - 禁止用经营现金流冒充 FCF;
_market_cap_used.source若为derived(...),报告须如实标注市值系派生并换源复核。
> 详见 → references/api-data-source-protocol.md(双引擎分工、字段映射、降级策略)
前置 2:多信源数据校验(铁律)
铁律:一切分析建立在可信数据之上。单一信源 = 错误风险。
三条不可逾越的红线(完整操作手册见参考文件):
1. 价格类数据 ≥ 3 个独立权威源交叉验证(1 个 API 源 + 1-2 个网页源即满足);每个价格必标 [数据类型 / 取数时间戳 / 币种]。
2. 数据类型混淆是头号红线:严禁把研报目标价 / 52 周区间 / 分析师一致预期 / DCF 估值当作"现价"。(血泪教训:海尔 06690 把研报目标价 HK$31.30 误当现价,实际仅 20.86,结论全反。)
3. 跨市场标的分别独立取数,AH 溢价方向必须从原始价格重算。
> 详见 → references/data-verification-protocol.md(9 类字段校验流程、口径对齐、冲突处理、Red Flags、校验记录表模板)
前置 3:信源等级强制标注(铁律)
铁律:"列出信源" ≠ "标注等级"。不分级的信源列表等于没有校验。
- 每个定量数据必须在行内/相邻列标注信源等级,且至少 1 个 🟢🟢 二级权威以上。
- "二级媒体互相抄录"视为单源,降级 🟡;报告末尾 K.4 必须列出所有 🟡/🔴 弱信源。
| 🟢🟢🟢🟢 Tier 0 | 🟢🟢🟢 Tier 1 | 🟢🟢 Tier 2 | 🟢 Tier 3 | 🟡 Tier 4 | 🔴 Tier 5 |
|---|---|---|---|---|---|
| API 直取 | 一级官方 | 二级权威 | 三级参考 | 单源/弱源 | 传闻 |
前置 4:近 30 天重大事件扫描(铁律)
铁律:财报反映过去,新闻预示未来。只看历史数字做估值,等于开车只看后视镜。
必扫 5 类(含竞争对手动作):① 监管/政策 ② 管理层变动 ③ 重大战略 ④ 重大诉讼/安全 ⑤ 重大合作/并购/融资。🔴 级事件须在报告首页单列专栏并显式调分。
前置 5:强制提取时间序列(铁律)
铁律:禁止只用单年快照评估"好公司/好价格"。 取数脚本已自动提取 time_series,报告公司模块与估值模块必须引用至少 5 年序列趋势(ROE 一致性、毛利率走向、营收/FCF CAGR、股本变化)。
- 引用 CAGR 时必须同时看
growth_consistency.*_cagr_detail的years_span/gaps;gaps > 0须在报告披露(缺失年会降低置信度)。
> 详见 → references/time-series-analysis.md
前置 6:模型可用性护栏(v2.2 新增铁律)
铁律:模型算得出 ≠ 模型能用。引用任何量化结论前,必须先读该模型的可用性字段。
| 检查项 | 字段 | 不通过时的处置 |
|---|---|---|
| 行业属性是否确认 | models.industry_type_confidence |
为 low → 禁止用 M/Z-Score 否决,须用 --industry-type 显式指定后重跑 |
| 造假/破产模型是否可用 | models._veto_eligibility.{beneish_usable, altman_usable} |
为 false → 报告写"该模型不适用,已转定性判断",不得机械否决 |
| F-Score 数据是否够 | models.piotroski_f.{data_coverage, applicable} |
applicable=false(覆盖 < 7/9)→ 禁止引用 f_score 总分与 rating,只能引 covered_flags=true 的分项 |
| Z-Score 用的哪个版本 | models.altman_z.{variant, thresholds} |
报告必须写明 Z 或 Z'' 及对应阈值,不得跨版本套阈值 |
| 反向 DCF 是否稳健 | models.reverse_dcf.sensitivity.high_sensitivity |
为 true(spread > 4pct)→ 必须贴敏感性表并声明"估值对折现率高度敏感,不构成明确判断" |
| 基准 FCF 口径 | models.reverse_dcf.assumptions.base_fcf_resolution.mode_used |
若为 latest/fallback_* → 须说明为何未用多年均值 |
| 历史分位是否有源 | valuation_history.applicable |
为 false → 该项按 0 分计并在总分中剔除权重,禁止凭印象填百分位 |
| ROE 能不能引用(v2.4) | models._unit_health.{roe_usable, roic_usable, roe_series_usable} |
为 false → 杜邦 ROE / ROIC / ROE 时序一律写 NA(量纲待核),该三项按中性分计并在报告说明换源复核动作 |
| 量纲是否被修正过(v2.4) | models._unit_health.corrections_applied |
任一系数 ≠ 1 → 说明原始两表单位不一致,报告必须披露该修正(如"利润表数值已×1000 对齐资产负债表") |
| ROE 口径是否可比(v2.4) | models.dupont.roe_vs_api / unit_consistency.caliber_warnings |
verdict 为"口径差异" → 报告须并列杜邦 ROE 与 API ROE 两个数,并说明采信理由(年报/TTM、归母/含少数股东、平均/期末) |
| 取数是否静默失败(v2.4) | meta.data_health.{price_status, silent_empty_apis} |
MISSING → 禁止继续估值;silent_empty_apis 非空 → K.4 列明哪些接口无数据 |
头号铁律:applicable=False 的模型一律标注 "NA(不适用/数据不足)",绝不允许"脚本说 NA 却仍下了量化结论"。
v2.4 补充铁律:一个"看起来很漂亮"的 ROE 比一个缺失的 ROE 危险得多。 量纲错乱不会抛异常,
只会把 18% 变成 1800% 或 0.18%,并顺带污染"财务质量 30 分"与"时序 15 分"。
引用 ROE / ROIC / 周转率之前,必须先读 _unit_health。
前置 7:跨市场税负差异校验(v2.3 新增铁律 · 仅多地上市标的适用)
铁律:同一标的多地上市时,禁止仅用名义价差(AH 溢价 / ADR 平价)下择市结论。名义价差是税前口径,投资者拿到手的是税后口径。
> 触发条件:标的同时在两个及以上市场上市(AH 两地、港股 + ADR、多重主要上市等)。单一市场标的跳过本前置,但仍须在结论中说明股息税对持有回报的影响。
7.1 四步强制流程
| 步骤 | 动作 | 不做的后果 |
|---|---|---|
| ① 声明税负假设 | 写明投资者身份 × 持有渠道 × 预计持有期三要素,再谈税率 | 税率无意义。同一只港股,港股通持有 20%、香港券商直持 H 股 10%、直持红筹股 0% |
| ② 算税后股息率 | 两地各算税后股息率 = 税前股息率 × (1 − 税率),并折算统一币种的每股到手现金 |
高股息标的的择市结论会反向 |
| ③ 算税负临界溢价 | prem* = (1−t_A)/(1−t_H) − 1;再算 税后实际溢价 = (1+prem)/(1+prem*) − 1 |
无法判断名义溢价是"真贵"还是"税负错觉" |
| ④ 按投资目的分层给结论 | 纯红利 / 红利+估值修复 / 成长 / 短期交易四类,各自给推荐市场 | 单一答案必然对部分投资者是错的 |
7.2 税负临界溢价公式(核心工具)
1 − t_A
prem* = ───────────− 1 (t_A、t_H 为两地股息税率)
1 − t_H
该公式与股价、股息、汇率全部无关,只取决于两地税率差。
| 判据 | 纯红利投资者结论 |
|---|---|
名义溢价 < prem* |
A 股(高价市场)税后股息率反而更高 → 选 A 股 |
名义溢价 ≈ prem*(±3pct) |
税后等价 → 由汇率风险、交易成本、流动性决定 |
名义溢价 > prem* |
H 股(低价市场)税后更优 → 选 H 股 |
常用临界值速查:
| 情形 | t_A |
t_H |
prem* |
|---|---|---|---|
| 内地个人·港股通 H 股 vs A 股长持 >1 年 | 0% | 20% | +25.0% |
| 内地个人·港股通 H 股 vs A 股持 1 月–1 年 | 10% | 20% | +12.5% |
| 内地个人·港股通 H 股 vs A 股持 <1 月 | 20% | 20% | 0%(税负对称) |
| 内地个人·香港券商直持 H 股 vs A 股长持 | 0% | 10% | +11.1% |
7.3 三条红线
- 禁止笼统说"税负":股息税打击红利型持有(每年复发生),资本利得税打击成长型持有(退出时一次性、可长持递延)。两者影响非对称,不得合并表述。
- 「暂免」类优惠必须核实当前有效期(如港股通资本利得暂免为定期延续性质),并标注政策文号;过期未续会实质改变结论。
- 必须计入隐性成本:ADR 托管费(约 0.01–0.05 美元/股/年,相当于隐性股息税)、港股通双向汇兑价差与汇率波动、港股印花税双边 0.1% vs A 股单边 0.05%。对高股息标的,隐性成本可与税率差同量级。
7.4 呈现铁律
-估值模块必须包含三张表:表 A 税负假设声明 / 表 B 税后股息率对比 / 表 C 临界溢价与择市矩阵。
- 若名义溢价与税后结论方向相反,必须在报告首页概要显式标注该反转(这正是最容易误导读者的情形)。
- 必须写出"若持有渠道改为 {其他},临界溢价变为 {X}%,结论 {是否反转}"。
- 投资结论的"如果买入"栏必须写明买哪个市场的哪个代码,并附税后依据。
- 须提示境外所得的申报义务,不得暗示可以不申报。
> 详见 → references/cross-market-tax-guide.md(各市场税率对照、隐性成本、必备产出表、资本增值目的的税负权衡、自检清单)
五大分析模块(双层评分 · 三维均为纯 100 分制)
> 三大维度(行业/公司/估值)各自满分 100 并按权重加权;模块四、五为加法调整分。
> "量化层"由脚本 models / time_series / valuation_history 提供证据;"定性层"沿用邱国鹭框架。
模块一:行业分析(权重 30%,满分 100)
定性四维,各 0-25:
| 维度 | 满分 | 关键问题 |
|---|---|---|
| 行业格局 | 25 | 几个寡头分天下,还是一堆人打成狗? |
| 定价权 ⭐最关键 | 25 | 能不能涨价、涨了客户还买不买? |
| 需求稳定性 | 25 | 这东西 10 年后还有人买吗? |
| 进入壁垒 | 25 | 别人想进来抢饭碗,难不难? |
结构化增强框架:用波特五力逐力点评并指出决定性力量;判定行业生命周期阶段(渗透率/增速/盈利三佐证);分析产业链议价地位("收税还是交税");估算 TAM/SAM/SOM 并用反向 DCF 隐含增速推算的隐含份额反向校验(成长股必做)。
| 评级 | 分数 | 含义 |
|---|---|---|
| A/B/C/D | 80-100 / 60-79 / 40-59 / 0-39 | 优质 / 不错 / 一般 / 慎入 |
> 详见 → references/industry-capital-framework.md、references/three-good-principles.md
模块二:公司分析(权重 35%)
v2.2:公司分为纯 100 分制四维,时序从"±10 校准"升级为正式维度,消除分母歧义。
公司分 = 护城河 35 + 财务质量量化 30 + 管理层/资本配置 20 + 时间序列趋势 15 = 100
2.1 护城河(0-35 分,定性层)
五种护城河可叠加(品牌≤9 / 成本≤7 / 转换成本≤7 / 网络效应≤7 / 牌照专利≤5),并评估护城河是在加深(+3)还是被侵蚀(-3~-12),合计上限 35。详见 references/moat-analysis-guide.md。
2.2 财务质量硬模型(0-30 分,量化层 · 脚本计算)
| 模型 | 字段(models.*) | 含义 | 评分指引(分配) |
|---|---|---|---|
| 杜邦分解 | dupont |
ROE = 净利率 × 周转率 × 权益乘数 | 0-8:经营驱动加分;高杠杆堆出的 ROE 警惕。applicable=false(量纲失真/数据缺失)时本项按 4 分中性计并标 NA |
| ROIC vs WACC | roic |
是否真正创造价值 | 0-8:ROIC 长期 > WACC → 满分;< WACC 仍扩张 → 0 |
| Piotroski F-Score | piotroski_f |
财务健康九项 | 0-7:≥7 优 / 4-6 中 / ≤3 差。applicable=false 时本项按 3.5 分中性计并标注 |
| 盈余质量 | earnings_quality |
净利现金含量 / 应计比 | 0-7:现金含量 ≥1 满分;<0.5 给 0-2 |
- 杜邦/ROIC 主口径为平均余额(
basis=average_balance);与 API 报告值差异 > 15% 时报告须列两者并说明采信理由
(v2.4 起由dupont.roe_vs_api自动给出diff_percentage_points与verdict,并已自动识别百分数/小数口径)。 - v2.4:所有比率均为小数口径(0.18 = 18%),见
dupont.units/roic.units;报告中若写百分号须自行 ×100,禁止混用。
2.3 管理层质量 + 资本配置(0-20 分,定性层)
诚信(0-5)/ 能力(0-5)/ 股东回报(0-5)/ 战略聚焦与资本配置(0-5)。资本配置含:再投资回报(ROIC vs WACC)、并购理性、分红回购理性、留存收益转化(5 年市值增量 vs 累计留存)、股权激励稀释检查(time_series.shares 趋势)。详见 references/industry-capital-framework.md 第二部分。
2.4 时间序列趋势(0-15 分,v2.2 正式维度)
| 评分 | 判据 |
|---|---|
| 12-15 | ROE 长期 >15% 且波动小、毛利率平稳/上行、净利 CAGR ≥ 营收 CAGR、FCF 持续为正 |
| 8-11 | 趋势平稳,个别指标走弱 |
| 4-7 | 多项趋势走弱(毛利率下行 / 增收不增利 / FCF 波动) |
| 0-3 | 趋势明显恶化(即使单年数据靓丽也按此档) |
引用 time_series 与 models.growth_consistency;序列 < 3 年时本项按 7.5 分中性计并标注"序列过短,趋势判断降级"。
| 公司评级 | A/B/C/D:80-100 / 60-79 / 40-59 / 0-39 |
|---|---|
> 量化模型口径详见 → references/financial-quality-models.md
模块三:价格/估值分析(权重 25%)
v2.2 关键修正:量化硬模型从"不占分"升级为估值分 60 分主体。 便宜是硬道理,但便宜必须用模型证明——这是 v2.0 的信条,v2.2 才真正兑现到分数上。
估值分 = 反向 DCF 隐含增速合理性 30 + 内在价值安全边际 30
+ PE 成因与陷阱 25 + 历史估值分位 15 = 100
3.1 反向 DCF 隐含增速合理性(0-30 分,量化层)
读 models.reverse_dcf,与历史 CAGR / 分析师预期 / 行业天花板三方对比:
| 判据 | 分数 |
|---|---|
| 隐含增速 显著低于历史可持续增速(市场过度悲观) | 25-30 |
| 隐含增速 ≈ 历史增速(定价合理) | 15-24 |
| 隐含增速 高于历史增速但有明确新驱动 | 8-14 |
| 隐含增速 显著高于历史增速且无新驱动(透支未来) | 0-7 |
三条硬规则:
1. 必须写出三组对比数:隐含增速 / 近 5 年营收(或净利) CAGR / 分析师未来 3 年预期。
2. sensitivity.high_sensitivity=true 时必须贴出 8%/9%/10%/11% 四档隐含增速表;若不同档位导致贵/便宜结论反转,本项分数取该区间对应分数的下限并声明不确定性。
3. applicable=false(亏损/负 FCF)→ 本项按 EPV 或 PS/PB 路由替代评分,并标注"反向 DCF NA"。
3.2 内在价值与安全边际(0-30 分,量化层)
安全边际 = (内在价值估计 − 现价) / 内在价值估计
内在价值 = 情景概率加权 E[V] / EPV / SOTP 多模型交叉后取审慎值
| 安全边际 | 分数 |
|---|---|
| > 40% | 25-30 |
| 20-40% | 18-24 |
| 0-20% | 8-17 |
| < 0%(高估) | 0-7 |
铁律(v2.2 新增):估值模块至少跑通 2 个独立模型(反向 DCF + 情景/EPV/SOTP 任一)。仅 1 个可用时估值分封顶 70,并在报告标注"估值证据不足"。同时须列出熊市价 V_bear 作为下行参照。
3.3 PE 成因与估值陷阱(0-25 分,定性层)
先问"为啥这个公司 PE 低/高?"——PE<10 基本面好可能错杀,基本面差则是估值陷阱。估值陷阱清单(任一命中即扣分并触发 M-Score 复核):营收连续下滑 / 毛利率持续走低 / 行业被颠覆 / 靠非经常损益撑利润 / 应收账款暴增。详见 references/valuation-traps.md。
3.4 历史估值分位(0-15 分)
读 valuation_history.pe_ttm.percentile / pb.percentile(5-10 年):
| 分位 | 分数 |
|---|---|
| ≤ 20%(历史低位) | 12-15 |
| 20-50% | 8-11 |
| 50-80% | 4-7 |
| > 80%(历史高位) | 0-3 |
valuation_history.applicable=false时:本项计 0 分,且估值分按 85 分制归一(估值分 = 实得分 / 85 × 100),并标注"历史分位无数据源,已按降级口径归一"。禁止凭印象填百分位。- 周期股:表观分位无意义,必须改用归一化盈利重算 PE 分位(见
references/time-series-analysis.md第三节)。
3.5 分行业估值路由(选错模型 = 误判)
| 行业类型 | 首选模型 |
|---|---|
| 金融(银行/保险/券商) | PB-ROE / DDM(❌ 标准 DCF、❌ M/Z-Score) |
| 周期(资源/化工/航运/地产) | 归一化盈利 PE(❌ 景气顶点 PE),取数用 --fcf-base normalized |
| 成长(科技/医药/平台) | 反向 DCF / PEG / Rule of 40 |
| 稳定消费/公用事业 | DCF / DDM / FCF 收益率 |
| 重资产制造 | EV/EBITDA / EPV / PB |
| 亏损但有收入 | PS / 单位经济模型(❌ PE) |
| 多元化集团/控股/投资型 | SOTP 分部加总(各分部各用各的尺子,减净负债、少数股东权益、控股折价) |
> 模型口径与 SOTP 明细表模板详见 → references/valuation-models.md
3.6 跨市场税后择市(v2.3 新增 · 仅多地上市标的)
不占估值分,但为独立的强制产出——它不改变"这家公司值多少钱",只回答"该在哪个市场买"。
| 必产出 | 内容 |
|---|---|
| 表 A | 税负假设声明(投资者身份 × 持有渠道 × 持有期 → t_A / t_H / 资本利得税,附政策文号与信源等级) |
| 表 B | 两地税后股息率对比 + 统一币种每股到手现金 + 隐性成本调整后口径 |
| 表 C | 名义溢价 / 税负临界溢价 prem* / 税后实际溢价 / 按四类投资目的分层的择市矩阵 |
与估值分的联动:
- 若持有目的为纯红利,3.2 安全边际须补充「税后股息率 vs 无风险利率」对照,而非只用税前股息率。
- 若名义溢价 < prem*(高价市场税后反而更优),则不得再以"名义溢价过高"为由给高价市场扣估值分——该扣分逻辑在税后口径下不成立。
- 资本增值目的的税负权衡:估值修复空间 = (高PE市场PE / 低PE市场PE) − 1 与 年化股息税损 ≈ 税前股息率 × 税率差 比较;修复空间 > 税损 × 持有年数时,选低估值市场。但须同时声明「修复是不确定事件,税损是确定发生」,并与 3.3 PE 成因分析联动——若折价源于真实且可持续的基本面缺陷,修复不会发生,税损即净损失。
> 详见 → references/cross-market-tax-guide.md
模块四:逆向投资检查(调整分 −5 ~ +5)
市场情绪极度恐慌且三好 OK → 逆向加分;极度狂热即使三好不错也远离。逆向三重验证(行业还好吗/公司还好吗/价格够便宜吗):
| 验证结果 | 调整分 |
|---|---|
| ✅✅✅ 三个都通过 + 情绪极度悲观 | +5 |
| ✅✅✅ 三个通过,情绪中性 | +2 |
| ✅✅❌ 两个通过 | 0 |
| ✅❌❌ 一个通过 | −3 |
| ❌❌❌ 全不通过 / 情绪极度狂热 | −5 |
详见 references/contrarian-checklist.md。
模块五:定价权专项(调整分 −5 ~ +5)
核心问题:能不能每年默默提价、客户还没脾气?
| 定价权 | 调整分 |
|---|---|
| 强(可年年提价,毛利率反升) | +5 |
| 中等(可跟随成本/通胀提价) | +2 |
| 弱(提价空间小,受竞争制约) | 0 |
| 无(价格完全由市场决定) | −5 |
来源:品牌忠诚 / 产品差异化 / 转换成本 / 供给受限 / 刚需。与波特五力的供应商/买方议价联动分析。
综合评分体系(v2.2 数学自洽版)
加权总分
v2.2 关键修正:三大维度加权得 90 分池,逆向 + 定价权为 10 分调整池,合计恰好 100。所有调整均为「加法绝对分」,不再使用 ±% 表述。
基础分 = 行业分×30% + 公司分×35% + 估值分×25% → 0-90 分
调整分 = 逆向调整(−5~+5) + 定价权调整(−5~+5) → −10~+10 分
综合得分 = 基础分 + 调整分 → 钳制在 0-100
- 三个维度分数均为纯 100 分制(行业四维各 25;公司 35+30+20+15;估值 30+30+25+15)。
- 报告必须列出完整算式(如
65×0.30 + 64×0.35 + 73×0.25 = 19.50 + 22.40 + 18.25 = 60.15),且经交卷前自检的算术回验。 - ⛔ 禁止再出现"总分 ±10%"这类乘法表述——历史上这正是"分项加权 60.15 却写成 63"的偏差来源。
投资结论矩阵
| 综合得分 | 结论 | 建议 |
|---|---|---|
| 80-100 | ⭐强烈推荐 | 三好齐备,可重仓 |
| 70-79 | 🟢推荐 | 标准仓位买入 |
| 60-69 | 🟡可关注 | 小仓位或等更好价格 |
| 50-59 | 🟠观望 | 短板明显,跟踪暂不建仓 |
| 40-49 | 🔴不推荐 | 问题较多 |
| <40 | ❌远离 | 不符合任何价值投资条件 |
一票否决(v2.2 分两档 + 与总分联动)
> 前提铁律:量化否决必须先通过前置 6 的可用性检查——models._veto_eligibility.{beneish_usable, altman_usable} 为 true 方可作为否决依据。金融股、行业属性未确认(confidence=low)、缺明细数据的标的一律改用定性判断,不得机械否决。
A 档 · 出局(结论直接 ❌远离,不论总分)
| 触发条件 | 说明 |
|---|---|
| 🚫 已证实的财务造假 / 重大违规历史;管理层诚信评分 = 0 | 造假是最高级别出局项 |
🚫 Beneish M-Score > −1.78 且 applicable=true 且 defaults_used 为空/极少 且 beneish_usable=true |
盈余操纵高风险;须人工追溯财报原文,未排除即出局 |
B 档 · 封顶(结论封顶为 🔴不推荐)
| 触发条件 | 说明 |
|---|---|
| 🚫 行业评分 < 30 | 夕阳行业 |
| 🚫 护城河评分 < 10(满分 35) | 毫无竞争优势 |
| 🚫 连续 3 年经营现金流为负 | 现金流枯竭 |
| 🚫 有息负债率 > 80% 且无合理解释 | 杠杆失控 |
🚫 Altman Z 落入困境区 且 altman_usable=true |
必须按 variant 用对阈值:Z < 1.81 或 Z'' < 1.10。连续 2 年落入 → 升为 A 档 |
否决的呈现铁律:触发后不得篡改各分项得分,而须在结论栏显式写:
原始综合得分 78 分 → 触发 A 档一票否决(M-Score 报警)→ 最终结论:❌远离
避免出现"综合 78 分 / 结论不推荐"这类观感矛盾却无解释的报告。
🔴 交卷前自检(强制后置,不可跳过)
铁律:报告写完 ≠ 可以交卷。一切结论必须在"打印出来"之后再被自己质疑一次。
第 0 关 · 机器门禁(v2.2 新增,必须先过)
python .codebuddy/skills/stock-value-analyzer/scripts/self_check.py \
--report reports/xxx_价值分析_YYYY-MM-DD.md \
--data ./.svadata/value_analysis_xxx.json
脚本自动检查:① 报告引用的 models.* 数值与 JSON 是否一致 ② 是否越界引用了 applicable=false 的模型 ③ 评分表格算术(A+B=C)是否成立 ④ 加权总分是否等于分项加权和 ⑤ 定量数字是否带信源等级 ⑥ K.4 章节是否存在 ⑦ 高敏感性反向 DCF 是否附敏感性表 ⑧ 跨市场税负三表是否齐备 ⑨ (v2.4 C10)ROE/ROIC 不可用时是否越界引用、量纲修正与口径差异是否披露 ⑩ (v2.4 C11)现价缺失 / 兜底价来源 / 静默返回空的接口 / 量纲体检失败是否已披露。
FAIL → 禁止交付,必须修正后重跑。
第 1-3 关 · 人工复核
- 关键数据复验:对所有进入评分的关键数字(现价/市值/PE/净利/股息率/AH 溢价/建仓区间/一票否决原始数据)换源重取一次,信源不得与前置阶段完全重叠。
- 核心结论反验证(反向 7 问):① 结论是否依赖单一数据(错 10% 会反转吗)② 评分与文字是否一致 ③ 一票否决项逐条真未触发 ④ 近 30 天事件真已纳入 ⑤ 跨市场逻辑自洽 ⑥ 算术回验(所有 A+B=C / 加权和逐条二次独立计算)⑦ 信源等级回验(弱信源未进评分)。
- 量化层一致性复核:报告引用的反向 DCF 隐含增速、F/M/Z-Score、杜邦分解是否与脚本
models输出一致?Z-Score 是否用对了 variant 对应的阈值?是否存在"脚本说 not applicable 却仍下了量化结论"的越界?敏感性高时是否已声明不确定性? - 报告末尾显式写:"本报告已通过交卷前自检(机器门禁 + 数据复验 + 反向 7 问 + 量化层一致性),可以交付。"
> 未通过 → 报告首行标红"⚠️ 草稿未通过自检,不得作为决策依据"。详见 → references/data-verification-protocol.md
工作流
用户输入(股票名称/代码)
│
├── 前置 1:API 优先取数(fetch_stock_data.py,自动算 models/time_series/valuation_history)🔴
│ 金融股加 --industry-type financial;周期股加 --fcf-base normalized
├── 前置 2:多信源数据校验(价格 3 源 / 防类型混淆 / 跨市场独立)🔴
├── 前置 3:信源等级强制标注(六级,弱信源 K.4 披露)🔴
├── 前置 4:近 30 天重大事件扫描(5 类 + 竞品)🔴
├── 前置 5:强制提取时间序列(5-10 年趋势,查 gaps)🔴
├── 前置 6:模型可用性护栏(读 applicable / confidence / coverage / high_sensitivity)🔴
├── 前置 7:跨市场税负差异校验(多地上市标的必做:税后股息率 + 临界溢价 prem* + 分层择市)🔴
│
├── 模块一 行业分析(100):四维定性 + 波特五力/生命周期/产业链/TAM
├── 模块二 公司分析(100):护城河35 + 财务质量30 + 管理层/资本配置20 + 时序15
├── 模块三 估值分析(100):反向DCF合理性30 + 安全边际30 + PE陷阱25 + 历史分位15
│ └─ 3.6 跨市场税后择市(不占分,多地上市标的强制产出表A/B/C)
├── 模块四逆向投资:调整分 −5~+5
├── 模块五 定价权:调整分 −5~+5
│
├── 综合评分:基础分(0-90) + 调整分(−10~+10) → 一票否决 A/B 档裁决
├── 报告初稿(标记"初稿")
│
└── 交卷前自检:self_check.py 机器门禁 → 数据复验 + 反向 7 问 + 量化一致性 🔴
报告输出格式
完整报告结构与模板见 templates/analysis-report.md,核心章节:
- 一、分析概要(标的/日期/现价含信源等级/综合评分算式/投资结论/各项自检状态/模型可用性一览)
- 一·补 近 30 天重大事件(仅 🔴 级)
- 二、行业分析(四维 + 五力/生命周期/产业链/TAM)
- 三、公司分析(护城河35 + F/M/Z 评分卡30 + 杜邦表 + 管理层20 + 时序15)
- 四、估值分析(反向 DCF 隐含增速 + WACC 敏感性表 + 情景概率加权 + EPV + SOTP(适用时) + PE 陷阱 + 历史分位)
- 四·补 跨市场税后择市(v2.3 · 多地上市标的强制:税负假设声明 + 税后股息率对比 + 临界溢价与分层择市矩阵)
- 五、逆向投资 & 定价权(调整分 −5~+5 各一项)
- 六、投资结论(评分汇总算式 + 一票否决 A/B 档检查 + 买/不买条件、最大风险;跨市场标的须写明买哪个市场的代码)
- 七、风险提示
- 八、交卷前自检摘要(含 self_check.py 门禁结果)
- K、完整信源索引(K.1 一级 / K.2-3 二三级 / K.4 弱信源清单)
- 附录:
models/time_series/valuation_history原始输出快照
资源目录
scripts/
fetch_stock_data.py— 一键取数(yfinance + AkShare 双引擎),输出标准 JSON(含time_series/models/valuation_history/meta.data_health/_fetch_diagnostics);支持--strictvalue_models.py— 量化模型库:量纲一致性体检/杜邦/ROIC/F-Score/M-Score/Z-Z''-Score/盈余质量/反向 DCF(含敏感性)/CAGR 一致性self_check.py— 交卷前自检机器门禁 C1-C11(量化一致性、算术回验、越界引用、量纲与 ROE 可用性、取数健康度披露)- 依赖:
pip install -r requirements.txt
references/
api-data-source-protocol.md— API 优先取数协议(双引擎分工 + 字段契约 + 降级策略)data-verification-protocol.md— 多信源数据校验完整手册(红线细则、Red Flags、校验表模板)three-good-principles.md— 三好原则评估标准与案例(含量化层配合说明)moat-analysis-guide.md— 护城河五种类型深度分析指南valuation-traps.md— 估值陷阱识别手册(打通 M-Score)contrarian-checklist.md— 逆向投资检查清单valuation-models.md— 反向 DCF / 情景估值 / EPV / SOTP 分部加总 / 分行业估值路由financial-quality-models.md— 杜邦 / ROIC / F-Score / M-Score / Z-Z'' / 盈余质量time-series-analysis.md— 时间序列趋势、ROE 一致性、周期股归一化industry-capital-framework.md—波特五力 / 生命周期 / 产业链 / TAM + 资本配置能力cross-market-tax-guide.md— v2.3 新增:跨市场税负与择市(临界溢价公式 / 各市场股息与资本利得税对照 / 隐性成本 / 三张必备产出表 / 自检清单)
templates/
analysis-report.md— 分析报告模板(v2.2 评分结构)
核心原则提醒
- 三好缺一不可 — 好行业、好公司、好价格
- 定性看方向,定量定边界 — 两层都过才算数
- 便宜是硬道理,但便宜要用模型证明 — 反向 DCF / 情景 / EPV / SOTP,且占实分
- 模型算得出 ≠ 模型能用 — 先看
applicable/confidence/coverage,不可用就诚实写 NA - 一个数字不要看,要看它对假设有多敏感 — 反向 DCF 必附 WACC 敏感性表
- PE 是结果不是原因 — 先看基本面,再看 PE,配合 F/M/Z-Score
- ROE 要看是经营赚来的还是杠杆堆的 — 杜邦分解(平均余额口径)
- 定价权是最关键指标 — 能不能默默提价
- 看 5 年趋势,不看 1 年快照 — 时间序列一致性,基准 FCF 用多年均值
- 会赚钱更要会花钱 — 资本配置能力决定长期复利
- 多地上市先看税后到手 — 名义价差是税前的,你拿到手的是税后的;临界溢价
prem* = (1−t_A)/(1−t_H) − 1 - 认清能力圈,看不懂就别碰
- 知易行难 — 框架给你了,执行靠自己
版本记录
- v2.4(2026-09-29) — 🔴 取数脚本两类「静默故障」修复:脚本返回成功,但结论全错
- ① AkShare 行情静默返回空:全市场快照返回空表(限流/风控)、代码列名漂移(
代码→symbol)、
代码格式不匹配(00700vs0700)、字段值为 0 —— 四种情况均不抛异常,spot静静变成{},
errors[]仍为空。报告只是"没有现价",极易被顺手用研报目标价顶替(v1.3 血泪教训重演)- 新增
_fetch_diagnostics:逐接口逐步记账(ok / empty / not_found / schema_drift / field_missing / error) - 代码匹配改为归一化比对(容忍前导零与
hk/sh/sz前缀);代码列名多候选自动识别 - 港股新增两级价格兜底(东财日线 → 新浪快照)、A 股新增跨域兜底(新浪日线,摆脱东财单点依赖)
- 新增
meta.data_health与--strict(现价缺失/量纲不过 → 退出码 3 硬失败) - 附带修复:yfinance 限流时产出"字段齐全但值全 null 的空壳 models",旧判据据此认为
models_ok=True
而整段跳过 AkShare 明细兜底;现要求time_series.fiscal_periods非空 - 附带修复(非日历财年被滤空 / 52 周财年历错配):旧版硬编码
-12-31筛年报,
苹果(9月)/微软(6月)/英伟达(1月)/大量港股(3月) 被筛成 0 行 → models 全 null 且不报错;
而按"MM-DD 众数"筛则会让 52/53 周财年历公司得到跨 20 年的稀疏序列。
现改为value_models.pick_annual_dates()(财年结束月 + 跨月漂移窗口 + 每财年只取最晚一期),
并在time_series._fiscal_year_meta披露财年口径与缺失年告警。
实测 AAPL:修复前营收 CAGR 21.1%、ROE 120.9%(均错)→ 修复后 7.58%、171.42%(与 API ROE 零误差) - 美股日线兜底不再硬编码
105.前缀(纳斯达克),改为 105/106/107 依次尝试 —— 前缀错了接口只返回空表 - 实测(2026-09-29,腾讯 0700.HK):yfinance TLS 失败 + 东财港股快照与日线双双
RemoteDisconnected,
新浪快照兜底取到 432.0 HKD,并成功用东财明细跑通全部模型(旧版此处现价为空且errors为空数组)
- 新增
- ② 杜邦分解单位错乱导致 ROE 失真:ROE = 净利率 × 周转率 × 权益乘数,分子来自利润表、
分母来自资产负债表,属跨表比率;两表量纲差 10^k 或把 API 的百分数 ROE 当小数用,ROE 即整体失真- 实测:东财港股
ROE_AVG=21.13(百分数)被直接透传,与杜邦 ROE0.2113相差 100 倍,
前置 6 的"差异 >15% 须并列两者"形同虚设 - 新增
value_models.check_unit_consistency():硬锚 1 资产负债表恒等式(总资产−总负债)/股东权益≈1 - 硬锚 2 API 报告 ROE + 软锚 3 四类比率合理区间
- 只认 10 的整数次幂:单位错乱必为 10^k;1.3/3 倍偏离属口径差异(年报/TTM、归母/含少数股东、
平均/期末),归入caliber_warnings只告警不修正,避免把口径差异洗掉 - 不可定量 → 不硬凑:
dupont/roic/growth_consistency.roe_*置applicable=False,报告必须标 NA;
ROE 时序自动剔除|ROE|>500%的失真年度 - 全引擎百分数字段统一 ÷100 并标注
_unit;新增models._unit_health一眼可读"ROE 能不能引用" - 新增
dupont.roe(净利÷平均权益 权威口径)与dupont.roe_vs_api交叉校验
- 实测:东财港股
- 自检门禁扩展至 C1-C11:新增 C10(ROE/ROIC 越界引用、量纲修正未披露、口径差异未并列)
与 C11(现价缺失、兜底价来源、静默空接口、量纲体检失败未披露) - 兜底引擎补空字段时改写
source为混合来源并记录_filled_by_fallback,杜绝"值来自 AkShare、
信源却标 yfinance"的错标 - v2.3(2026-08-09) — 🔴 跨市场税负差异强制纳入择市决策(修复会导致择市结论反向的硬伤)
- 新增前置 7「跨市场税负差异校验」铁律:多地上市标的(AH / 港股+ADR / 多重上市)禁止仅用名义价差下择市结论
- 新增税负临界溢价公式
prem* = (1−t_A)/(1−t_H) − 1:与股价、股息、汇率无关,只取决于两地税率差;港股通 H 股 vs A 股长持>1 年的临界溢价恰为 +25%,并给出税后实际溢价 = (1+prem)/(1+prem*) − 1 - 实测教训:中国移动名义 AH 溢价 27.5% → 原判「A 股溢价 >20% 均不构成价值投资标的」;计入 H 股 20% 股息税后税后实际溢价仅约 1.9%,纯红利投资者选A 股税后到手多 25%,结论反转
- 明确税率取决于「投资者身份 × 持有渠道 × 标的注册地」,不是「标的在哪上市」:同一港股,港股通 20% / 香港券商直持 H 股 10% / 直持红筹股 0%
- 择市结论强制按投资目的分层(纯红利 / 红利+估值修复 / 成长 / 短期交易),废止单一的「买 A 还是买 H」
- 区分股息税与资本利得税的非对称影响:前者打击红利型持有(每年复发生),后者打击成长型持有(可长持递延);禁止笼统合并为「税负」
- 强制计入隐性成本:ADR 托管费、港股通双向汇兑价差与汇率波动、港股双边印花税 0.1% vs A 股单边 0.05%
- 新增资本增值目的的税负权衡判据:
估值修复空间 vs 年化股息税损 × 持有年数,且须与 PE 成因分析联动(折价若源于真实缺陷,修复不发生则税损为净损失) - 「暂免」类税收优惠须核实当前有效期并附政策文号;须提示境外所得申报义务
- 新增
references/cross-market-tax-guide.md;模块三新增 3.6节;报告模板新增「四·补 跨市场税后择市」章节(表 A/B/C) - v2.2(2026-07-30) — 🔴 评分体系数学自洽化 + 量化模型口径修正(修复会导致结论反向的硬伤)
- 评分归一为纯 100 分制:公司分 = 护城河35 + 财务质量30 + 管理层20 + 时序15(原 ±10 校准升为正式维度);消除 90/100 分制混用
- 逆向/定价权改为加法绝对分(−5~+5)并纳入分母:
基础分(0-90) + 调整分(−10~+10) = 综合分,废止"总分 ±10%"乘法表述(历史偏差来源) - 估值硬模型占实分:反向 DCF 合理性30 + 安全边际30 + PE陷阱25 + 历史分位15;新增"至少跑通 2 个独立估值模型,否则估值分封顶 70"铁律
- 一票否决分 A/B 两档:造假类 → ❌出局;破产/结构类 → 🔴封顶;要求显式写"原始分 → 否决结果",不得篡改分项
- Altman Z 双版本路由:按资产结构/行业自动选 原始 Z 或 Z''(非制造业,剔除 X5,阈值 2.60/1.10),修复轻资产股被系统性低估误杀(实测差 3.67)
- 反向 DCF 重写:基准 FCF 默认近 3 年均值(
--fcf-base latest/avg3/avg5/normalized);--wacc/--terminal-growth/--dcf-years可传参;输出 WACC 敏感性矩阵 + high_sensitivity 预警(实测单年 FCF 口径虚高隐含增速 11pct) - CAGR 按
fiscal_periods实际年跨度计算并暴露gaps(实测修正高估 6.75pct) - Piotroski 新增
data_coverage/applicable/missing_items:覆盖 < 7/9 禁止引用总分(消除 A 股"2/9 弱"误导) - 行业判别新增
confidence+ 公司名兜底:修复港股分支把公司名当行业传入、致汇丰/平安/港交所等金融股被跑 M/Z-Score 的误杀风险;新增--industry-type显式指定 - 杜邦/ROIC/ROE 改用平均余额主口径并输出期末口径对照
- A 股升级三大报表明细(
*_by_report_em):M-Score/Z-Score/反向 DCF 从全 NA 变为可用,能力对齐港股 - 新增
valuation_history字段组:PE/PB 真实历史序列与分位,补齐"历史估值分位"取数缺口;无源时按 85 分制归一,禁止凭印象填 - 港股兜底补全 PE/PB/EPS/ROE/毛利率映射(此前限流时仅有市值,报告只能用网页"区间数字")
- 市场覆盖扩至 KR/JP/TW/UK/SG/IN/DE;新增
--offline离线重算、指数退避重试 - 新增
scripts/self_check.py:交卷前自检从"靠自律"变为机器门禁 - 新增前置 6「模型可用性护栏」;输出路径去
./account/硬编码,改./.svadata/ - v2.1(2026-06-28) — 新增 SOTP 分部加总估值(多元化集团/控股/投资型公司专用),含防重复计算铁律、控股折价、分部明细表模板
- v2.0(2026-06-22) — 双层判断架构:量化硬模型 + 定性框架
- 新增量化层:反向 DCF、情景概率加权估值、EPV、分行业估值路由、杜邦分解、ROIC vs WACC、Piotroski F-Score、Beneish M-Score、Altman Z-Score、盈余质量、时间序列趋势
- 新增
scripts/value_models.py;fetch_stock_data.py输出新增time_series/models字段组 - 新增 4 份参考手册;五大模块升级为双层评分;一票否决新增 M/Z-Score(须
applicable=True) - 校验细则下沉到 references,主文件回归方法论主体;移除个人持仓联动,成为通用可公开发布框架
- v1.6(2026-05-05) — API 优先取数双引擎(yfinance + AkShare);新增 Tier 0 信源;一键取数脚本
- v1.5(2026-05-05) — 信源等级强制标注体系(六级)+ 算术强制回验;K 章节完整信源索引;反向 7 问
- v1.4(2026-04-28) — 交卷前自检(数据复验 + 结论反验证 + 反事实压力测试)
- v1.3(2026-04-28) — 价格类数据 3 源硬线 + 数据类型混淆防护 + 跨市场分别取数
- v1.2(2026-04-27) — 近 30 天重大事件扫描强制前置
- v1.1(2026-04-26) — 多信源数据校验强制前置
- v1.0 — 初始版本,建立三好原则评估框架