Hello 大家好~ 在连载的上一篇文章中,小鱼和大家学习了利润表的分析,了解了归母净利润的形成过程。

本节,我们将学习现金流量表的分析步骤,从现金流量表解读公司的造血能力、增长潜力、分红是否慷慨、公司所属类型、现金增长情况以及可用现金情况。
温馨提示:
文章内容源自小鱼最新创建的开源项目:https://gitee.com/miali/financial-report-analysis,需要的小伙伴可前往围观。
同样的,在开始分析前,导入项目中自定义的 Python 包 analysis 中的相关工具:
from analysis import ANALYSIS_CONFIGS
from analysis.analysis import FinancialAnalysis
from analysis.doc_utils import ReportDocument
其中,ANALYSIS_CONFIGS 定义了财报分析对应的配置文件:
>> ANALYSIS_CONFIGS
['all_analysis.json',
'asset_quality_analysis.json',
'asset_indepth_analysis.json',
'asset_fraud_analysis.json',
'profit_analysis.json',
'cash_flow_analysis.json']
分析现金流量表使用的配置文件为 cash_flow_analysis.json ,使用该配置文件初始化分析对象,就可开始我们今天的分析啦~
analysis = FinancialAnalysis(ANALYSIS_CONFIGS[5])
images, titles, fields = analysis.images, analysis.titles, analysis.fields
造血能力:经营活动产生的现金流
造血能力分析两个方面:销售商品、提供劳务收到的现金占营业收入的不比例、经营活动产生的现金流量净额占净利润的比例。
1)销售商品、提供劳务收到的现金
销售商品、提供劳务收到的现金包含了增值税,营业收入不包含增值税,所以考虑到增值税的问题,销售商品、提供商品收到的现金与营业收入的比率大于 100%。
t1 = analysis.init_table('t1')
t1['现金占营业收入的比率'] = t1['销售商品、提供劳务收到的现金(元)'] / t1['其中:营业收入(元)']
analysis.format_show_table('t1')
该公司销售商品、提供劳务收到的现金与营业收入的比率基本都大于 100% ,说明卖出去的商品、提供的劳务大分部都能把钱收回来。

销售商品、提供劳务收到的现金除 2018 年为 113.85% 之外,起于年份无明显波动。
analysis.show_plot('t1')

t2 = analysis.init_table('t2')
t2['净利润现金比率'] = t2['经营活动产生的现金流量净额(元)'] / t2['五、净利润(元)']
analysis.format_show_table('t2')
2)经营活动产生的现金流量净额
经营活动产生的现金流量净额即经营活动产生的现金流入减现金流出,可以和净利润进行比较,以衡量净利润现金含量。

我们期望经营活动产生的现金流量净额 / 净利润,连续 5 年大于 80%, 5 年平均值大于 100% 。该公司净利润现金含量连续 5 年均大于 80% ,且 5 年的平均净利润现金含量为 100.92% ,大于 100% 。
>> print(f"连续 5 年的平均净利润现金含量:{t2['净利润现金比率'].mean():.2%}")
连续 5 年的平均净利润现金含量:100.92%
可见公司不仅赚到了利润,也赚到了真金白银(利润表收入的确认是全责发生制,而现金流量表是收付实现制,因此利润可能含有很大的水分,也就是白条)。
增长潜能:投资活动产生的现金流
明日的成长来自于今天的投资,一般情况下,构建固定资产、无形资产和其他长期资产支付的现金占经营活动产生的现金流量净额的比例保持在 3%~60% 之间,比较合理。
t3 = analysis.init_table('t3')
t3['投资占经营净现金流的比例'] = \
t3['购建固定资产、无形资产和其他长期资产支付的现金(元)'] / t3['经营活动产生的现金流量净额(元)']
analysis.format_show_table('t3')
该公司构建三产支付的现金在 11%~32% 之间,位于合理区间。此外,小鱼也列出了销售商品、提供劳务收到的现金,如果高投入没有带来高的销货现金回报,往往意味着风险。

该公司构建三产支付的现金在不断增加,2021 年环比增长 31.70% 。
analysis.show_plot('t3')

