08 现金流分析与企业价值评估

本章核心议题:现金流分析与企业价值评估

各位同学,欢迎来到《商业大数据分析与应用》的全新章节。

今天,我们将深入探讨商业分析和投资决策中的一个至关重要的领域——现金流分析

核心理念:‘利润是观点,现金是事实’

Profit is an opinion, cash is a fact.

这句话是理解本章所有内容的第一块基石。

一家公司可能在账面上看起来盈利丰厚,但如果无法产生健康的现金流,它依然可能陷入困境。

我们的目标:为企业绘制’现金流画像’

本章我们将学习如何运用PythonTushare财经数据接口,系统地分析企业的现金流状况。

最终目标是:为一家企业绘制出精准的’现金流画像’,并将其与同行业竞争者进行横向对比。

我们的分析工具箱:五大核心指标

我们将从五个核心指标入手,层层递进,像侦探一样探寻企业价值的真相。

  1. 盈利质量:经营现金流 / 净利润
  2. 收入质量:销售收现 / 营业收入
  3. 财务风险:现金 / 有息负债
  4. 价值创造:自由现金流
  5. 生命周期:现金流画像

学习成果:理论与实践的结合

通过本章的学习,你将能够:

  • 掌握 关键财务指标的计算和解读。
  • 熟练运用 Python 进行数据获取、处理、计算和可视化。
  • 结合 理论知识与实践操作,为商业决策和价值投资打下坚实基础。

基础回顾:三大财务报表的关系

在开始分析前,我们必须理解三大财务报表是如何相互关联的。

三大财务报表关系图 展示利润表、现金流量表和资产负债表之间的关联。 利润表 现金流量表 资产负债表 净利润 -> 留存收益 期末现金 -> 现金资产 非现金项目调整

核心会计原则:权责发生制 vs. 收付实现制

理解这两个概念是理解现金流分析的钥匙

  • 权责发生制 (Accrual Basis):
    • 核心: 收入和费用在其’发生’时确认,而不管现金是否收付。
    • 应用: 利润表。
    • 例子: 公司卖出商品,即使客户还没付款(形成应收账款),也确认收入。
  • 收付实现制 (Cash Basis):
    • 核心: 收入和费用在现金’实际收付’时确认。
    • 应用: 现金流量表。
    • 例子: 只有当客户的钱真正打到公司账上时,才记录现金流入。

指标一:经营活动现金流量净额 / 净利润

现在,我们来看第一个,也是最重要的指标:盈利质量的’试金石’。

什么是盈利质量?

Definition 1 盈利质量 (Quality of Earnings) 盈利质量是指公司财报中利润的真实性、稳定性和可持续性。高质量的盈利应主要由可持续的主营业务驱动,并且有充足的现金流作为支撑。

指标剖析:分子与分母

\[ \Large{ \text{盈利质量比率} = \frac{\text{经营活动产生的现金流量净额 (NCFO)}}{\text{净利润 (Net Income)}} } \]

  • 分子 (NCFO): 来自现金流量表,遵循收付实现制
  • 分母 (Net Income): 来自利润表,遵循权责发生制

这个比率直接对比了’赚到的钱’和’账面上的利润’。

如何解读该比率?

比率值 含义 信号
> 1 每1元利润,有超过1元的现金流入支撑 非常健康
≈ 1 利润基本都转化为现金 健康
< 1 部分利润未转化为现金(如应收账款) 需关注
<< 1 或为负 利润’含金量’低,可能存在风险 危险信号

案例分析:贵州茅台 (600519.SH)

接下来,我们以A股市场的知名企业——贵州茅台为例,利用Python来计算并分析其2019年至2023年这五年的盈利质量。

步骤一:准备分析环境

首先,导入必要的Python库,并初始化Tushare Pro接口。

Tushare是一个提供丰富财经数据的Python库,非常适合进行量化分析。

import pandas as pd
import tushare as ts
import numpy as np
import time
import matplotlib.pyplot as plt

# 设置matplotlib正常显示中文和负号
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif'] = ['SimHei']

# 输入你的Tushare Pro API Token
# 同学们可以去Tushare官网注册获取自己的Token
pro = ts.pro_api('ba1646815a79a63470552889a69f957f5544bef01d3f082159bf8474')

步骤二:获取经营活动现金流数据

我们定义要分析的时间范围,并使用循环从Tushare获取贵州茅台每年的现金流量表数据。

我们需要的字段是’经营活动产生的现金流量净额’ (n_cashflow_act)。

# 需要获取的年份
years = ['20191231', '20201231', '20211231', '20221231', '20231231']

# 创建一个空的DataFrame用于存放现金流量数据
df1 = pd.DataFrame()
# 循环获取每年的数据
for i in years:
    df1 = df1.append(pro.cashflow(ts_code='600519.SH', period=i, fields='ts_code,n_cashflow_act,end_date'),ignore_index=True)

步骤三:数据清洗与去重

金融数据API有时可能会返回重复的数据行。一个好的编程习惯是在获取数据后进行去重处理。

df1 = df1.drop_duplicates(ignore_index=True)

drop_duplicates()方法会移除重复的行,ignore_index=True会重新生成一个干净的索引。

