连载的上一篇文章中,小鱼使用 Pandas 分析了上市公司财务报告中的资产负债表,并且定义了一些 Series 格式化显示和绘图的相关函数。
本节,我们将在上一节的基础之上,读取利润表和现金流量表,并对利润表和现金流量表展开分析,识别财务造假。
读取利润表
benefit_df = pd.read_excel(BENEFIT, sheet_name='Worksheet', header=1, index_col=0)
benefit_df.dropna(inplace=True)
benefit_df.replace({'--':0}, inplace=True)
benefit_df = benefit_df.T[:6][::-1]
benefit_df.columns.name = ''
benefit_df.apply(format_thousandth).T
某公司最近 6 年的利润表部分截图:
读取现金流量表
cash_df = pd.read_excel(CASH, sheet_name='Worksheet', header=1, index_col=0)
cash_df.dropna(inplace=True)
cash_df.replace({'--':0}, inplace=True)
cash_df = cash_df.T[:6][::-1]
cash_df.columns.name = ''
cash_df.apply(format_thousandth).T
现金流量表部分截图如下:
分析利润表和现金流量表
连载的上一篇文章,小鱼分析资产负债表一共用了 9 个步骤,下面我们从序号 10 开始,来完成利润表和现金流量表的分析。
10、看营业收入,了解公司的行业地位及成长性
营业收入主要看两点,规模和增长率。
注:营业收入的规模越大越好,增长率最好要大于 10%,越高越好。一般来说营业收入金额大的公司实力也相对较强。
营业收入及营业收入增长率情况:
t10 = pd.DataFrame(index=benefit_df.index,
columns=['其中:营业收入(元)', '营业收入增长率'])
t10['其中:营业收入(元)'] = benefit_df['其中:营业收入(元)']
t10['营业收入增长率'] = benefit_df['其中:营业收入(元)'].pct_change()
pd.merge(
t10[['其中:营业收入(元)']].apply(format_thousandth),
t10[['营业收入增长率']].apply(format_percentage),
left_index=True,
right_index=True
).T
使用柱形图对营业收入进行可视化展示:
plot_show(t10['其中:营业收入(元)'], title='营业收入', kind='bar')
使用折线图观察营业收入增长率的变化:
plot_show(t10['营业收入增长率'],title='营业收入增长率', ylabel='', y_format='p')
通常情况下,营业收入增长率大于 10%,说明公司成长较快,前景较好;小于 10% 则成长缓慢;小于 0,说明公司可能正在处于衰落之中。
11、看毛利率,了解公司的产品竞争力及风险
毛利率主要看两点,数值和波幅。在投资实践中,一般把毛利率小于 40% 的公司或者毛利率波幅大于 20% 的公司淘汰掉。
注:一般毛利率大于 40% 意味着公司的产品竞争力较强,毛利率高的公司,风险相对较小;毛利率小于 40% 的公司,产品的竞争力较弱。
注:毛利率的波动幅度小于 10%,为优秀的公司;波动幅度大于 20%,公司经营或财务造假的风险大。
毛利率 = (营业收入 - 营业成本) / 营业收入 = 毛利 / 营业收入
分析近 6 年的毛利率及毛利率波动幅度:
t11 = pd.DataFrame(index=benefit_df.index,
columns=['其中:营业收入(元)', '其中:营业成本(元)', '毛利率', '毛利率波动幅度'])
t11['其中:营业收入(元)'] = benefit_df['其中:营业收入(元)']
t11['其中:营业成本(元)'] = benefit_df['其中:营业成本(元)']
t11['毛利率'] = (t11['其中:营业收入(元)'] - t11['其中:营业成本(元)'])/t11['其中:营业收入(元)']
t11['毛利率波动幅度'] = t11['毛利率'].pct_change()
pd.concat([t11.T[:2].apply(format_thousandth), t11.T[2:].apply(format_percentage)])
使用柱形图,对毛利率进行可视化展示:
plot_show(t11['毛利率'], title='毛利率', kind='bar', ylabel='', y_format='p' )
毛利率大于 40%,公司有某种核心竞争力;小于40%,公司一般面临的竞争压力都较大。低毛利率的公司要想获得成功需要比高毛利率的公司付出更大的代价,这就增加了公司的风险。
毛利率波动幅度的可视化展示:
plot_show(t11['毛利率波动幅度'], title='毛利率波动幅度', ylabel='', y_format='p' )
该公司毛利率波动控制在 ±20% 以内,位于安全范围。
12、看期间费用率,了解公司的成本管控能力
优秀公司的费用率与毛利率的比率一般小于 40% ,在投资实践中,一般把期间费用率与毛利率的比率大于 60% 的公司淘汰掉。
四费合计 = 销售费用 + 管理费用 + 研发费用 + 财务费用
2018年,新会计准则,研发费用从管理费用里单设科目,所以从三费变为四费。
注:当我们计算四费时,出于保守考虑,如果财务费用是正数,就把财务费用计算在内。如果财务费用是负数,就不把财务费用计算在内。
期间费用率
= (销售费用 + 管理费用 + 研发费用 + 财务费用) / 营业收入
= 四费合计/ 营业收入 * 100%
分析近 6 年的期间费用率与毛利率的比例:
t12 = pd.DataFrame(index=benefit_df.index,
columns=['销售费用(元)','管理费用(元)', '研发费用(元)', '财务费用(元)', '四费合计',
'其中:营业收入(元)', '期间费用率', '毛利率', '期间费用率占毛利率的比例'])
t12[['销售费用(元)','管理费用(元)', '研发费用(元)', '财务费用(元)', '其中:营业收入(元)']] = \
benefit_df[['销售费用(元)','管理费用(元)', '研发费用(元)', '财务费用(元)', '其中:营业收入(元)']]
t12.loc[t12['财务费用(元)']<0, '财务费用(元)'] = 0
t12['四费合计'] = t12.T[:4].sum()
t12['期间费用率'] = t12['四费合计'] / t12['其中:营业收入(元)']
t12['毛利率'] = t11['毛利率']
t12['期间费用率占毛利率的比例'] = t12['期间费用率'] / t12['毛利率']
pd.concat([t12.T[:6].apply(format_thousandth), t12.T[6:].apply(format_percentage)])
可视化展示期间费用率与毛利率的比例:
plot_show(t12['期间费用率占毛利率的比例'], title='期间费用率占毛利率的比例',
kind='bar', ylabel='', y_format='p')
该上市公司期间费用率与毛利率的比例最近 5 年均在 40% 以下,并且呈现出下降趋势,可见公司的成本管控能力非常优秀。
注:期间费用率与毛利率的比例小于 40%,成本控制能力好,属于优秀的企业;大于 40%,成本控制能力差。
13、看销售费用率,了解公司产品的销售难易度
销售费用率主要看两点,数值和变动趋势。
- 销售费用率小于 15% 的公司,其产品比较容易销售,销售风险相对较小。
- 销售费用率大于 30% 的公司,其产品销售难度大,销售风险也大。
在投资实践中,一般把销售费用率大于 30% 的公司淘汰掉。
计算公司近 6 年的销售费用率:
t13 = pd.DataFrame(index=benefit_df.index,
columns=['销售费用(元)','其中:营业收入(元)', '销售费用率'])
t13[['销售费用(元)','其中:营业收入(元)']] = benefit_df[['销售费用(元)','其中:营业收入(元)']]
t13['销售费用率'] = t13['销售费用(元)'] / t13['其中:营业收入(元)']
pd.concat([t13.T[:2].apply(format_thousandth), t13.T[2:].apply(format_percentage)])
绘制柱形图进行可视化展示:
plot_show(t13['销售费用率'], ylabel='', title='销售费用率', kind='bar', y_format='p')
该公司近 6 年的销售费用率在 6% 以内,并且呈现下降趋势,产品很畅销。
14、看主营利润,了解公司主业的盈利能力及利润质量
主营利润主要看两点,主营利润率和主营利润与营业利润的比率。
注:主营利润率小于 15% 的公司主业盈利能力差;主营利润与营业利润的比率小于80%的公司利润质量较差,此两者都需要淘汰掉。
在投资实践中,主营利润与营业利润的比率小于 80% 或主营利润率小于 15% 的公司,一般淘汰掉,这样的公司不具备持续的竞争力。
主营利润 = 营业收入 - 营业成本 - 税金及附加 - (销售费用 + 管理费用 + 财务费用 + 研发费用)
主营利润率 = 主营利润 / 营业收入 * 100%
大于 15%,主业盈利能力强;小于 15%,主业盈利能力弱。
主营利润占营业利润的比率 = 主营利润 / 营业利润
大于80%,说明营业利润中的绝大部分利润是由主业创造的,这样的利润结构是健康的,可持续的;小于80%,这样的公司不具备持续的竞争力。
计算主营利润率及主营利润与营业利润的比率:
t14 = pd.DataFrame(index=benefit_df.index,
columns=['其中:营业收入(元)','其中:营业成本(元)', '营业税金及附加(元)',
'四费合计', '主营利润', '主营利润率', '营业利润(元)',
'主营利润占营业利润的比率'])
t14[['其中:营业收入(元)','其中:营业成本(元)', '营业税金及附加(元)', '营业利润(元)']] = \
benefit_df[['其中:营业收入(元)','其中:营业成本(元)', '营业税金及附加(元)','三、营业利润(元)']]
t14['四费合计'] = t12['四费合计']
t14['主营利润'] = t14['其中:营业收入(元)'] - t14.T[1:4].sum()
t14['主营利润率'] = t14['主营利润'] / t14['其中:营业收入(元)']
t14['主营利润占营业利润的比率'] = t14['主营利润'] / t14['营业利润(元)']
pd.concat([t14.T[:5].apply(format_thousandth),
t14.T[5:6].apply(format_percentage),
t14.T[6:7].apply(format_thousandth),
t14.T[7:].apply(format_percentage)])
以柱形图绘制主营利润率:
plot_show(t14['主营利润率'], title='主营利润率', ylabel='', y_format='p', kind='bar')
该公司主营利润率近 5 年整体在 20% 以上,主业盈利能力很强,近 3 年出现下降趋势,不过仍保持在 23% 以上。
绘制主营利润率与营业利润的比率柱形图:
plot_show(t14['主营利润占营业利润的比率'], title='主营利润占营业利润的比率',
ylabel='', y_format='p', kind='bar')
该公司主营利润率与营业利润的比例近 5 年维持在 87% 以上,利润质量非常高,很大一部分利润都是由公司的主业创造的。
15、看净利润,了解公司的经营成果及含金量,净利润主要看净利润含金量
注:过去 5 年的平均净利润现金比率小于 100% 的公司,淘汰掉。
计算净利润现金含量:
t15 = pd.DataFrame(index=cash_df.index,
columns=['经营活动产生的现金流量净额','净利润', '净利润现金比率'])
t15['净利润'] = benefit_df['五、净利润(元)']
t15['经营活动产生的现金流量净额'] = cash_df['经营活动产生的现金流量净额(元)']
t15['净利润现金比率'] = t15['经营活动产生的现金流量净额'] / t15['净利润']
t15_show = pd.concat([t15.T[:2].apply(format_thousandth), t15.T[2:].apply(format_percentage)])
t15_show
计算平均净利润现金含量:
>> print(f"{t15['净利润现金比率'].mean():.2%}")
119.16%
公司的净利润现金含量远大于 100% ,不仅赚到了利润,也赚到了真金白银。
16、看归母净利润,了解公司的整体盈利能力及持续性
用归母净利润和归母股东权益可以计算出公司的净资产收益率 ROE 。最优秀公司的 ROE 一般会持续大于 20%,优秀公司的 ROE 也会持续大于15%。
ROE小于15%的公司需要淘汰掉。另外归母净利润增长率持续小于10%的公司也要淘汰掉。
归母净利润增长率:大于 10%,说明公司在以较快的速度成长;小于 0,很可能意味公司已经处于衰落之中。
ROE = 归母净利润 / 归母所有者权益合计:持续大于 20%,最优秀的公司;持续大于 15%,优秀的公司;小于 15%,淘汰。
计算归母净利润的增速以及 ROE:
t16 = pd.DataFrame(index=benefit_df.index,
columns=['归属于母公司所有者的净利润', '归属于母公司所有者权益合计',
'净资产收益率(ROE)', '归属于母公司所有者的净利润增长率'])
t16['归属于母公司所有者的净利润'] = benefit_df['归属于母公司所有者的净利润(元)']
t16['归属于母公司所有者权益合计'] = debt_df['归属于母公司所有者权益合计(元)']
t16['净资产收益率(ROE)'] = t16['归属于母公司所有者的净利润'] / t16['归属于母公司所有者权益合计']
t16['归属于母公司所有者的净利润增长率'] = t16['归属于母公司所有者的净利润'].pct_change()
pd.concat([t16.T[:2].apply(format_thousandth), t16.T[2:].apply(format_percentage)])
绘制净资产收益率 ROE 的柱形图:
plot_show(t16['净资产收益率(ROE)'], title='净资产收益率(ROE)', ylabel='', kind='bar', y_format='p')
绘制归母净利润增速的柱形图:
plot_show(t16['归属于母公司所有者的净利润增长率'],
title='归属于母公司所有者的净利润增长率',
ylabel='',
kind='bar',
y_format='p')
该公司近 4 年的 ROE 在 17% 以上,最近 3 年在 20% 以上,自有资产获益能力非常强。
归母净利润的增速 2020 年只有 4.58% ,小于 10% ,异常。需要通过阅读年报或者咨询董秘来了解异常的原因。
17、看购买固定资产、无形资产和其他长期资产支付的现金,了解公司的增长潜力
购建固定资产、无形资产和其他长期资产支付的现金与经营活动产生的现金流量净额的比率位于 3%-60% 区间的公司增长潜力较大并且风险相对较小。大于 100% 或持续小于 3% 需要淘汰掉,前者风险较大,后者回报较低。
明天的增长来源于今天的投资。
计算购建支付的现金与经营活动产生的现金流量净额的比率:
t17 = pd.DataFrame(index=cash_df.index,
columns=['购建固定资产、无形资产和其他长期资产支付的现金',
'经营活动产生的现金流量净额',
'购建支付的现金与经营活动产生的现金流量净额的比率'
])
t17[['购建固定资产、无形资产和其他长期资产支付的现金', '经营活动产生的现金流量净额']] = \
cash_df[['购建固定资产、无形资产和其他长期资产支付的现金(元)','经营活动产生的现金流量净额(元)']]
t17['购建支付的现金与经营活动产生的现金流量净额的比率'] = \
t17['购建固定资产、无形资产和其他长期资产支付的现金'] / t17['经营活动产生的现金流量净额']
pd.concat([t17.T[:2].apply(format_thousandth), t17.T[2:].apply(format_percentage)])
绘图:
plot_show(t17['购建支付的现金与经营活动产生的现金流量净额的比率'],
title='购建支付的现金与经营活动产生的现金流量净额的比率',
ylabel='', y_format='p', kind='bar')
18、看分配股利、利润或偿付利息支付的现金,了解公司的现金分红情况
分配股利、利润或偿付利息支付的现金与经营活动产生的现金流量净额的比率最好在 20%-70% 之间,比率小于 20% 不够厚道,大于 70% 难以持续。
- 比率低于 20%,公司要么能力有问题,要么品质有问题。如果主要是偿付利息的金额,那分红的钱就更少了。
- 合理比率为 20%-70%,分红的长期可持续性较强。
- 比率高于70%,分红比例很难长期持续。
计算分配股利、利润或偿付利息支付的现金与经营活动产生的现金流量净额的比率:
t18 = pd.DataFrame(index=cash_df.index,
columns=['分配股利、利润或偿付利息支付的现金','经营活动产生的现金流量净额',
'分配股利、利润或偿付利息支付的现金/经营活动产生的现金流量净额'])
t18[['分配股利、利润或偿付利息支付的现金','经营活动产生的现金流量净额']] = \
cash_df[['分配股利、利润或偿付利息支付的现金(元)','经营活动产生的现金流量净额(元)']]
t18['分配股利、利润或偿付利息支付的现金/经营活动产生的现金流量净额'] = \
t18['分配股利、利润或偿付利息支付的现金'] / t18['经营活动产生的现金流量净额']
pd.concat([t18.T[:2].apply(format_thousandth), t18.T[2:].apply(format_percentage)])
绘图:
plot_show(t18['分配股利、利润或偿付利息支付的现金/经营活动产生的现金流量净额'],
title='分配股利、利润或偿付利息支付的现金/经营活动产生的现金流量净额',
ylabel='',
y_format='p',
kind='bar')
以上就是关于利润表和现金流量表的分析了,两个表加起来一共也是九步,再加上上一篇文章中资产负债表的九步,三大财务报表一共是 18 步。通过十八步法分析财报,可以帮助我们识别财报造假,分析好公司。
附
除了十八步法,我们也可以分析一下经营活动产生的现金流量净额、投资活动产生的现金流量净额以及筹资活动产生的现金流量净额。
plot_show(cash_df[['经营活动产生的现金流量净额(元)',
'投资活动产生的现金流量净额(元)',
'筹资活动产生的现金流量净额(元)']],
title='三大现金流量净额')
我们主要看净额的正负情况,投资中更倾向于【正负负】和【正正负】类型的企业,也就是经营活动产生的现金流强大,并且大量分红。