构建三产支付的现金也带来了销售商品、提供劳务收到的现金的增加,尤其在 2018 年和 2019 年增幅明显。
analysis.show_plot('t3', image_index=1)

分红情况:筹资活动产生的现金流
现金流量表中关于分红支付的现金没有直接披露,而是与其他筹资活动相加,合并披露为 “分配股利、利润或偿付利息支付的现金”。对比优秀的公司,几乎没有利息支出,因此可以粗略地将 “分配股利、利润或偿付利息支付的现金” 认为是分红支付的现金。
小鱼这里由于是单独分析现金流量表,分析的科目不多,于是上同花顺个股找了一下每年的分红。
分红查找位置:

我们使用年报对应的分红金额除以经营活动产生的现金流量净额计算分红比例,也就是主业赚的钱中,公司愿意拿出多大的比例来给股东分红。
t4 = analysis.init_table('t4')
t4['分红金额'] = [365000000, 712000000, 759000000, 475000000, 473000000, 472000000]
t4['分红占经营现金净额的比例'] = t4['分红金额'] / t4['经营活动产生的现金流量净额(元)']
analysis.format_show_table('t4')
该公司分红占经营现金净额的比例 2017 年和 2018 年在 50% 以上,最近 3 年维持在 30% 以上。

通常我们认为分红比例控制在 20%~70% 之间比较合理,低于 20% 要么公司能力有问题,要么品质有问题;大于 70% 则持续性不好。
注:互联网公司基本不分红,或者分红很少,这是由于互联网公司高成长性决定的。公司可以拿分红的资金用于公司的快速扩张,公司成长了,市值也会上升,那么也相当于给股东回报了。
该公司的分红比例位于合理区间,公司还是比较慷慨的,但持续性欠佳。
analysis.show_plot('t4')

公司类型:三大活动净额的正负
公司类型是指经营活动、投资活动和筹资活动产生的现金流量净额的正负进行排列组合得到的结果。
首先,主业必须赚钱,因此是 “正” 开头的类型,筹资活动我们希望 “负” 开头,也就是公司在大规模还债或者分红,而不是借钱扩张,因此以 “负” 结尾。
剩下中间的是投资活动产生的现金流量净额,“正” 往往说明公司的投资在产生收益,“负” 往往说明公司在加速扩张,处于快速的成长期。
这样,我们希望的两种类型就是:“正正负” 和 “正负负” ,前者可能步入成熟期,现金流充裕,每年带来稳定的现金分红;后者则主业盈利能力强大,主业赚得钱足够支持自身扩张和分红,公司处于快速成长期。
t5 = analysis.init_table('t5')
t5_tmp = t5.copy()
t5_tmp.loc[t5['经营活动产生的现金流量净额(元)']>0, '经营活动产生的现金流量净额(元)'] = "正"
t5_tmp.loc[t5['经营活动产生的现金流量净额(元)']<0, '经营活动产生的现金流量净额(元)'] = "负"
t5_tmp.loc[t5['投资活动产生的现金流量净额(元)']>0, '投资活动产生的现金流量净额(元)'] = "正"
t5_tmp.loc[t5['投资活动产生的现金流量净额(元)']<0, '投资活动产生的现金流量净额(元)'] = "负"
t5_tmp.loc[t5['筹资活动产生的现金流量净额(元)']>0, '筹资活动产生的现金流量净额(元)'] = "正"
t5_tmp.loc[t5['筹资活动产生的现金流量净额(元)']<0, '筹资活动产生的现金流量净额(元)'] = "负"
t5_tmp['三大活动现金流量净额类型'] = t5_tmp['经营活动产生的现金流量净额(元)'] + \
t5_tmp['投资活动产生的现金流量净额(元)'] + t5_tmp['筹资活动产生的现金流量净额(元)']
t5['三大活动现金流量净额类型'] = t5_tmp['三大活动现金流量净额类型']
analysis.format_show_table('t5', ignore=['三大活动现金流量净额类型'])
该公司类型除 2019 年为 “正正负” 之外,其它年份均为 “正负负” 类型,属于我们的理想型。