步骤四:获取净利润数据

同样地,我们从利润表中获取同期的’净利润’ (n_income) 数据。

df2 = pd.DataFrame()
for i in ['20191231', '20201231', '20211231', '20221231', '20231231']:
    df2 = df2.append(pro.income(ts_code='600519.SH', period=i, fields='ts_code,n_income,end_date'), ignore_index=True)
    
df2 = df2.drop_duplicates(ignore_index=True)

步骤五:合并数据

现在我们有两份数据:df1 包含现金流,df2 包含净利润。我们需要将它们合并到一个DataFrame中以便计算。

df = pd.concat([df1, df2['n_income']], axis=1)

pd.concat函数可以拼接数据框,axis=1表示按列(横向)拼接。

步骤六:计算指标

数据准备就绪,我们就可以计算核心指标了。

# 计算指标1:“经营活动产生的现金流量净额/净利润”,结果保留2位小数
df['ratio1'] = round(df['n_cashflow_act'] / df['n_income'], 2)

我们新建一列ratio1,存放计算结果,并使用round()函数保留两位小数。

茅台盈利质量分析结果

最终得到的数据表如下:

Table 1: 贵州茅台的NCFO/净利润比率 (2019-2023)
import pandas as pd
import tushare as ts
import numpy as np
import time
pro = ts.pro_api('ba1646815a79a63470552889a69f957f5544bef01d3f082159bf8474')
years = ['20191231', '20201231', '20211231', '20221231', '20231231']
df1 = pd.DataFrame()
for i in years:
    df1 = df1.append(pro.cashflow(ts_code='600519.SH', period=i, fields='ts_code,n_cashflow_act,end_date'),ignore_index=True)
df1 = df1.drop_duplicates(ignore_index=True)
df2 = pd.DataFrame()
for i in ['20191231', '20201231', '20211231', '20221231', '20231231']:
    df2 = df2.append(pro.income(ts_code='600519.SH', period=i, fields='ts_code,n_income,end_date'), ignore_index=True)
df2 = df2.drop_duplicates(ignore_index=True)
df = pd.concat([df1, df2['n_income']], axis=1)
df['ratio1'] = round(df['n_cashflow_act'] / df['n_income'], 2)
df

ratio1列直观地展示了二者的比率。

步骤七:可视化分析

为了更直观地理解数据趋势,我们将使用matplotlib库进行可视化。

import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif'] = ['SimHei']
df['n_cashflow_act_mean'] = np.mean(df['n_cashflow_act'])
df['n_income_mean'] = np.mean(df['n_income'])
plt.figure(figsize=(10, 6))
plt.plot(years,df['n_cashflow_act'],label='经营活动现金流量净额', marker='o')
plt.plot(years,df['n_income'],label='净利润', marker='o')
plt.plot(years,df['n_cashflow_act_mean'],linestyle='--',label = '经营活动现金流量净额均值')
plt.plot(years,df['n_income_mean'],linestyle='--',label = '净利润均值')
plt.legend(loc = 'upper left')
plt.title('贵州茅台NCFO与净利润趋势图 (2019-2023)', fontsize=16)
plt.ylabel('金额 (百亿)', fontsize=12)
plt.xlabel('年份', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
Figure 1

趋势图解读(1): 稳健增长

从趋势图中可以发现:

  • 贵州茅台的净利润(橙色线)呈现出非常稳健的增长态势
  • 这是企业基本面优秀的第一层体现。

趋势图解读(2): 现金流高于利润

  • 经营活动现金流量净额(蓝色线)在绝大多数年份都高于净利润
  • 其5年均值线(绿色虚线)也高于净利润的5年均值线(红色虚线)。
  • 这充分说明了贵州茅台的利润基本上都是以现金形式实现的,盈利质量极高

趋势图解读(3): 2022年的特殊情况

  • 值得注意的是,2022年其现金流量净额出现了一个明显的下降,甚至低于当年的净利润。
  • 查阅年报可知,这主要由于当年支付的税费存放同业款项大幅增加所致。
  • 这属于特定年份的特殊情况,而非经营恶化。

比率条形图:更直观的对比

我们直接将ratio1指标绘制成条形图,更直观地观察其每年的波动。

plt.figure(figsize=(10, 6))
bars = plt.bar(years, df['ratio1'])
plt.axhline(1.0, color='red', linestyle='--', label='比率=1参考线')
plt.title('贵州茅台NCFO/净利润比率 (2019-2023)', fontsize=16)
plt.ylabel('比率值', fontsize=12)
plt.xlabel('年份', fontsize=12)
plt.legend()
for bar in bars:
    yval = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2.0, yval, f'{yval:.2f}', va='bottom', ha='center')
plt.show()
Figure 2

条形图解读

该图清晰地显示:

  • 除了2022年(比率为0.56),其他所有年份的比率都大于1
  • 这再次印证了其优秀的盈利质量。

案例小结:贵州茅台的启示

贵州茅台的案例告诉我们:

一家顶级公司的财务数据,往往能清晰地展现出其强大的经营能力和健康的财务状况。

我们的分析方法,成功地验证了这一点。

指标二:销售商品、提供劳务收到的现金 / 营业收入

