2026-09-09 10:27:42 +08:00
# 个股深度评析方案( 2026-09-09, 已批准)
> 这是一份独立方案。批准后落盘为两个仓库的 docs/个股深度评析方案_2026-09-09.md, 与《下一阶段工作方案_2026-09-07》《量价研判链吸收方案_2026-09-08》并列。
> 09-09 三条拍板已吸收进正文:**先只出人看的报告**,不接进候选卡与判决;**覆盖候选加持仓加池,本地模型为主**; **大师视角不限于用户提的三位,罗列得更宽**。
> "采购清单"这类字眼不再用;材料缺口一律叫"材料需求单"。
---
## 零、一句话
公司深度研报市场上只有一千多只票有、我们手里只有五十来份带公司锚的;买方研报一份都没有。这份方案让系统自己写:**十年财务报表数据由代码算成指标,十几位投资大师的分析视角各自给出判据与结论,最后合成一份买方式的论点**。每家公司一份 Markdown 报告,只给人看,先看质量,再决定接不接进候选卡。
---
## 一、这一轮买什么
三样东西,都是现在没有的。
1. **公司基本面这一维。** 四层系统里没有任何一处把财务报表当输入: 候选卡只有价格、吸筹、券商预期、论断; 数据基座的年报只抽关系不抽数字; 择时决策系统只有券商预期一块。153 库里六张财务表(十年三张表的重构指标、成长、质量、财务指标、主营构成、分红)代码里从来没读过。
2. **深度研报与买方研报的替代品。** 券商深度覆盖不到候选,买方研报本来就拿不到。大师视角是几十年验证过的分析框架,把它们编成代码判据加模型叙述,覆盖面就不再受券商产量限制。
3. ** "我无法判断"的清单。** 每个视角算不出的项、材料没到的项,都写成清单并开成材料需求单,这与设计目标里"系统能识别我无法判断"是一件事。
**定调上的一处变化要记台账。** 产业热点图谱设计里定过"不补深度、不算估值、定量估值交给一致预期"。这一轮明确改成:**基座可以按大师的方法算估值判据,但结论标为"该视角的结论",不是系统判决**;一致预期仍是"市场预期"这一侧的唯一来源,用来算预期差。
---
## 二、原则
- **代码算数,模型写字。** 所有指标、判据、打分由代码从表里算,模型只在拿到算好的数字与编号材料后写叙述与合议,提示词里禁止自造数字。
- **本地模型为主。** 叙述用基座路由里的本地档位( 188 的大模型档位为主,本地判定档位备用),只有最后的"买方论点合议"允许走云端,且默认关。
- **加,不改。** 新包、新表、新任务、新框架定义并行放旁边;候选卡、判决、逻辑状态、评析表、抽取提示词一个字节不动。
- **只出人看的报告。** 报告落文件与索引表,不进候选卡、不进 PMS、不进复盘分组。什么时候接, 看过十份报告再拍板。
- **每个视角都要能说"算不了"。** 缺表、缺期数、缺材料时,判据项写"缺",不用替代值冒充。
---
## 三、投资大师视角总表(不止用户提的三位)
每个视角是一个"技能":固定的判据清单、固定的数据槽位、固定的三个追问、可选的叙述段。分四类。
### 3.1 财务质量与安全(全部可代码化,第一批)
| 视角 | 核心判据 | 数据槽位 | 可算程度 |
|---|---|---|---|
| **薛云奎四维分析法** | 经营(收入增长与结构、毛利率、周转)、管理(费用控制、应收与存货相对收入的增速、资产质量:商誉与减值)、财务(杠杆、现金流结构、利息覆盖)、业绩(回报率、利润含金量=经营现金流对净利润、应计比率、分红);四维各一档评价并指出收入与利润的含金量 | 六张表全用;主营构成表给结构 | 全可算 |
| **彭曼重构报表分析** | 净经营资产回报率的分解(利润率×周转率)、财务杠杆效应(利差×杠杆)、经营与融资活动分离、剩余收益 | fin_reformulated 本身就是这套口径( NOA、RNOA、PM、ATO、FLEV、SPREAD、NBC) | 全可算 |
| **杜邦分解** | 净资产收益率=净利率×周转×权益乘数,十年拆解看回报靠什么 | gp_fina_indicator、fin_reformulated | 全可算 |
| **皮奥特罗斯基 F 分数** | 九项二值判据:盈利四项、杠杆流动性三项、效率两项 | gp_fina_indicator、fin_reformulated | 九项全可算 |
| **盈余质量三分** | 斯隆应计(应计比率)、贝尼什 M( 可算子项) 、奥特曼 Z( 缺原表时的近似式) | fin_quality、fin_reformulated; 缺三张原表的子项写"缺" | 部分可算,缺项标注 |
### 3.2 价值与安全边际(数字为主,第一批)
| 视角 | 核心判据 | 数据槽位 | 可算程度 |
|---|---|---|---|
| **格雷厄姆** | 防御型七条:规模、流动比率、长期债务、十年盈利稳定、二十年分红、十年每股收益增长、市盈率与市净率乘积;安全边际 | 财务指标表、分红表( 1999 起)、行情表 | 六条可算,长期债务一条用杠杆近似 |
| **巴菲特与芒格** | 护城河四类(无形资产、转换成本、网络效应、成本优势,用回报率持续性与毛利率稳定性做量化旁证)、十年高回报且低杠杆、自由现金流转化、资本配置(分红、回购、并购的钱去了哪)、管理层诚信(年报文本,第二批) | 六张表、基座事件层(回购、增减持)、年报管理层讨论 | 数字部分可算,文本部分第二批 |
| **格林布拉特神奇公式** | 资本回报率与盈利收益率两项排名 | roic、经营利润、企业价值( 市值加净金融负债) | 可算 |
| **特里·史密斯(好公司三问)** | 高资本回报、高毛利、现金转化好、低杠杆、能把利润再投出去 | fin_reformulated、fin_quality | 可算 |
| **冯柳的弱者体系** | 逆向(价格位置低、覆盖少)、赔率(安全边际三情景,复用选股系统现成口径)、可证伪的负面(质量红旗) | 行情、研报明细表、fin_quality 红旗、sources.scenarios | 可算 |
### 3.3 成长与商业模式(数字加文本,第二批)
| 视角 | 核心判据 | 数据槽位 | 可算程度 |
|---|---|---|---|
| **彼得·林奇** | 六类公司归类(缓慢、稳健、快速、周期、困境反转、隐蔽资产)、市盈率相对增长率、存货与应收对收入增速、冷门度 | 成长表、质量表、研报覆盖度 | 归类与 PEG 可算 |
| **费雪十五问** | 增长空间、研发、销售组织、利润率趋势、劳资关系、管理层深度与诚信、会计成本控制、行业特有优势、长期视角、股权稀释、坦诚、正直 | 年报管理层讨论与核心竞争力、研报论断;数字只有利润率与稀释 | 以文本为主 |
| **段永平** | 商业模式(主营结构稳定性、毛利率、现金流)、企业文化(年报文本)、合理价格(自由现金流收益率) | 主营构成、重构表、年报文本 | 一半可算 |
| **波特五力** | 供应商与客户集中度(图谱供应关系带占比)、竞争者数量(环节成员数)、替代与新进入者(研报论断) | 基座图谱 company_facts、环节投影、论断 | 集中度可算,其余文本 |
### 3.4 预期与估值(对着市场看,第二三批)
| 视角 | 核心判据 | 数据槽位 | 可算程度 |
|---|---|---|---|
| **莫布森预期投资** | 现价隐含的增长与回报预期,与历史回报率和一致预期对照,得"预期差" | 一致预期、现价、重构表回报率 | 近似可算 |
| **达摩达兰叙事估值** | 故事到数字:三情景现金流估值,每个假设指向一条材料 | 自由现金流、成长表、一致预期 | 可算但是近似 |
| **邱国鹭三要素** | 品质(行业格局、竞争优势的持续性)、估值(对历史与同环节)、时机(不在本报告,归择时决策系统) | 环节投影、回报率持续性、估值分位 | 品质与估值可算 |
| **霍华德·马克斯** | 周期位置与风险:行业景气(环节评析)、估值分位、杠杆 | 环节评析、估值分位、重构表 | 第三批 |
### 3.5 买方论点合议(第三批,把上面合成一份)
买方研报的骨架不是数据,是结构:论点、预期差、反方论点(芒格的"反过来想")、关键假设与下一期财报要验证什么、失效条件、"我无法判断"清单。合议段按论点卡七字段输出(论点、证据、催化剂与时间窗、预期、失效条件、置信度、版本),将来接进候选卡时不用再改形状。
---
## 四、报告长什么样
每家公司一份 Markdown, 按最新财报期命名, 六段。
1. **头部。** 公司、所在环节、数据期数(十年几期)、材料清单(年报几份、研报几篇、论断几条)、生成时间、模型档位、视角版本。
2. **十年画像。** 代码算的表:收入、利润、经营现金流、自由现金流十年;回报率分解;现金含金量;应计;红旗;分红与回购。
3. **逐视角判据表。** 每个视角一节:判据表(项、读数、阈值、判定)、一句结论、三个追问;有叙述段的视角加一段两百字以内的本地模型叙述,每句话对应表里的数字或材料编号。
4. **市场预期一侧。** 一致预期、隐含市盈率、安全边际三情景(复用选股系统现成口径)、预期差。
5. **买方论点合议** (第三批之前这一段只放代码汇总,不调模型)。
6. **无法判断清单与材料需求单。** 每个视角算不了的项、缺的材料,自动开需求单。
---
## 五、落在哪一层、怎么跑
**落数据基座。** 理由三条:模型路由的本地档位在这里;年报正文、研报论断、图谱关系、事件层、材料需求单机制都在这里;框架驱动机制(槽位 YAML 加装配器加空槽开单)就是为这类分析准备的,只差"结论槽位"的执行器。选股系统与 PMS 这一轮不动。
**目标集合。** 候选单(当天主榜与观察档)加 PMS 持仓加股票池,约一两百家。选股系统在早上构建链里加一步,把三路名单写进一张目标表;基座任务读表选目标。持仓与池的接入不在第一批,先用基座自己的池加候选单。
**节奏与费用。** 指标每天算不花钱。叙述只在三种时候调模型:第一次生成、新财报期到了、材料集合变了(指纹)。每晚上限二十家,按候选单名次优先,一两百家十天铺完,之后每晚只补增量。每家每晚模型调用不超过八次,输出总额有上限,截断不重试。
**时间。** 每晚 23:30 起跑,避开 06:10 到 07:10 的盘前链与 21:30 的行业催化。
**落地位置。** 报告文件进对象存储 stockinfo 桶的 reports/company_review/{代码}/{财报期}.md, 同时一张索引表记每次运行( 代码、财报期、视角版本、指纹、材料数、模型、用量、报告路径) , 接口按代码取最新报告。
---
## 六、分批与判收
**第一批(纯代码加两三个视角加报告骨架)。** 数据层六张表十年取数与对齐; 十年画像; 薛云奎四维、彭曼分解、杜邦、F 分数、盈余质量三分、格雷厄姆、巴菲特数字部分、神奇公式、特里·史密斯、弱者体系;报告一到四段与第六段;索引表与接口;每晚任务。叙述段只给薛云奎与巴菲特两个视角。
怎么验: 合成十年数据的离线单测覆盖每个指标公式与判据边界; 端到端试跑只用当天候选单里的公司( 09-09 拍板:不用茅台这类基准股),抽收入、净利润、经营现金流三个数与年报原文核对(基座里没有这家年报就对巨潮公开年报);十份报告人读,记"读了有没有用"。
**第二批(要年报文本的定性视角)。** 年报管理层讨论、核心竞争力、风险因素三类章节进定向喂入(分段器加一个类别);费雪、段永平、林奇归类、波特五力、巴菲特文本部分;叙述段扩到全部视角。
怎么验:定性判据每条都能指回年报段落编号;十份报告对照券商深度报告的观点,记分歧。
**第三批(预期与合议)。** 莫布森预期差、达摩达兰三情景、邱国鹭、马克斯;买方论点合议段(本地模型,云端可选开关默认关);合议输出论点卡七字段。
怎么验:合议段的每条论点都引用视角编号;反方论点与"无法判断"清单非空的比例;与一致预期的预期差分布。
**判收。** 三条都成立才算完成:一,目标集合里的公司都有报告且报告日不落后最新财报期一个月;二,十份人读报告里至少七份被认为"比现有材料多说了东西";三,每份报告的"无法判断"清单都对应了需求单。要不要接进候选卡,判收后另开拍板。
---
## 七、明确不做
不进判决、不进逻辑状态、不进 PMS、不进复盘分组。不做回测、不做因子。不用云端模型跑逐视角叙述。不做港股美股公司( 数据表只有 A 股)。不替代券商深度研报的采集,两条路并行。
---
## 八、风险
一,三张原始报表可能不在库里:奥特曼 Z、贝尼什 M 只能算子项,报告里标"缺",不用近似冒充。二,本地模型叙述质量:先看十份,不行就换档位或缩短叙述。三,财务口径:累计与单季、重述、单位,数据层统一处理并在报告头部注明。四,报告太长没人读:每视角一页以内,总长度有上限。五,与"基座不算估值"原则的冲突:本方案第一节已明写改法,批准即记台账。
---
## 附录甲 · 实现骨架(可不读)
**新建位置与文件(数据基座仓库,全部新增)。**
- `backend/app/analysis/company_review/` 包:
- `data.py` 数据层: 六张财务表加每日基础指标表( gp_day_basic: symbol 前缀式、timestamp、close、pe_ttm、pb、total_mv、total_share、dv_ttm) 的取数与归一。每表单独一条 SELECT( 153 代理禁联查),用 market_snapshot 的 `_proxy_conn` 、`_num`、`_td`、`_code_variants`。代码统一成点后缀式;报告期统一成 `period` ( YYYY-MM-DD 的期末日);`notice_date`/`ann_date` 保留作"当时可知"的时点键; 年度与单季两套口径分开存, TTM 由四个单季相加;缺期用空值不插补;重述以最新一版为准并记 `data_source` /`validation_status`。
- `metrics.py` 指标层: 纯函数, 输入十年数据框, 输出指标表。杜邦、彭曼分解、现金含金量、应计、F 分数九项、Z 与 M 的可算子项、格雷厄姆七条、神奇公式两项、特里·史密斯五项、林奇归类与 PEG、集中度( 图谱供应关系占比) 、预期差( 一致预期对回报率) 。每项带 `available` 与 `missing_reason` 。
- `lenses/` 视角层:每个视角一个模块(`xue_siwei.py`、`penman.py`、`dupont.py`、`piotroski.py`、`earnings_quality.py`、`graham.py`、`buffett.py`、`greenblatt.py`、`terry_smith.py`、`fengliu.py`;第二批 `lynch.py` 、`fisher.py`、`duan.py`、`porter.py`;第三批 `mauboussin.py` 、`damodaran.py`、`qiu.py`、`marks.py`)。统一接口 `evaluate(metrics, materials) -> {criteria: [...], verdict, questions: [3], narrative_inputs}` ,视角版本号写在模块常量里。
- `materials.py` 材料层:年报章节(对象存储正文经 sectionizer 定向,第二批加 `financial_statements` 与 `risk_factors` 两个类别到 PROFILES 的新副本,不改原表)、研报论断(`claim_store.drives_claims_with_docs()` 按受益方过滤)、事件(`event_claims_for`)、图谱关系(`graph_store.company_facts`)、一致预期(`consensus_daily` 与 `gp_report_rc` )。全部编号化(沿用 `_refs_to_claim_ids` 的编号表写法)。
- `narrative.py` 叙述层: 本地档位调用。提示词纪律: 只按给定判据表与编号材料写、不得出现表里没有的数字、JSON 输出、截断不重试(复用 review_segment 那份 `_brain_json` 的三条纪律,提成公共函数放本包内)。每视角一次调用,每家公司最多八次,单家输出总额上限 4 万 token。
- `synthesis.py` 合议层(第三批):买方论点七字段,本地档位;云端档位由开关 `COMPANY_REVIEW_SYNTHESIS_CLOUD` 控制,默认关。
- `report.py` 报告层:渲染六段 Markdown; 每视角一页以内; 表格用等宽数字。
- `store.py` 存储层: Postgres 表 `company_review_runs` ( ts_code、period、lens_version、fingerprint、n_materials、model、tokens、report_key、ran_at) 与 `company_review_metrics` ( ts_code、period、metric、value、available、reason) , 报告文件写对象存储 `reports/company_review/{ts_code}/{period}.md` 。
- `config/frameworks/company_review/*.yaml` :每个视角一份槽位声明(数据槽位、材料槽位、空槽开的需求单类型),沿用 `framer.py` 的 schema, 新建一个 `company_review_framer.py` 装配器读它们,不改 `framer.py` 。
- `backend/workers/tasks.py` 加两个任务:`akg.company_review(ts_code)`(单家:取数、算指标、跑视角、可选叙述、渲染、落库)与 `akg.company_review_batch(max_n=20)` (目标集合、优先级、指纹跳过、投递);路由到 review 队列; beat 23:30 周一到周六;`/admin/company_review_batch` 触发入口与 `GET /company/{ts_code}/review` 取最新报告;日检 3b 段加一行"个股深度评析:近 30 天 N 份、落后最新财报期的 M 家"。
- `backend/scripts/company_review_run.py` 手工入口:`--code 600519.SH --no-narrative` 可离线只算指标。
**目标集合(第一批)。** 基座池内公司加选股系统当天候选单(读 155 的实时计划接口 `GET /plan?top=80&obs_top=20` ,失败就只用池)。第二批由选股系统在早上构建链加一步写目标表 `t_akg_review_targets` ( plan_date、ts_code、source、rank) , 基座改读表。
**指纹与跳过。** 指纹 = 最新财报期 + 材料编号集合 + 各视角版本号的哈希。指纹相同跳过;只换财报期而材料不变,只重算指标与代码段、不重跑叙述。
**测试。** `backend/tests/test_company_review_metrics.py` : 合成十年数据, 逐项验公式与阈值边界( F 分数九项各造正反例、格雷厄姆七条、杜邦恒等式、TTM 相加、缺期不插补)。`test_company_review_report.py`:渲染不崩、缺项显示"缺"。端到端:一家真实公司 `--no-narrative` 先跑,抽收入、净利润、经营现金流三个数与年报原文核对;再开叙述跑一次,读报告。
**验证命令( 178, 容器内) 。**
```bash
docker compose exec -T -e PYTHONPATH=/app backend python /app/scripts/company_review_run.py --code < 当天候选单里一只票的代码 , 点后缀式 > --no-narrative
```
预期:打印十年画像表与各视角判据表,报告路径一行;索引表多一行。候选代码从 155 的实时计划接口取当天主榜第一只。
## 附录乙 · 数据可得性核对(可不读)
- 153 库六张表 09-09 只读核过: gp_fina_indicator 2018-03 起 15.9 万行 5,204 只; fin_reformulated 2015-09 起 19.5 万行 5,190 只(多数票 44 期) ; fin_growth 2015-09 起 3,853 只; fin_quality 2015-09 起 4,799 只; gp_fina_mainbz 2014 起 240 万行; gp_dividend 1999 起 6,154 只。
- 代码列格式( 09-09 探针改正):六张财务表与研报明细表都用点后缀式 600000.SH, 只有每日基础指标表 gp_day_basic 与行情表用前缀式 SH600000; 日期列格式两种: gp_ 表 YYYYMMDD 整数、fin_ 表日期。数据层统一。
- 153 走 ShardingSphere 代理:单表查询、禁多表联查、禁跨节点合并;每表单独取,内存里按财报期对齐。
- 估值输入: gp_day_basic( symbol 前缀式、timestamp 日期, close、pe、pe_ttm、pb、ps、dv_ttm、total_share、total_mv、circ_mv; 2014-11 起 1,116 万行 5,677 只,每日)。历史市盈率分位、市净率、企业价值都从它算,不用月分表的因子表。
- 一致预期: gp_report_rc( 2006 起)与基座派生 consensus_daily; 选股系统 sources.scenarios 的三情景口径直接复用。
- 年报:基座 documents 表 140 份,正文在对象存储;分段器现有七类章节不含财务报告与风险因素,第二批加。
- 研报论断: claims 表 DRIVES 谓词带方向与机制;公司事实关系 SUPPLIES_TO 带占比,可算客户与供应商集中度。
## 附录丙 · 架构设计补充要点( 09-09 设计评审吸收,可不读)
- 框架加载器只扫顶层 YAML, 子目录不会污染现有框架清单, 但也不能靠它装配; 本应用自带一个同形的槽位加载器。
- 容器只挂载 backend/app、backend/workers、backend/scripts( 只读) 与 config( 只读) , 本地 data 目录没有挂进任何容器,报告只能落对象存储;外部代码清单放 config/company_review/targets.txt 三个工作容器都读得到。
- 年报正文经解析缓存取( parsed/{解析器版本}/{对象键}.txt) , 不再解析 PDF。
- 本地档位取法: registry.client("worker_large") 是池化客户端,盘后首选 188、满了落本地判定档; 云端只在合议一步、且开关打开时用。
- 叙述按组调用而不是一视角一调:财务体检、价值判据、质量与风险、定性视角(年报文本)、预期与叙事、合议,共六组,每家不超过十次调用、输出总额上限六万。
- 数字回查是代码强制:叙述里的数字逐个匹配允许集合(指标值的各种形态),未命中的段落标"含未核数字",全家未核比例超三成记为半成品。
- 估值边界的拍板措辞:基座做"描述性估值"(复述市场已给的价格、倍数、一致预期,并与公司历史和可持续增速作差),不做"规范性估值"(不产出内在价值、目标价、买卖建议、自设折现率或终值假设);带价格的判据只输出通过与否;达摩达兰视角只做"叙事对应必须成立的数字"对照表。
- 累计与单季口径、单位由探针一次定死写成常量并用单测钉住,换数据源先让测试红。
- 定时改为 00:45( 择时决策系统 22:30 起的夜扫占用 188 的模型到零点后),截止 05:30 不再开新家。
- 目标集合第一版只认基座池加外部清单文件,候选单与持仓的接入后续再加。
## 附录丁 · 09-09 探针读数(可不读)
- fin_reformulated: report_type 取值 Q1、Q2、Q3、YEAR; validation_status 取值 PASS 6.5 万、FLAG 9.7 万、FAIL 3.3 万; data_source 单一来源 eastmoney_v2。
- gp_fina_indicator: 比率是百分数( 茅台 2025 年报 roe 34.46、grossprofit_margin 91.18) ; q_roe 是单季; fcff 是元; eps、bps 是元。
- gp_fina_mainbz: bz_sales、bz_profit 是元; bz_type 有 D( 地区) 与 P( 产品) ; 同一期存在同值别名行( "中国大陆"与"国内"),要按 bz_type 去重。
- gp_dividend: cash_div 是每股元, div_proc 有预案、股东大会通过、实施三个阶段,以实施为准。
- gp_day_basic: total_mv 单位万元(茅台 1.636e8 万元 ≈ 1.64 万亿元)。
- 09-09 落地后追加:主营构成表每类分类有一行名字就是"产品""地区""行业"的表头,金额即营业收入合计(宁德时代 2025 年 4,237 亿);重构报表 fin_reformulated 的经营现金流只有真实值的四成上下,现金流改取财务指标表口径;财务指标表比率是百分数、唯独经营现金流对收入是小数;成长表与质量表与原始金额对不上,只作参考。
- 第一批上线读数见台账 052。
2026-09-09 10:32:40 +08:00
- 目标集合落法( 09-09 落地改法) : 178 容器打不到 155 接口,选股系统出计划时把主榜前一百加观察档前二十写进 153 库 t_akg_review_targets, 基座读表; 基座产业池默认不进目标。