analysis.show_plot('t5')
公司主业赚钱能力强,可以覆盖自身的扩张需要和分红支出。

现金增长:现金及现金等价物净增加额
现金及现金等价物净增加额也就是公司自己兜里的钱相比期初增加了多少。在分析现金增长情况时,需要把当前的分红加进来。
之所以加分红,是因为有的公司分红非常慷慨,不仅把今年赚的钱全部用于分红,并且还用往年的搭了点,就会导致现金及现金等价物净增加额小于 0。为了排除分红的影响,我们把分红加回来。
每年实施的分红在查找时,注意与我们计算分红比例时的对应方式不同:

比如上述除权初期日 2021 年 5 月 31 号发放的 4.73 亿,应该和 2021 年的现金及现金等价物净增加额计算当年的现金增长情况。
但在计算分红时,这笔钱是在上一年年报,也就是 2020 年报中披露的,应该和 2020 年的经营活动产生的现金流量净额相除计算分红比例。
注:这一点不难理解,因为年报中披露的分红方案,会在下一年把钱分出去。
因此,小鱼在计算当年派发的分红金额时,2017~2021 年可以使用 t4 中 2016~2020 年年报披露的分红。

2016 年派发的分红则需要到网站查看。
t6 = analysis.init_table('t6')
# 当年的分红其实是上一年年报中计划的分红,而实际分红可能会和年报中披露的不一致,需要查同花顺个股获取当年的分红
t6.loc[2016, '分红金额'] = 292000000
t6['分红金额'][1:] = t4['分红金额'][:-1]
t6['分红+现金净增加额'] = t6.T[:2].sum()
analysis.format_show_table('t6')
该公司除 2017 年之外,其它年份账上的现金都是在不断增加的。对于 2017 年的异常情况,通过查阅年报 第四节 经营情况讨论与分析 中的 二. 主营业务分析 下的 5、现金流 找到。

该公司 2017 年现金增长为负数,主要系公司购买保本型理财产品所致,因此此项无风险。
analysis.show_plot('t6')

可用现金:期末现金及现金等价物余额
现金流是企业的生命线,了解企业的可以现金情况,也就是分析企业是否存在偿债风险。如果期末现金及现金等价物净增加额减有息负债大于 0 ,说明兜里的现金就够还债,经营风险小。
t7 = analysis.init_table('t7')
t7['有息负债总额'] = t7.T[1:6].sum()
t7['期末现金余额-有息负债'] = t7['六、期末现金及现金等价物余额(元)'] - t7['有息负债总额']
analysis.format_show_table('t7')
该公司期末现金及现金等价物余额减有息负债连续 5 年均大于 0 ,无偿债风险。

最近 4 年期末现金及现金等价物余额与有息负债的差额在 40 亿左右,现金流非常强大。
analysis.show_plot('t7')

如果小于 0 ,则需要把理财产品也考虑进来,也就是计算准货币资金减有息负债的差额,大于 0 ,则无偿债风险。
t8 = analysis.init_table('t8')
t8['准货币资金'] = t8.T[:4].sum()
t8['有息负债总额'] = t8.T[5:10].sum()
t8['总货币资金与有息负债之差'] = t8['准货币资金'] - t8['有息负债总额']
analysis.format_show_table('t8')
该公司准货币资金减有息负债的差额连续 5 年均大于 0,无偿债风险。

该公司有息负债几乎为 0 ,可以忽略不计。
analysis.show_plot('t8')

并且准货币资金与有息负债的差额在不断增加,说明公司这些年的经营确实带来了财富的积累。
analysis.show_plot('t8', image_index=1)

最后,执行如下的代码,即可在项目的 dist 目录下输出名为 xxxxxx CASH_FLOW_ANALYSIS 2017~2021.docx 的现金流量表分析报告。
ReportDocument(analysis).save()
以上就是今天的全部内容啦~下一节,小鱼将和大家学习项目中的最后一个分析 all_analysis.ipynb ,也就是综合分析三张财务报表,对 A 股上市的公司进行财报排雷。
我们下节见啦 (╹▽╹)