探讨完利润的质量,我们现在把目光投向利润的源头——收入

这个比率是衡量企业营业收入质量的核心指标。

为什么关心收入质量?

同样基于权责发生制,企业只要提供了商品或服务,就可以确认收入。

但这引出了一个问题:

账面上的高收入,背后是真的’财源滚滚’,还是堆积如山的’白条’(应收账款)?

指标剖析:分子与分母

\[ \Large{ \text{收入质量比率} = \frac{\text{销售商品、提供劳务收到的现金}}{\text{营业收入}} } \]

  • 分子: 现金流量表中的c_fr_sale_sg,是实实在在收回的现金。
  • 分母: 利润表中的revenue,是按会计准则确认的收入。

如何解读该比率?

  • 比率 > 1: 非常健康。收到的现金超过了当期收入,可能还收回了以前的欠款。体现了强大的议价能力(先款后货)。
  • 比率 ≈ 1: 健康。大部分营业收入都转化为了现金。
  • 比率 < 1: 需关注。可能意味着回款能力较弱,对下游客户议价能力不强,或采取了宽松的信用政策。有坏账风险。

案例分析:贵州茅台的收入质量

我们继续以贵州茅台为例,看看这家公司的收入质量如何。

数据获取与计算

我们采用与上一节类似的方法,分别从现金流量表和利润表中获取所需数据,然后合并计算比率。

Table 2: 贵州茅台的收入质量比率 (2019-2023)
years = ['20191231', '20201231', '20211231', '20221231', '20231231']
df3 = pd.DataFrame()
for i in years:
    df3 = df3.append(pro.cashflow(ts_code='600519.SH', period=i, fields='ts_code,c_fr_sale_sg,end_date'),
                     ignore_index=True)
df3 = df3.drop_duplicates(keep='last', ignore_index=True)
df4 = pd.DataFrame()
for i in ['20191231', '20201231', '20211231', '20221231', '20231231']:
    df4 = df4.append(pro.income(ts_code='600519.SH', period=i, fields='ts_code,revenue,end_date'), ignore_index=True)
df4 = df4.drop_duplicates(ignore_index=True)
df_2 = pd.concat([df3, df4['revenue']], axis=1)
df_2['ratio2'] = round(df_2['c_fr_sale_sg'] / df_2['revenue'], 2)
df_2

结果解读:极强的议价能力

从表格结果可以看到:

  • 茅台公司每年的ratio2大于1.1
  • 这说明它收到的现金甚至超过了当期确认的营业收入。
  • 这体现了极强的品牌力和对下游经销商的议价能力,通常意味着’先款后货’的销售模式,是非常健康的信号。

可视化:销售收现 vs. 营业收入

我们同样将这两个核心数据进行可视化对比。

df_2['c_fr_sale_sg_mean'] = np.mean(df_2['c_fr_sale_sg'])
df_2['revenue_mean'] = np.mean(df_2['revenue'])
plt.figure(figsize=(10, 6))
plt.plot(years, df_2['c_fr_sale_sg'],label='销售商品、提供劳务收到的现金', marker='o')
plt.plot(years,df_2['revenue'],label='营业收入', marker='o')
plt.plot(years,df_2['c_fr_sale_sg_mean'],linestyle='--',label = '销售收现均值')
plt.plot(years,df_2['revenue_mean'],linestyle='--',label = '营业收入均值')
plt.legend(loc = 'upper left',fontsize=12)
plt.title('贵州茅台销售收现与营业收入趋势图 (2019-2023)', fontsize=16)
plt.ylabel('金额 (百亿)', fontsize=12)
plt.xlabel('年份', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
Figure 3

趋势图解读:现金流的有力证明

这张图再次有力地证明了我们的判断。

代表’销售收现’的蓝色线始终稳稳地压在代表’营业收入’的橙色线之上,显示出极高的收入质量。

比率条形图:稳定且优秀

我们再将比率ratio2单独用条形图展示。

plt.figure(figsize=(10, 6))
bars = plt.bar(years, df_2['ratio2'])
plt.axhline(1.0, color='red', linestyle='--', label='比率=1参考线')
plt.title('贵州茅台收入质量比率 (2019-2023)', fontsize=16)
plt.ylabel('比率值', fontsize=12)
plt.xlabel('年份', fontsize=12)
plt.legend()
for bar in bars:
    yval = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2.0, yval, f'{yval:.2f}', va='bottom', ha='center')
plt.show()
Figure 4

从图中可以看出,比率非常稳定,且始终在1.1以上。

实践环节:分析苏宁易购 (002024.SZ)

我们已经学习了如何分析贵州茅台这样的优质范例。

现在,我们来看一个不同行业的公司——苏宁易购,应用我们学到的知识进行对比分析。

苏宁易购:盈利质量分析

我们重复之前的步骤,对苏宁易购进行盈利质量分析。

import pandas as pd
import tushare as ts
import numpy as np
import time
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
pro = ts.pro_api('ba1646815a79a63470552889a69f957f5544bef01d3f082159bf8474')
years = ['20191231', '20201231', '20211231', '20221231', '20231231']
df1 = pd.DataFrame()
for i in years:
  df1 = df1.append(pro.cashflow(ts_code='002024.SZ', period=i, fields='ts_code,n_cashflow_act,end_date'),ignore_index=True)
