七看财报分析(纯表格版)
把"好公司就要有好数据"的分析方法固化为可复用管线。所有原始数字必须取自巨潮资讯网公告原文 PDF(合并报表口径),严禁用行情接口/雪球/Eastmoney 数字替代核心科目。本版不生成任何图表(无 SVG),只产出"丰富叙述 + 12 张规定表"的长春高新式财报看板,离线可用。⚠️ token 优化:只输出单文件 HTML(可离线打开),不生成 .md——同一份叙述直接写进 HTML,省 token。
何时使用
- 用户给一个 A 股代码/名称,要求"七看/深度财报分析/财报体检/排雷",强调数据精确、只要表格(明确不要图表/可视化)、只输出 HTML(不输出 MD)。
- 需要横向对标(同行业 2-4 家)+ 一个"看起来好、数据差"的对照案例。
- 触发词:七看财报、财报深度分析、年报原文分析、做一份XX的财报报告、只要表格不要图。
环境准备
- Python venv(
~/.workbuddy/binaries/python/envs/default,用python.exe -m venv创建;若缺失先建)。 - 装包(进 venv):
pymupdf(读 PDF 文本/表格)、requests(下载)。 - 工作目录约定:每次分析新建
./<代码或简称>/,其下pdf/ out/ peer/子目录,脚本与中间 JSON 放根。
七看框架(固定 7 个章节,章节顺序与命名不要改)
- 一看盈收:规模(营收/归母/扣非/CFO)、能力(毛利率/净利率/营业利润率)、质量(净现比=CFO÷归母)。
- 二看费用成本:销售费率、管理费率、研发费率、财务费率、期间费率;毛销差(毛利率-销售费率)。
- 三看增长率:全周期 CAGR、近 3 年 CAGR、近 1 年 YoY;营收与净利增速背离(增收不增利)。
- 四看业务构成:分产品/分地区/分应用/分尺寸收入占比 + 销量与 ASP(如有晶圆/销量类指标)+ 产能利用率。
- 五看资产负债:资产/负债/权益规模、资产负债率、净现金/净负债、营运资金、存货/应收/应付占收入比。
- 六看投入产出:营运资金 WC 必须拆出构成明细(应收票据及应收账款+应收款项融资 / 预付款项 / 存货 / 合同资产 → 小计·资金占用;应付票据及应付账款 / 预收款项 / 合同负债 → 小计·占用上下游资金)、一元收入所需营运资金(WC/收入)、固定资产占收入比、一元收入垫资换回多少归母、自由现金流(FCF=CFO-资本开支)、人均(营收/净利/薪酬)。
- 七看收益率:加权 ROE(年报披露值,不要误取扣非行)、杜邦三因子拆解(净利率×资产周转×权益乘数)、ROIC、ROA、分红率。
标准交付物(12 张表 + 长春高新式叙述,顺序固定)
报告正文结构(参照长春高新七看财报分析):
- 封面:# 公司名(代码)2020—2025 年财报「七看」深度拆解 + meta 行(框架/数据区间/行情时点/巨潮口径)+ lead 一句话结论(<p class="lead">)。
- 开篇:非财务信息(4 小节):1.公司定位与行业地位 2.四维竞争优势 3.赛道环境 4.设问。
- 对照案例:1 家"行业地位顶级但财务回报差(甚至亏损)"的反面样本(如蓝帆医疗之于惠泰、智飞生物之于长春高新),配 表10。
- 七看各节:每节用 长春高新式"分步"叙述(如 一看分 第一步规模/第二步能力/第三步质量),嵌入对应表,用 看数值/看差异/看结论 与 判断标准 callout,并标注 事实(年报) 与 推断(行情/一致预期)。
- 结尾:<div class="box"> 结论 5 句话 + 需要持续跟踪的 3-5 个风险点。
12 张表(注册进 TABLES,key t1..t10,t4 拆 t4a/t4b/t4c):
- 表1 盈收规模与盈利质量(含 6年合计/近3年合计)
- 表2 费用成本结构
- 表3 增长率(CAGR/YoY,含未来3年一致预期列)
- 表4 业务构成(t4a 分产品、t4b 分地区、t4c 占比趋势)
- 表5 竞品对标(同行业·盈利)
- 表6 资产负债与偿债
- 表7 投入产出(两段式,必须含营运资金构成明细:一、营运资金构成 → 应收票据及应收账款+应收款项融资 / 预付款项 / 存货 / 合同资产 / 小计·资金占用 / 应付票据及应付账款 / 预收款项 / 合同负债 / 小计·占用上下游资金;二、核心指标 → 营运资金 WC / 一元收入所需营运资金 / 一元收入对应的归母净利润 / 一元收入所需固定资产 / 固定资产净额 / 员工人数 / 人均营收·净利·薪酬。禁止只给"一元收入所需营运资金"结果列)
- 表8 人均指标横向对标(同行业·盈利)
- 表9 收益率杜邦拆解
- 表10 对照案例(1 家"看起来好数据差"的反面样本)
纯表格与叙述规范(本版相对图表版的核心变化)
- 零图表:不生成任何 SVG/图片,所有信息用表格 + 叙述承载。详细数字放表,观点与逻辑放叙述。
- CSS 版式:沿用长春高新四套配色(A 深靛蓝 / B 青蓝 / C 墨绿 / D 暖橙棕),见
assets/report_engine.py的CSS:斑马纹、分组表头(th.sub)、本公司行高亮(tr.me)、关键列高亮(td.key/th.key)、lead 引用块、box 结论块。 - 表格 helper:
R.render(cls, header, rows, src, anchor)处理分组表头(##前缀跨列)、本公司高亮(@@行→tr.me)、关键列高亮(##单元格→td.key);rows末两列固定放"6年合计/近3年合计"。R.yi/R.pct/R.wan/R.num0做亿元/百分比/万元/千分位格式化。 - 叙述深度(对齐长春高新,不要只堆表):每章给出"看数值→看差异→看结论",关键判断加 判断标准 黄字 callout;事实来自年报、推断来自行情/一致预期须显式标注;lead 一句话结论、box 五句话结尾。
- 正文长度:中文 3800-5200 字(含表内文字不计),结论先行。
⚠️ 竞品/人均对标选样铁律(硬约束,违反必须重做)
> 用户明确要求:人均对标必须选同行业公司,且是盈利(非亏损)的公司对比,不要选亏损企业。
- 表5 / 表8 样本必须同时满足:①同行业(业务实质相近,如血管/心脏电生理/内镜介入器械);②最新年度(2025)归母净利润为正。
- 亏损企业或跨行业企业一律只能进 表10 对照案例,禁止出现在表5/表8 人均对标表。
- 选样流程(写进
run_template.py的screen_peers):
1. 列同行业候选池(含可能亏损者);
2. 逐家取最新年报归母净利润;
3. 过滤:仅保留同行业 and 归母>0;
4. 被剔除者记录原因(跨行业/亏损),亏损者转到 表10;
5. 表注写明"样本均为同行业且盈利的公司,无亏损企业混入"。 - 校验清单第 7、8 条专门查此铁律,见下。
⚠️ 表7 营运资金必须拆明细(硬约束,违反必须重做)
> 用户明确要求:"一元收入需要的营运资金"不能只给结果,必须像「长春高新七看财报分析」那样把构成明细拆出来,并"严格按照要求输出"。只给一个 WC/营业收入 数字=偷懒=不合格。
- 表7 第一行必须是分组行
一、营运资金构成(亿元)(首列##前缀 + 其余列全空串),顺序固定:
1. 应收票据及应收账款+应收款项融资(=ar_note+ar+ar_fin 三项合成一行)
2. 预付款项
3. 存货
4. 合同资产(未列示时写未列示(0.00),不要留空、不要写 0)
5.小计:资金占用
6. 应付票据及应付账款(=ap_note+ap 合成一行)
7. 预收款项
8. 合同负债
9.小计:占用上下游资金 - 紧接着分组行
二、核心指标,顺序固定:营运资金 WC(亿元)→ 一元收入所需营运资金(WC/营业收入,2 位小数)→ 一元收入对应的归母净利润(3 位小数)→ 一元收入所需固定资产 → 固定资产净额 → 员工人数 → 人均营业收入/归母净利润/薪酬。 - 表7 不带"6年合计/近3年合计"列(存量科目求和无意义);表7 表注必须写出 WC 公式原文。
- 全表首列统一
##前缀(浅金底td.key),与其他表的风格一致。 - 叙述
6.1 一元收入需要多少营运资金必须引用明细:哪些科目在放大、聚合口径的 WC 与收入谁跑得快、单位占用是升是降,再与对照公司比。(只写"从 X 元升到 Y 元"不给构成,同样判不合格。)
第一步:定位并下载年报 PDF(巨潮 webapi 走不通,走 PDF 原文)
- 拿 orgId:
POST https://www.cninfo.com.cn/new/information/topSearch/query表单keyWord=<代码>&maxNum=10→ 取orgId。 - 列年报:
POST https://www.cninfo.com.cn/new/hisAnnouncement/query表单
tabName=fulltext&pageSize=30&pageNum=1&column=<szse|shse|空>&category=category_ndbg_szsh&stock=<代码>,<orgId>。
- 上交所column留空更稳;深交所用szse。stock必须是"代码,orgId",否则空。
- 过滤announcementTitle含"年年度报告"且不含"摘要"(上交所同年有"年报"与"年报摘要"两条,下错 PDF 只有 10+ 页)。
- 早年年报需多翻pageNum。 - 下载:
https://static.cninfo.com.cn/<adjunctUrl>(adjunctUrl 来自列表),UA + Referer 必需。 - 如需 2019 年这类"上市前一年":直接取次年年报的"比较期(上期/期初列)",不要另下。
- 参见assets/cninfo_download.py(已封装,含Accept: application/json头与重试)。
第二步:PyMuPDF 解析三大报表(必踩的坑,已验证修复)
合并表按"合并"标题切块,跳过母公司表。关键坑:
1. 单位不一致:检测每块就近 单位[::]\s*(人民币)?(千元|万元|元),倍数 1000/10000/1。解析原始数 × 倍数归一到元。科创板/工业富联类常用千元,漏掉差 1000 倍。
2. "负债合计"是"流动负债合计"子串:匹配 total_liab 必须排除含"流动/非流动"的行;total_equity 排除含"归属于母公司"的行。用 EXCLUDE 子串映射。
3. 现金流净额行被拆成两行(如"经营活动产生的现金流"+"量净额"):预处理把"以现金流结尾且下一行以量净额开头"的两行拼起来再解析。
4. 旧版科目名:2015 前后用"归属于母公司所有者的净利润"而非"…股东的净利润",加候选项。
5. 费用列报符号:个别年份(如中芯 2020)费用带负号,其余年份正数。计算前必须按报告年份统一符号(建 CONV_A={'2019','2020'} 之类集合,费用类科目取负)。
6. 附注噪声:合同资产可能误抓"企业会计准则第14号"里的"14";数字两列连排用非贪婪正则逐个切。
7. 上交所"主要会计数据"栏位小:find_tables 常失败 → 用前 12 页文本去换行后正则兜底。
8. 科创板年报三大报表是表格布局:必须用 find_tables 且用报表独有锚点(如 流动资产:/资产总计、一、营业总收入、经营活动现金流入小计)定位真表页,避免"会计政策变更"章节同名误命中;收行须"先收行再判尾页"防止合并报表尾行与母公司标题同页被吞。
- 主抽取用表格法 find_tables(assets/extract_statements.py),窄表/连排兜底用行式正则。产出 raw_<year>.json。
- 营运资金明细科目必备清单(表7 的明细全靠它们,缺一不可):ar_note 应收票据、ar 应收账款、ar_fin 应收款项融资、prepay 预付款项、inventory 存货、contract_asset 合同资产、ap_note 应付票据、ap 应付账款、advance 预收款项、contract_liab 合同负债。抽不全就别指望表7 能拆明细。
第三步:抽取补充数据(extras)
- 主要会计数据:扣非归母、加权 ROE(基本/扣非两行,取基本行)、总资产、归母净资产、研发费率。
- 员工数:必须取"在职员工的数量合计"总额行(母公司口径小 4 倍)。
- 业务分部:分行业/分产品收入成本毛利率、分地区占比。
- 销量类:晶圆销量、ASP、产能利用率(半导体/制造类);无则跳过对应子表。
- 子公司、股本、分红方案("拟不进行利润分配"=零分红)。
- ROE 易误取扣非行:用
ROE_REP字典手工填年报原文值最稳。
第四步:竞品与对照案例(严守选样铁律)
- 竞品:先做盈利筛选——同行业候选池逐家取最新年报归母净利润,剔除亏损者,再取同行业盈利的 2-4 家;下其最新年报,抽营收/净利/员工/人均。表注须写明"样本均为同行业盈利公司,无亏损企业混入"及口径。
- 对照案例:选 1 家"行业地位顶级但财务回报差(甚至亏损)"的样本(如蓝帆医疗、智飞生物),下其两年年报取锚点。亏损样本只能放这里,不能放人均对标表。
第五步:计算指标(build_metrics)
- CAGR(a,b,n)=((b/a)^(1/n)-1)*100;YoY。
- 毛利率=(营收-营业成本)/营收;净利率=归母/营收;毛销差=毛利率-销售费率。
- 营运资金 WC(表7 口径,必须用这个):WC =(应收票据及应收账款+应收款项融资+预付款项+存货+合同资产)−(应付票据及应付账款+预收款项+合同负债),即"资金占用 − 占用上下游资金"。一元收入所需营运资金 = WC/营业收入。
- ⚠️ 不要用"流动资产 − 流动负债" 冒充该指标:现金充沛的公司会把募集资金/理财算进流动资产,导致比值虚高失真(惠泰曾因此从正确的 0.19 被写成 0.64)。
- 明细科目必须逐项落库(
build_*.py里存成wcd子字典:ar_note/ar/ar_fin/prepay/inventory/contract_asset/ap_note/ap/advance/contract_liab + ar_grp/ap_grp/fund_use/fund_src/wc/wc_ratio),并断言fund_use − fund_src == wc。 - 净现金=货币资金类-有息债务;FCF=CFO−购建固定资产等资本开支(FCF 行放表1 盈收,不要放表7)。
- 杜邦:净利率×资产周转(营收/平均总资产)×权益乘数(平均总资产/平均归母净资产)。
- ROIC≈归母净利/平均投入资本(有息债务+所有者权益合计);ROA=净利/平均总资产。
- 人均:营收/员工、净利/员工、薪酬=支付给职工现金/员工。
- 单位统一:金额→亿元、人均→万元/人、比率→%。
- 输出
final_data.json:series(按年 dict)、sum6、sum3、cagr、forecast(如有一一致预期)。
第六步:生成 12 张表(report_engine.py,纯表格)
- 表格
render(cls, header, rows, src, anchor):处理分组表头(##前缀跨列)、本公司高亮(@@行→tr.me)、关键列高亮(##单元格→td.key)。流量表(表1/表2)末两列放"6年合计/近3年合计";存量表(表6/表7/表9)不放合计列。 - 表7 按上文「⚠️ 表7 营运资金必须拆明细」的两段式结构生成,数据取自
final_data.json的wcd子字典,不得临时心算。 - 用
R.yi/R.pct/R.wan/R.num0格式化;净现比显示为"倍"(不是 %)。 - 12 张表注册进
R.TABLESdict,key t1..t10(t4 拆 t4a/t4b/t4c)。注意:每张表都必须插入叙述 block(blocks.append(hX)),否则write_html兜底只补 HTML——未显式插入的表会出现在正文末尾,内容不缺但位置靠后。 - 本步不生成任何图表。
第七步:输出单文件 HTML(write_html,不生成 MD)
- HTML:
<style>{CSS}</style>内联 + 章节正文(h1/h2/h3 + 表格)+ lead/box 块。无 SVG。同一份叙述直接写进 HTML,不再单独导出 .md(省 token)。 - 文件:
out/index.html(预览用)+out/<公司名>七看财报分析.html(交付用)。 - 正文长度:中文 3800-5200 字;结论先行,每章给"事实(年报)"与"推断(行情/预期)"标注。
- ⚠️ 若报告需附带免责声明/脚注,请用
blocks.append('<p class="src">…</p>')直接写进 HTML(MD 版已废弃,勿再传md_extra)。
校验清单(务必做,否则不准)
- 核心科目(营收/净利/资产/负债/权益/CFO)不得出现 None,否则回头修解析器,禁止用估算值填补。
- 用已知锚点交叉验证(如惠泰 2025 营收 25.84 亿、京东方 2025 营收 2045.90 亿)与公开数据一致才算通过。
- 单位倍数正确(千元/万元/元)×;符号统一(费用负年已处理)。
- 未披露项明确标"未披露",不得留空或写 0。
- 正文 None 出现次数 = 0;未披露标注数记录;HTML
<svg计数 = 0(本版无图表)。 - HTML 表格数 = 12(t1–t10,t4 拆 t4a/t4b/t4c),用
grep -o '<table' out/*.html | wc -l确认无表漏出(本版只出 HTML,无 MD)。 - 人均对标/竞品表合规检查:表中每一家样本都必须"同行业 且 最新年度归母净利润为正";出现任一家跨行业或亏损公司即判不合格,回第四步重选。
- 人均薪酬口径统一(均用"支付给职工以及为职工支付的现金÷期末在职员工数量合计"),表注需写明。
- 表7 营运资金明细检查(硬约束):HTML 中必须能数出
一、营运资金构成(亿元)、小计:资金占用、小计:占用上下游资金、二、核心指标四个关键行,且逐列勾稽小计:资金占用 − 小计:占用上下游资金 = 营运资金 WC(允许 ±0.01 亿元四舍五入尾差);缺任一明细行、或只给"一元收入所需营运资金"结果列 → 判不合格,回第三步补抽科目重做。 - 叙述数字与表格数字必须一致:叙述里每个具体数值都要能回溯到
final_data.json,重点排查"亿元"与"元"的 10 倍/100 倍单位错位(历史高发:把x/1e7写成亿元、把 0.19 亿写成 1.94 亿)、以及"倍/个百分点"手算错误(倍数一律用表3的 mult() 结果,不要另算)。
assets 目录文件
cninfo_download.py:年报定位+下载(通用)。extract_statements.py:三大报表通用抽取(含上述坑的修复,科创板表格布局锚点定位)。report_engine.py:render()+ CSS(四配色) + 单文件 HTML 输出(write_html) + 格式化助手(yi/pct/wan/num0),纯表格、无图表、不生成 MD。run_template.py:把上面串成 7 步的示例编排(含占位 TODO 与screen_peers选样过滤,复制后按公司填数)。
适配要点速查(已踩过的坑,按交易所/板块)
- 科创板(688xxx):单位千元、A股上市晚(2020-07)→2019取比较期、2020年报费用负号列报、加权ROE易误取扣非行、三大报表是表格布局需锚点定位。
- 上交所(60xxxx):column 留空、排除"摘要"、单位检测全/半角"单位:"、科目名带序号前缀/附注列需跳过。
- 深交所(00/30xxxx):column=szse、目录页干扰用 must=('流动资产:','单位:') 定位真表页、连行正则补漏。
- 同仁堂等:"主要会计数据"单位可能是万元,需检测 ×1e4。