02 · 读懂财报:三张表¶
长期投资教程 · 第 2 章
免责声明:本教程为投资教育内容,所有分析与示例仅为方法演示,不构成任何投资建议。文中涉及的公司与数据仅用于教学举例,不代表推荐。市场有风险,决策需自负。
本章学什么 / 读完会什么¶
- 用大白话搞懂三张财务报表各自在回答什么问题:
- 利润表:这段时间赚了多少钱?(一段时间的「成绩单」)
- 资产负债表:此刻家底有多厚、欠了多少钱?(某一天的「全身照」)
- 现金流量表:真金白银到底进出了多少?(一段时间的「银行流水」)
- 用贵州茅台的真实财报把关键科目拉出来看;
- 用苹果的真实财报对照,理解跨市场报表逻辑一致;
- 死磕一个最重要的认知:「利润」不等于「现金」,利润是算出来的,现金是真收到的。
import sys, os
sys.path.insert(0, os.path.abspath('.'))
import warnings; warnings.filterwarnings('ignore')
import numpy as np, pandas as pd
import matplotlib.pyplot as plt
import invest_data as D
FONT = D.setup_matplotlib()
np.random.seed(D.SEED)
print('中文字体:', FONT, '| 数据目录:', D.DATA_DIR)
中文字体: Noto Sans CJK SC | 数据目录: /data/docs/investing/long-term-investing/data
2.1 三张表的关系:一个开公司的类比¶
想象你开了家奶茶店:
- 利润表(Income Statement):这个月卖了多少钱、扣掉奶茶原料/房租/工资后,净赚多少。回答「赚没赚钱」。
- 资产负债表(Balance Sheet):月底盘点,你有多少现金、设备、存货(资产),欠供应商和银行多少钱(负债),剩下真正属于你的(净资产/股东权益)。回答「家底和负债」。
- 现金流量表(Cash Flow Statement):这个月银行账户实际进出了多少钱。回答「钱真的到手了吗」。
核心恒等式:资产 = 负债 + 股东权益(你拥有的,要么是借来的,要么是自己的)。
三张表勾稽在一起:利润表的净利润,扣掉分红后转入资产负债表的股东权益;经营赚的现金体现在现金流量表。看公司就像给人体检——利润表是这次考试成绩,资产负债表是体格底子,现金流量表是血液循环。三者都健康,公司才真健康。
2.2 利润表:茅台是怎么赚钱的¶
利润表从「收入」一路往下减各种成本费用,最后得到「净利润」,像一个漏斗:
营业总收入
− 营业成本(造产品花的钱)
= 毛利润 → 毛利率 = 毛利润 / 收入
− 销售/管理/研发等费用
− 税
= 净利润 → 净利率 = 净利润 / 收入
我们拉茅台近几年的真实年报数据,看这个漏斗:
inc = D.load_a_report("600519", "income") # 利润表(单位:元)
# 取每年年报(12-31)
annual = inc[inc.index.month == 12].copy()
annual = annual[annual.index.year >= 2019]
cols = ["营业总收入", "营业总成本", "营业成本", "净利润"]
have = [c for c in cols if c in annual.columns]
view = annual[have] / 1e8 # 换算成「亿元」
view.index = view.index.year
view = view.round(1)
print("贵州茅台 利润表关键科目(单位:亿元) 数据来源:", D.source_tag(inc))
print(view.to_string())
贵州茅台 利润表关键科目(单位:亿元) 数据来源: (真实数据·本地缓存)
营业总收入 营业总成本 营业成本 净利润
报告日
2019 888.5 298.1 74.3 439.7
2020 979.9 313.1 81.5 495.2
2021 1094.6 347.8 89.8 557.2
2022 1275.5 397.5 100.9 653.8
2023 1505.6 469.6 118.7 775.2
2024 1741.4 545.2 137.9 893.3
2025 1720.5 573.7 148.9 853.1
# 用摘要表拿现成的毛利率/净利率(已是百分比),更准
ab = D.load_a_abstract("600519")
def yearly(metric):
s = ab.loc[metric].dropna()
s = s[s.index.month == 12]
return s[s.index.year >= 2019]
rev = yearly("营业总收入") / 1e8
profit = yearly("归母净利润") / 1e8
gm = yearly("毛利率")
nm = yearly("销售净利率") if "销售净利率" in ab.index else yearly("净利率")
fig, axes = plt.subplots(1, 2, figsize=(13, 5))
yrs = [d.year for d in rev.index]
axes[0].bar([y-0.2 for y in yrs], rev.values, width=0.4, label="营业总收入", color="#3498db")
axes[0].bar([y+0.2 for y in yrs], profit.values, width=0.4, label="归母净利润", color="#c0392b")
axes[0].set_title("茅台 营收 vs 净利润(亿元)"); axes[0].set_xlabel("年份"); axes[0].legend()
axes[1].plot([d.year for d in gm.index], gm.values, "o-", lw=2, label="毛利率", color="#16a085")
axes[1].plot([d.year for d in nm.index], nm.values, "s-", lw=2, label="净利率", color="#e67e22")
axes[1].set_title("茅台 毛利率 / 净利率(%)"); axes[1].set_xlabel("年份"); axes[1].set_ylabel("%"); axes[1].legend()
plt.tight_layout(); plt.show()
print(f"最新年报毛利率 {gm.iloc[-1]:.1f}%,净利率 {nm.iloc[-1]:.1f}%")
最新年报毛利率 91.2%,净利率 50.5%
这张图在说什么:
- 左图:茅台的营收和净利润逐年稳步抬升,且净利润(红)占营收(蓝)的比例很高——这是顶级生意的样子。
- 右图:毛利率常年 90% 上下,意味着每卖 100 块酒,造酒成本不到 10 块。这是茅台「印钞机」属性的数据证据——极强的定价权和品牌护城河。
- 看利润表,第一眼就看收入是否增长、毛利率/净利率是否高且稳定。毛利率长期下滑往往是竞争加剧、护城河被侵蚀的信号。
2.3 资产负债表:家底厚不厚、欠债多不多¶
资产负债表是某一天的「全身照」:左边是资产(你有什么),右边是负债 + 股东权益(钱从哪来)。最关心两件事:
- 资产负债率 = 总负债 / 总资产:欠债占家底的比例,越低越稳健(但行业差异大,银行/地产天然高)。
- 股东权益(净资产):真正属于股东的部分,长期增长说明公司在为股东积累价值。
看茅台的负债率和净资产:
nz = yearly("股东权益合计(净资产)") if "股东权益合计(净资产)" in ab.index else yearly("归母净利润")
debt_ratio = yearly("资产负债率")
fig, ax1 = plt.subplots(figsize=(11, 5))
yrs = [d.year for d in nz.index]
ax1.bar(yrs, nz.values/1e8, color="#3498db", alpha=0.7, label="净资产(亿元)")
ax1.set_xlabel("年份"); ax1.set_ylabel("净资产(亿元)", color="#3498db")
ax2 = ax1.twinx()
ax2.plot([d.year for d in debt_ratio.index], debt_ratio.values, "o-", color="#c0392b", lw=2, label="资产负债率")
ax2.set_ylabel("资产负债率(%)", color="#c0392b"); ax2.set_ylim(0, max(60, debt_ratio.max()*1.5))
ax1.set_title("茅台 净资产(柱)与资产负债率(线)")
plt.tight_layout(); plt.show()
print(f"最新净资产约 {nz.iloc[-1]/1e8:.0f} 亿元;资产负债率约 {debt_ratio.iloc[-1]:.1f}%")
最新净资产约 2540 亿元;资产负债率约 16.4%
这张图在说什么:茅台净资产(蓝柱)逐年增厚,说明公司持续为股东创造价值;资产负债率(红线)非常低——茅台几乎不靠借钱经营,账上躺着大量现金。低负债 + 高净资产增长 = 财务极其稳健。对长期投资者,这种公司「睡得着觉」。注意:负债率高低要和同行比,重资产或金融行业天生高,不能一刀切说高就是坏。
2.4 现金流量表:利润 ≠ 现金(最重要的一课)¶
大白话:利润表上的「净利润」是按权责发生制算出来的——你把货卖出去、开了发票,哪怕钱还没收到,也算收入和利润。但现金流量表只认真金白银的进出。
类比:你给朋友赊账卖了 100 块的货,利润表立刻记你赚了(假设成本 60)40 块利润;但你银行卡里一分钱没多。要是这朋友最后赖账,利润是「纸面富贵」,现金才是真的。
所以有个经典的「打假」指标:经营活动现金流净额 vs 净利润。
- 健康公司:经营现金流 ≈ 或 > 净利润(赚的是真钱)。
- 危险信号:常年净利润很高、但经营现金流很差(利润可能是赊账/存货堆出来的,含金量低)。
看茅台这两条线:
ocf = yearly("经营现金流量净额") / 1e8
ni = yearly("归母净利润") / 1e8
# 对齐年份
common = sorted(set(d.year for d in ocf.index) & set(d.year for d in ni.index))
ocf_v = [ocf[[d for d in ocf.index if d.year==y][0]] for y in common]
ni_v = [ni[[d for d in ni.index if d.year==y][0]] for y in common]
fig, ax = plt.subplots(figsize=(11, 5))
ax.bar([y-0.2 for y in common], ni_v, width=0.4, label="归母净利润", color="#c0392b")
ax.bar([y+0.2 for y in common], ocf_v, width=0.4, label="经营现金流净额", color="#16a085")
ax.set_title("茅台 净利润 vs 经营现金流(亿元)—— 赚的是不是真钱")
ax.set_xlabel("年份"); ax.set_ylabel("亿元"); ax.legend()
plt.tight_layout(); plt.show()
ratio = np.mean([o/n for o, n in zip(ocf_v, ni_v)])
print(f"经营现金流 / 净利润 多年平均 ≈ {ratio:.2f}(接近 1 → 账面利润绝大部分变成了真金白银,含金量高)")
经营现金流 / 净利润 多年平均 ≈ 0.96(接近 1 → 账面利润绝大部分变成了真金白银,含金量高)
这张图在说什么:茅台两根柱子高度相当(经营现金流/净利润多年平均约 0.96),说明它赚到的账面利润几乎都实打实变成了现金——这正是「赚真钱」的样子。个别年份经营现金流会因为银行承兑汇票、客户存款变动等口径因素略低于净利润,但长期看两者高度吻合。反过来,如果一家公司净利润年年涨、经营现金流却长期为负或远低于利润,就要高度警惕利润的水分。
2.5 跨市场对照:苹果的三表逻辑一样¶
财报语言全球相通。我们拉苹果的真实三表,看同样的逻辑(收入-利润、现金流 vs 利润)在美股是否成立。
inc_us = D.load_us_stmt("AAPL", "income")
cf_us = D.load_us_stmt("AAPL", "cashflow")
if inc_us is None or cf_us is None:
print("⚠️ 苹果财报实时/缓存均未取到,本节跳过真实数据展示。")
print(" (A股部分已用真实数据完整演示,方法完全一致。)")
else:
def pick(df, keys):
for k in keys:
for idx in df.index:
if k.lower() in str(idx).lower():
return df.loc[idx]
return None
rev = pick(inc_us, ["Total Revenue"])
ni = pick(inc_us, ["Net Income"])
ocf = pick(cf_us, ["Operating Cash Flow", "Cash Flow From Continuing Operating", "Total Cash From Operating"])
print("苹果 数据来源:", D.source_tag(inc_us))
tbl = pd.DataFrame({
"营收(十亿$)": (rev/1e9).round(1) if rev is not None else None,
"净利润(十亿$)": (ni/1e9).round(1) if ni is not None else None,
"经营现金流(十亿$)": (ocf/1e9).round(1) if ocf is not None else None,
})
tbl.index = [d.year for d in tbl.index]
tbl = tbl.dropna(how="all").sort_index() # yfinance 最早一年常为空,丢掉
print(tbl.to_string())
fig, ax = plt.subplots(figsize=(10, 5))
yrs = tbl.index.tolist()
ax.bar([y-0.2 for y in yrs], tbl["净利润(十亿$)"].values, width=0.4, label="净利润", color="#c0392b")
ax.bar([y+0.2 for y in yrs], tbl["经营现金流(十亿$)"].values, width=0.4, label="经营现金流", color="#16a085")
ax.set_title("苹果 净利润 vs 经营现金流(十亿美元)")
ax.set_xlabel("财年"); ax.set_ylabel("十亿美元"); ax.legend()
plt.tight_layout(); plt.show()
苹果 数据来源: (真实数据·本地缓存)
营收(十亿$) 净利润(十亿$) 经营现金流(十亿$)
2022 394.3 99.8 122.2
2023 383.3 97.0 110.5
2024 391.0 93.7 118.3
2025 416.2 112.0 111.5
这张图在说什么(若取到数据):苹果的经营现金流同样常年高于净利润——因为有大额折旧摊销加回、且对供应链有强势账期。这再次印证:优秀公司的共同点之一就是现金创造能力强。无论 A 股还是美股,三张表的分析逻辑完全一致,你学会一次,全球通用。
本章小结¶
- 利润表看赚不赚钱(收入、毛利率、净利率);
- 资产负债表看家底和负债(净资产、资产负债率);
- 现金流量表看钱是不是真到手(经营现金流 vs 净利润);
- 最重要的一课:利润是算出来的,现金是真收到的;经营现金流长期 ≥ 净利润才是赚真钱。
下一章 03:在三张表的基础上,算出 ROE、估值(PE/PB) 等指标,并做杜邦拆解和简化 DCF——给公司「定价」。
免责声明:本教程为投资教育内容,所有分析与示例仅为方法演示,不构成任何投资建议。文中涉及的公司与数据仅用于教学举例,不代表推荐。市场有风险,决策需自负。