df1 = df1.drop_duplicates(ignore_index=True)
df2 = pd.DataFrame()
for i in ['20191231', '20201231', '20211231', '20221231', '20231231']:
  df2 = df2.append(pro.income(ts_code='002024.SZ', period=i, fields='ts_code,n_income,end_date'), ignore_index=True)
df2 = df2.drop_duplicates(ignore_index=True)
df = pd.concat([df1, df2['n_income']], axis=1)
df['ratio1'] = round(df['n_cashflow_act'] / df['n_income'], 2)
df['n_cashflow_act_mean'] = np.mean(df['n_cashflow_act'])
df['n_income_mean'] = np.mean(df['n_income'])
plt.figure(figsize=(10,6))
plt.plot(years,df['n_cashflow_act'],label='经营活动现金流量净额', marker='o')
plt.plot(years,df['n_income'],label='净利润', marker='o')
plt.plot(years,df['n_cashflow_act_mean'],linestyle='--',label = '经营活动现金流量净额均值')
plt.plot(years,df['n_income_mean'],linestyle='--',label = '净利润均值')
plt.title('苏宁易购NCFO与净利润趋势图 (2019-2023)', fontsize=16)
plt.ylabel('金额', fontsize=12)
plt.xlabel('年份', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.legend(loc = 'best')
plt.show()
Figure 5

苏宁易购盈利质量解读

  • 苏宁易购的净利润和经营现金流近年来都为负数,且波动巨大。
  • 净利润(橙线)在2020年后持续为负,显示公司处于亏损状态。
  • 经营现金流(蓝线)与净利润走势不一致,二者比率缺乏稳定性和可比性。这反映了公司近年来面临的经营困境。

指标三:期末现金及现金等价物余额 vs. 有息负债

评估了盈利和收入质量后,我们需要进一步考察其财务的稳健性,即偿债能力和风险水平。

指标剖析:资产与负债的直接对话

我们直接比较企业账上的’活钱’和需要支付利息的’债务’。

  • 期末现金及现金等价物余额: 企业可以立即动用的资金,是抵御风险的第一道防线
  • 有息负债 (Interest-bearing Debt):
    • 短期借款 (st_borr)
    • 长期借款 (lt_borr)
    • 应付债券 (bond_payable)

如何解读该指标?

  • 现金 > 有息负债: 财务状况非常健康,几乎没有偿债压力。公司可以用自己的现金还清所有带息债务。
  • 现金 < 有息负债: 存在一定的财务压力。需要关注债务结构和盈利能力是否能覆盖利息支出。
  • 现金 << 有息负债: 财务风险较高。企业依赖外部融资,利息负担重,在经济下行周期中可能尤为脆弱。

案例分析:贵州茅台的财务风险

我们来检验一下贵州茅台的财务风险状况。

数据获取与计算

我们从现金流量表获取’期末现金’,从资产负债表获取三项有息负债。

Table 3: 贵州茅台的现金与有息负债 (2019-2023)
df5 = pd.DataFrame()
for i in years:
    df5 = df5.append(pro.cashflow(ts_code='600519.SH', period=i, fields='ts_code,c_cash_equ_end_period,end_date'), ignore_index=True)
df5 = df5.drop_duplicates(ignore_index=True)
df6 = pd.DataFrame()
for i in years:
    df6 = df6.append(pro.balancesheet(ts_code='600519.SH', period=i, fields='ts_code,st_borr,lt_borr,bond_payable,end_date'), ignore_index=True)
df6 = df6.drop_duplicates(ignore_index=True)
df_3 = pd.concat([df5, df6[['st_borr', 'lt_borr', 'bond_payable']]], axis=1)
df_3 = df_3.fillna(0)
df_3['sum'] = df_3['st_borr'] + df_3['lt_borr'] + df_3['bond_payable']
df_3

结果解读:零有息负债的’优等生’

结果令人印象深刻:

  • 贵州茅台在过去五年中,所有的有息负债项目均为0
  • 这是一家完全没有有息负债经营的公司,财务风险极低。

可视化:现金储备 vs. 有息负债

通过可视化图表可以更清晰地看到这一点。

df_3['sum_mean'] = np.mean(df_3['sum'])
df_3['c_cash_equ_end_period_mean'] = np.mean(df_3['c_cash_equ_end_period'])
plt.figure(figsize=(10, 6))
plt.plot(years, df_3['c_cash_equ_end_period'],label='期末现金及现金等价物余额', marker='o')
plt.plot(years,df_3['c_cash_equ_end_period_mean'],linestyle='--',label = '期末现金余额均值')
plt.plot(years, df_3['sum'],label='有息负债总和', marker='x')
plt.plot(years,df_3['sum_mean'],linestyle='--',label = '有息负债均值')
plt.legend(loc = 'best')
plt.title('贵州茅台现金与有息负债对比 (2019-2023)', fontsize=16)
plt.ylabel('金额 (百亿)', fontsize=12)
plt.xlabel('年份', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
Figure 6

趋势图解读:坚如磐石的财务状况

  • 代表有息负债的橙色线完全贴合在0刻度上
  • 代表现金余额的蓝色线则高高在上,且持续增长。
  • 这直观地表明,贵州茅台拥有极为充裕的现金储备,无需通过借债来发展业务。

实践分析:苏宁易购的财务风险

零售行业通常需要大量资金支持库存和扩张,我们来看苏宁易购的情况。

df5 = pd.DataFrame()
for i in years:
  df5 = df5.append(pro.cashflow(ts_code='002024.SZ', period=i, fields='ts_code,c_cash_equ_end_period,end_date'), ignore_index=True)
df5 = df5.drop_duplicates(ignore_index=True)
df6 = pd.DataFrame()
for i in years:
  df6 = df6.append(pro.balancesheet(ts_code='002024.SZ', period=i, fields='ts_code,st_borr,lt_borr,bond_payable,end_date'), ignore_index=True)
df6 = df6.drop_duplicates(ignore_index=True)
df_3 = pd.concat([df5, df6[['st_borr', 'lt_borr', 'bond_payable']]], axis=1)
df_3 = df_3.fillna(0)
df_3['sum'] = df_3['st_borr'] + df_3['lt_borr'] + df_3['bond_payable']
df_3['sum_mean'] = np.mean(df_3['sum'])
df_3['c_cash_equ_end_period_mean'] = np.mean(df_3['c_cash_equ_end_period'])
plt.figure(figsize=(10, 6))
plt.plot(years, df_3['c_cash_equ_end_period'],label='期末现金及现金等价物余额', marker='o')
plt.plot(years, df_3['sum'],label='有息负债总和', marker='o')
plt.legend(loc = 'best')
plt.title('苏宁易购现金与有息负债对比 (2019-2023)', fontsize=16)
plt.ylabel('金额', fontsize=12)
plt.xlabel('年份', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
Figure 7

苏宁易购财务风险解读

  • 与茅台形成鲜明对比,苏宁易购的有息负债(橙线)远高于期末现金余额(蓝线)。
  • 近年来,现金余额持续下降,而有息负债维持高位,显示出公司面临较大的偿债压力和财务风险

指标四:自由现金流 (Free Cash Flow)

自由现金流 (FCF) 是公司价值评估中最重要的概念之一,尤其是在使用贴现现金流(DCF)模型时。

什么是自由现金流?

通俗地讲,自由现金流就是企业在’养活自己’并为’未来发展’投入必要资金后,真正剩下的、可以自由支配的钱

自由现金流的用途

这些’自由的钱’可以用来:

  • 偿还债务
  • 向股东分红
  • 回购股票
  • 进行非核心业务的投资或并购

它是企业为所有资本供应者(股东和债权人)创造的真实价值。

自由现金流的计算公式

我们采用一个简化的实用公式: \[ \large{\text{FCF} = \text{经营活动现金流净额} - \text{投资活动现金流出}} \]

在Tushare字段中,对应为: FCF = n_cashflow_act - stot_out_inv_act

如何解读自由现金流?

  • 持续为正且增长: 企业健康,具有投资价值的强烈信号。公司能自我造血支持发展和回报股东。
  • 时正时负: 可能处于周期性行业或大规模投资期,需要结合具体情况分析。
  • 持续为负: 危险信号。企业经营产生的现金不足以覆盖投资,需要持续依赖外部融资’输血’。

案例分析:贵州茅台的自由现金流

我们来计算贵州茅台的自由现金流。

数据获取与计算

我们需要从现金流量表中同时获取n_cashflow_actstot_out_inv_act

Table 4: 贵州茅台的自由现金流 (2019-2023)
df_fc = pd.DataFrame()
for i in years:
    df_fc = df_fc.append(pro.cashflow(ts_code='600519.SH', period=i, fields='ts_code,n_cashflow_act,stot_out_inv_act,end_date'), ignore_index=True)
df_fc = df_fc.drop_duplicates()
df_fc['自由现金流'] = df_fc['n_cashflow_act'] - df_fc['stot_out_inv_act']
df_fc

结果解读:强大的价值创造能力

从计算结果看,贵州茅台每年的自由现金流都为非常可观的正数

这说明其强大的经营现金流在覆盖了所有投资需求后仍有大量剩余。

可视化:自由现金流趋势

将自由现金流的变化趋势绘制成图表。

df_fc['自由现金流_mean'] = np.mean(df_fc['自由现金流'])
plt.figure(figsize=(10, 6))
plt.plot(years, df_fc['自由现金流'],label='自由现金流', marker='o')
plt.plot(years,df_fc['自由现金流_mean'],linestyle='--',label = '自由现金流均值')
plt.legend(loc = 'upper left')
plt.title('贵州茅台自由现金流趋势图 (2019-2023)', fontsize=16)
plt.ylabel('金额 (百亿)', fontsize=12)
plt.xlabel('年份', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
Figure 8

趋势图解读:充沛且增长

  • 贵州茅台的自由现金流十分充沛
  • 虽然在2022年有所下降(与经营现金流下降原因一致),但整体依然保持在极高水平,并呈现上升趋势,表现良好。

实践分析:苏宁易购的自由现金流

重资产的零售企业,投资活动会消耗大量现金。我们来分析其自由现金流。

df_fc = pd.DataFrame()
for i in years:
  df_fc = df_fc.append(pro.cashflow(ts_code='002024.SZ', period=i, fields='ts_code,n_cashflow_act,stot_out_inv_act,end_date'), ignore_index=True)
df_fc = df_fc.drop_duplicates()
df_fc['自由现金流'] = df_fc['n_cashflow_act'] - df_fc['stot_out_inv_act']
df_fc['自由现金流_mean'] = np.mean(df_fc['自由现金流'])
plt.figure(figsize=(10, 6))
plt.plot(years, df_fc['自由现金流'],label='自由现金流', marker='o')
plt.plot(years,df_fc['自由现金流_mean'],linestyle='--',label = '自由现金流均值')
plt.axhline(0, color='red', linestyle='--')
plt.legend(loc = 'upper left')
plt.title('苏宁易购自由现金流趋势图 (2019-2023)', fontsize=16)
plt.ylabel('金额', fontsize=12)
plt.xlabel('年份', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
Figure 9

苏宁易购自由现金流解读

  • 苏宁易购的自由现金流在过去五年中大部分时间为负
  • 这表明公司的经营活动产生的现金不足以支撑其投资活动,需要依赖外部融资(如借款或股权融资)来维持运营和扩张,商业模式面临挑战。

指标五:现金流画像

现在,我们将进入一个更综合、更有趣的分析层面——为企业绘制’现金流画像’。

理论基础:三大现金流活动

现金流量表由三部分构成:

  1. 经营活动现金流: 企业的核心造血能力。
  2. 投资活动现金流: 反映企业的扩张收缩战略。
  3. 筹资活动现金流: 体现企业与资本市场的互动(融资/还款)。

画像方法:正负组合的解读

这三项现金流的净额有正有负,它们的组合能够像一幅素描,勾勒出企业当前所处的发展阶段。

我们用 + 表示流入,- 表示流出,可以得到8种企业类型。

八种现金流画像解读

类型 经营 投资 筹资 解读
奶牛型 + - - 最佳:主业强劲,持续投资,并回报股东/还债
蛮牛型 + - + 成长型:主业良好,大规模投资,并外部融资支持扩张
老母鸡型 + + - 成熟型:主业稳定,变卖资产,并回报股东/还债
妖精型 + + + 需警惕:经营良好,但同时卖资产又融资,动机不明
赌徒型 - - + 极高风险:主业亏损,烧钱投资,依赖融资续命
骗吃骗喝型 - + + 危险:主业不振,靠卖资产和融资为生
混吃等死型 - + - 困境:主业不振,卖资产还债
大出血型 - - - 濒危:所有活动都在失血

最佳画像:奶牛型 (+, -, -)

  • 经营活动 +: 主营业务能创造大量现金。
  • 投资活动 -: 用赚来的钱进行再投资,扩大生产。
  • 筹资活动 -: 有余力偿还债务或向股东分红。
  • 结论: 这是最健康、最优质的成长型企业。

成长画像:蛮牛型 (+, -, +)

  • 经营活动 +: 主营业务良好。
  • 投资活动 -: 大规模投资扩张。
  • 筹资活动 +: 经营现金流不足以支持庞大的投资,需要外部融资。
  • 结论: 典型的成长型企业,机遇与风险并存。

案例分析:贵州茅台的现金流画像

我们来为贵州茅台绘制2019至2023年的年度现金流画像。

数据获取与准备

我们需要获取三项活动的现金流量净额。

Table 5: 贵州茅台三项活动现金流净额 (2019-2023)
df_profile = pd.DataFrame()
for i in years:
    df_profile = df_profile.append(pro.cashflow(ts_code='600519.SH', period=i,fields='ts_code,n_cashflow_act,n_cash_flows_fnc_act,n_cashflow_inv_act,end_date'), ignore_index=True)
df_profile = df_profile.drop_duplicates(ignore_index=True)
df_profile = df_profile.rename(columns={'n_cashflow_act': '经营活动现金流', 'n_cashflow_inv_act': '投资活动现金流', 'n_cash_flows_fnc_act': '筹资活动现金流'})
df_profile

数据初步解读

从原始数据可以清晰看到:

  • 经营活动现金流: 始终为正
  • 投资活动现金流: 始终为负
  • 筹资活动现金流: 始终为负

画像分析与解读

我们通过代码自动判断每年的画像类型。

Listing 1
for num in range(len(df_profile)):
    year_str = '20' + str(num + 19)
    profile_str = ""
    analysis_str = ""
    if df_profile['经营活动现金流'][num] > 0:
        if df_profile['投资活动现金流'][num] > 0 and df_profile['筹资活动现金流'][num] > 0:
            profile_str = '妖精型 (+,+,+)'
            analysis_str = '需警惕其融资和变卖资产的动机。'
        elif df_profile['投资活动现金流'][num] > 0 and df_profile['筹资活动现金流'][num] < 0:
            profile_str = '老母鸡型 (+,+,-)'
            analysis_str = '成熟型企业,不再扩张,持续回报。'
        elif df_profile['投资活动现金流'][num] < 0 and df_profile['筹资活动现金流'][num] > 0:
            profile_str = '蛮牛型 (+,-,+)'
            analysis_str = '高速扩张的成长型企业。'
        elif df_profile['投资活动现金流'][num] < 0 and df_profile['筹资活动现金流'][num] < 0:
            profile_str = '奶牛型 (+,-,-)'
            analysis_str = '最优质的成长型企业,自我造血能力强。'
    else:
        profile_str = '经营现金流为负'
        analysis_str = '主业造血能力不足,需要警惕。'
    print(f"{year_str}年度: {profile_str} - {analysis_str}")

茅台画像结论:持续的’奶牛’

  • 分析结果显示,贵州茅台在过去五年中,每年都属于’奶牛型’企业
  • 这是一个非常优秀的画像,证明了它是一家典型的优质成长型企业

实践分析:苏宁易购的现金流画像

我们再来看苏宁易购的画像,洞察其战略重点和财务状况。

Table 6: 苏宁易购三项活动现金流净额 (2019-2023)
df_profile_su = pd.DataFrame()
for i in years:
  df_profile_su = df_profile_su.append(pro.cashflow(ts_code='002024.SZ', period=i, fields='ts_code,n_cashflow_act,n_cash_flows_fnc_act,n_cashflow_inv_act,end_date'), ignore_index=True)
df_profile_su = df_profile_su.drop_duplicates(ignore_index=True)
df_profile_su = df_profile_su.rename(columns={'n_cashflow_act': '经营活动现金流', 'n_cashflow_inv_act': '投资活动现金流', 'n_cash_flows_fnc_act': '筹资活动现金流'})
df_profile_su

苏宁易购画像分析

Listing 2
for num in range(len(df_profile_su)):
    year_str = '20' + str(num + 19)
    profile_str = ""
    analysis_str = ""
    if df_profile_su['经营活动现金流'][num] > 0:
        if df_profile_su['投资活动现金流'][num] > 0 and df_profile_su['筹资活动现金流'][num] > 0:
            profile_str = '妖精型 (+,+,+)'
        elif df_profile_su['投资活动现金流'][num] > 0 and df_profile_su['筹资活动现金流'][num] < 0:
            profile_str = '老母鸡型 (+,+,-)'
        elif df_profile_su['投资活动现金流'][num] < 0 and df_profile_su['筹资活动现金流'][num] > 0:
            profile_str = '蛮牛型 (+,-,+)'
        elif df_profile_su['投资活动现金流'][num] < 0 and df_profile_su['筹资活动现金流'][num] < 0:
            profile_str = '奶牛型 (+,-,-)'
    else:
        if df_profile_su['投资活动现金流'][num] > 0 and df_profile_su['筹资活动现金流'][num] > 0:
            profile_str = '骗吃骗喝型 (-,+,+)'
        elif df_profile_su['投资活动现金流'][num] > 0 and df_profile_su['筹资活动现金流'][num] < 0:
            profile_str = '混吃等死型 (-,+,-)'
        elif df_profile_su['投资活动现金流'][num] < 0 and df_profile_su['筹资活动现金流'][num] > 0:
            profile_str = '赌徒型 (-,-,+)'
        elif df_profile_su['投资活动现金流'][num] < 0 and df_profile_su['筹资活动现金流'][num] < 0:
            profile_str = '大出血型 (-,-,-)'
            
    print(f"{year_str}年度: {profile_str}")

苏宁易购的画像在不同类型间切换,且多次出现经营现金流为负的情况,反映了其经营的波动性和挑战。

最终环节:行业横向对比分析

对单个企业进行纵向分析固然重要,但横向对比才能真正评估其市场地位和竞争力。

什么是同行分析 (Peer Analysis)?

其核心目的在于:

  • 建立基准: 了解行业平均水平和领先水平。
  • 识别优劣: 发现目标公司在哪些指标上优于或劣于竞争对手。
  • 验证模式: 一家公司是否显著偏离行业常规?是优势还是风险?

实践:白酒行业大比拼

我们将综合运用前面学到的所有指标,对A股白酒行业的所有上市公司进行一次全面的横向对比分析。

数据准备:获取所有白酒公司名单

首先,我们从Tushare获取所有A股上市公司名单,然后筛选出industry字段为’白酒’的公司。

# 获取上交所和深交所所有股票信息
code_sheet1 = pro.stock_basic(exchange='SSE')
code_sheet2 = pro.stock_basic(exchange='SZSE')

# 合并两张表
code_sheet = pd.concat([code_sheet1, code_sheet2])

# 筛选出行业为“白酒”的企业名单
code_bj = code_sheet[code_sheet['industry'] == '白酒']

数据处理:循环获取所有公司数据

接下来,我们循环遍历白酒公司列表,获取每家公司最新的财务数据,并计算我们需要的五个指标。

这是一个综合性的数据处理过程。

对比一:盈利质量 (NCFO/NI)

code_sheet1 = pro.stock_basic(exchange='SSE')
code_sheet2 = pro.stock_basic(exchange='SZSE')
code_sheet = pd.concat([code_sheet1, code_sheet2])
code_bj = code_sheet[code_sheet['industry'] == '白酒']
df1=pd.DataFrame()
df2=pd.DataFrame()
for i in range(len(code_bj)):
  try:
    df1 = df1.append(pro.cashflow(ts_code=code_bj.iloc[i]['ts_code'],period='20231231',fields='ts_code,n_cashflow_act,stot_out_inv_act,c_fr_sale_sg,c_cash_equ_end_period,end_date,n_cashflow_inv_act,n_cash_flows_fnc_act'),ignore_index=True)
    df2 = df2.append(pro.income(ts_code=code_bj.iloc[i]['ts_code'],period='20231231',fields='ts_code,n_income,revenue,end_date'),ignore_index=True)
  except:
    continue
df1=df1.drop_duplicates(ignore_index=True)
df2=df2.drop_duplicates(ignore_index=True)
df=pd.concat([df1,df2[['n_income','revenue']]],axis=1)
merged_df = pd.merge(df, code_bj[['ts_code', 'name']], on='ts_code', how='left')
merged_df['ratio1'] = round(merged_df['n_cashflow_act']/merged_df['n_income'],2)
merged_df.replace([np.inf, -np.inf], np.nan, inplace=True)
merged_df.dropna(subset=['ratio1'], inplace=True)
plt.figure(figsize = (16,8))
plt.bar(merged_df['name'], merged_df['ratio1'])
plt.axhline(1.0, color='red', linestyle='--')
plt.xticks(rotation=45, ha='right')
plt.title('2023年白酒行业盈利质量 (NCFO/NI) 对比', fontsize=16)
plt.ylabel('比率值', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
Figure 10

大部分白酒公司的盈利质量都很好,比率普遍在1附近或以上。

对比二:收入质量 (销售收现/营收)

merged_df['ratio2'] = round(merged_df['c_fr_sale_sg']/merged_df['revenue'],2)
merged_df.replace([np.inf, -np.inf], np.nan, inplace=True)
merged_df.dropna(subset=['ratio2'], inplace=True)
plt.figure(figsize = (16,8))
plt.bar(merged_df['name'], merged_df['ratio2'])
plt.axhline(1.0, color='red', linestyle='--')
plt.xticks(rotation=45, ha='right')
plt.title('2023年白酒行业收入质量 (销售收现/营收) 对比', fontsize=16)
plt.ylabel('比率值', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
Figure 11

白酒行业普遍具有强大的议价能力,多数公司的收入质量比率都大于1,体现了’先款后货’的商业模式。

对比三:自由现金流

merged_df['自由现金流']=merged_df['n_cashflow_act']-merged_df['stot_out_inv_act']
merged_df.dropna(subset=['自由现金流'], inplace=True)
merged_df_sorted = merged_df.sort_values('自由现金流', ascending=False)
plt.figure(figsize = (16,8))
plt.bar(merged_df_sorted['name'], merged_df_sorted['自由现金流'])
plt.xticks(rotation=45, ha='right')
plt.title('2023年白酒行业自由现金流对比', fontsize=16)
plt.ylabel('金额', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
Figure 12

行业龙头(贵州茅台、五粮液等)创造了绝大部分的自由现金流,马太效应明显。

对比四:现金流画像

df = merged_df.rename(columns={'n_cashflow_act': '经营活动现金流', 'n_cashflow_inv_act': '投资活动现金流', 'n_cash_flows_fnc_act': '筹资活动现金流'})
print('2023年白酒行业现金流画像:')
for comp in range(len(df)):
  profile_str = '未知'
  if df['经营活动现金流'][comp] > 0:
    if df['投资活动现金流'][comp] < 0 and df['筹资活动现金流'][comp] < 0:
      profile_str = '奶牛型 (+,-,-)'
    elif df['投资活动现金流'][comp] < 0 and df['筹资活动现金流'][comp] > 0:
      profile_str = '蛮牛型 (+,-,+)'
    elif df['投资活动现金流'][comp] > 0 and df['筹资活动现金流'][comp] < 0:
      profile_str = '老母鸡型 (+,+,-)'
    elif df['投资活动现金流'][comp] > 0 and df['筹资活动现金流'][comp] > 0:
      profile_str = '妖精型 (+,+,+)'
  else:
    profile_str = '经营现金流为负'
  print(df['name'][comp] + ': ' + profile_str)

大部分头部白酒企业都呈现出’奶牛型’或’老母鸡型’的优质画像。

对比四:现金流画像

课程总结:我们的五大核心武器

我们回顾本章学习的五个核心分析工具:

  1. 盈利质量 (NCFO/NI): 检验利润的’含金量’。
  2. 收入质量 (销售收现/营收): 检验收入的真实性和回款能力。
  3. 财务风险 (现金 vs. 有息负债): 评估短期偿债能力。
  4. 自由现金流: 判断真实价值创造能力。
  5. 现金流画像: 洞察企业发展阶段和战略意图。

核心思想再回顾

利润是观点,现金是事实。

通过本章的学习,我们掌握了如何透过复杂的会计报表,抓住现金这条主线,去伪存真,看清一家企业的真实经营状况和内在价值。

感谢大家!

Q & A