連載的上一篇文章中,小魚使用 Pandas 分析了上市公司財務(wù)報告中的資產(chǎn)負(fù)債表,并且定義了一些 Series 格式化顯示和繪圖的相關(guān)函數(shù)。
本節(jié),我們將在上一節(jié)的基礎(chǔ)之上,讀取利潤表和現(xiàn)金流量表,并對利潤表和現(xiàn)金流量表展開分析,識別財務(wù)造假。
讀取利潤表
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 年的利潤表部分截圖:

讀取現(xiàn)金流量表
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
現(xiàn)金流量表部分截圖如下:

分析利潤表和現(xiàn)金流量表
連載的上一篇文章,小魚分析資產(chǎn)負(fù)債表一共用了 9 個步驟,下面我們從序號 10 開始,來完成利潤表和現(xiàn)金流量表的分析。
10、看營業(yè)收入,了解公司的行業(yè)地位及成長性
營業(yè)收入主要看兩點,規(guī)模和增長率。
注:營業(yè)收入的規(guī)模越大越好,增長率最好要大于 10%,越高越好。一般來說營業(yè)收入金額大的公司實力也相對較強(qiáng)。
營業(yè)收入及營業(yè)收入增長率情況:
t10 = pd.DataFrame(index=benefit_df.index,
columns=['其中:營業(yè)收入(元)', '營業(yè)收入增長率'])
t10['其中:營業(yè)收入(元)'] = benefit_df['其中:營業(yè)收入(元)']
t10['營業(yè)收入增長率'] = benefit_df['其中:營業(yè)收入(元)'].pct_change()
pd.merge(
t10[['其中:營業(yè)收入(元)']].apply(format_thousandth),
t10[['營業(yè)收入增長率']].apply(format_percentage),
left_index=True,
right_index=True
).T

使用柱形圖對營業(yè)收入進(jìn)行可視化展示:
plot_show(t10['其中:營業(yè)收入(元)'], title='營業(yè)收入', kind='bar')

使用折線圖觀察營業(yè)收入增長率的變化:
plot_show(t10['營業(yè)收入增長率'],title='營業(yè)收入增長率', ylabel='', y_format='p')

通常情況下,營業(yè)收入增長率大于 10%,說明公司成長較快,前景較好;小于 10% 則成長緩慢;小于 0,說明公司可能正在處于衰落之中。
11、看毛利率,了解公司的產(chǎn)品競爭力及風(fēng)險
毛利率主要看兩點,數(shù)值和波幅。在投資實踐中,一般把毛利率小于 40% 的公司或者毛利率波幅大于 20% 的公司淘汰掉。
注:一般毛利率大于 40% 意味著公司的產(chǎn)品競爭力較強(qiáng),毛利率高的公司,風(fēng)險相對較??;毛利率小于 40% 的公司,產(chǎn)品的競爭力較弱。
注:毛利率的波動幅度小于 10%,為優(yōu)秀的公司;波動幅度大于 20%,公司經(jīng)營或財務(wù)造假的風(fēng)險大。
毛利率 = (營業(yè)收入 - 營業(yè)成本) / 營業(yè)收入 = 毛利 / 營業(yè)收入
分析近 6 年的毛利率及毛利率波動幅度:
t11 = pd.DataFrame(index=benefit_df.index,
columns=['其中:營業(yè)收入(元)', '其中:營業(yè)成本(元)', '毛利率', '毛利率波動幅度'])
t11['其中:營業(yè)收入(元)'] = benefit_df['其中:營業(yè)收入(元)']
t11['其中:營業(yè)成本(元)'] = benefit_df['其中:營業(yè)成本(元)']
t11['毛利率'] = (t11['其中:營業(yè)收入(元)'] - t11['其中:營業(yè)成本(元)'])/t11['其中:營業(yè)收入(元)']
t11['毛利率波動幅度'] = t11['毛利率'].pct_change()
pd.concat([t11.T[:2].apply(format_thousandth), t11.T[2:].apply(format_percentage)])

使用柱形圖,對毛利率進(jìn)行可視化展示:
plot_show(t11['毛利率'], title='毛利率', kind='bar', ylabel='', y_format='p' )

毛利率大于 40%,公司有某種核心競爭力;小于40%,公司一般面臨的競爭壓力都較大。低毛利率的公司要想獲得成功需要比高毛利率的公司付出更大的代價,這就增加了公司的風(fēng)險。
毛利率波動幅度的可視化展示:
plot_show(t11['毛利率波動幅度'], title='毛利率波動幅度', ylabel='', y_format='p' )

該公司毛利率波動控制在 ±20% 以內(nèi),位于安全范圍。
12、看期間費用率,了解公司的成本管控能力
優(yōu)秀公司的費用率與毛利率的比率一般小于 40% ,在投資實踐中,一般把期間費用率與毛利率的比率大于 60% 的公司淘汰掉。
四費合計 = 銷售費用 + 管理費用 + 研發(fā)費用 + 財務(wù)費用
2018年,新會計準(zhǔn)則,研發(fā)費用從管理費用里單設(shè)科目,所以從三費變?yōu)樗馁M。
注:當(dāng)我們計算四費時,出于保守考慮,如果財務(wù)費用是正數(shù),就把財務(wù)費用計算在內(nèi)。如果財務(wù)費用是負(fù)數(shù),就不把財務(wù)費用計算在內(nèi)。
期間費用率
= (銷售費用 + 管理費用 + 研發(fā)費用 + 財務(wù)費用) / 營業(yè)收入
= 四費合計/ 營業(yè)收入 * 100%
分析近 6 年的期間費用率與毛利率的比例:
t12 = pd.DataFrame(index=benefit_df.index,
columns=['銷售費用(元)','管理費用(元)', '研發(fā)費用(元)', '財務(wù)費用(元)', '四費合計',
'其中:營業(yè)收入(元)', '期間費用率', '毛利率', '期間費用率占毛利率的比例'])
t12[['銷售費用(元)','管理費用(元)', '研發(fā)費用(元)', '財務(wù)費用(元)', '其中:營業(yè)收入(元)']] = \
benefit_df[['銷售費用(元)','管理費用(元)', '研發(fā)費用(元)', '財務(wù)費用(元)', '其中:營業(yè)收入(元)']]
t12.loc[t12['財務(wù)費用(元)']<0, '財務(wù)費用(元)'] = 0
t12['四費合計'] = t12.T[:4].sum()
t12['期間費用率'] = t12['四費合計'] / t12['其中:營業(yè)收入(元)']
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% 以下,并且呈現(xiàn)出下降趨勢,可見公司的成本管控能力非常優(yōu)秀。
注:期間費用率與毛利率的比例小于 40%,成本控制能力好,屬于優(yōu)秀的企業(yè);大于 40%,成本控制能力差。
13、看銷售費用率,了解公司產(chǎn)品的銷售難易度
銷售費用率主要看兩點,數(shù)值和變動趨勢。
- 銷售費用率小于 15% 的公司,其產(chǎn)品比較容易銷售,銷售風(fēng)險相對較小。
- 銷售費用率大于 30% 的公司,其產(chǎn)品銷售難度大,銷售風(fēng)險也大。
在投資實踐中,一般把銷售費用率大于 30% 的公司淘汰掉。
計算公司近 6 年的銷售費用率:
t13 = pd.DataFrame(index=benefit_df.index,
columns=['銷售費用(元)','其中:營業(yè)收入(元)', '銷售費用率'])
t13[['銷售費用(元)','其中:營業(yè)收入(元)']] = benefit_df[['銷售費用(元)','其中:營業(yè)收入(元)']]
t13['銷售費用率'] = t13['銷售費用(元)'] / t13['其中:營業(yè)收入(元)']
pd.concat([t13.T[:2].apply(format_thousandth), t13.T[2:].apply(format_percentage)])

繪制柱形圖進(jìn)行可視化展示:
plot_show(t13['銷售費用率'], ylabel='', title='銷售費用率', kind='bar', y_format='p')

該公司近 6 年的銷售費用率在 6% 以內(nèi),并且呈現(xiàn)下降趨勢,產(chǎn)品很暢銷。
14、看主營利潤,了解公司主業(yè)的盈利能力及利潤質(zhì)量
主營利潤主要看兩點,主營利潤率和主營利潤與營業(yè)利潤的比率。
注:主營利潤率小于 15% 的公司主業(yè)盈利能力差;主營利潤與營業(yè)利潤的比率小于80%的公司利潤質(zhì)量較差,此兩者都需要淘汰掉。
在投資實踐中,主營利潤與營業(yè)利潤的比率小于 80% 或主營利潤率小于 15% 的公司,一般淘汰掉,這樣的公司不具備持續(xù)的競爭力。
主營利潤 = 營業(yè)收入 - 營業(yè)成本 - 稅金及附加 - (銷售費用 + 管理費用 + 財務(wù)費用 + 研發(fā)費用)
主營利潤率 = 主營利潤 / 營業(yè)收入 * 100%
大于 15%,主業(yè)盈利能力強(qiáng);小于 15%,主業(yè)盈利能力弱。
主營利潤占營業(yè)利潤的比率 = 主營利潤 / 營業(yè)利潤
大于80%,說明營業(yè)利潤中的絕大部分利潤是由主業(yè)創(chuàng)造的,這樣的利潤結(jié)構(gòu)是健康的,可持續(xù)的;小于80%,這樣的公司不具備持續(xù)的競爭力。
計算主營利潤率及主營利潤與營業(yè)利潤的比率:
t14 = pd.DataFrame(index=benefit_df.index,
columns=['其中:營業(yè)收入(元)','其中:營業(yè)成本(元)', '營業(yè)稅金及附加(元)',
'四費合計', '主營利潤', '主營利潤率', '營業(yè)利潤(元)',
'主營利潤占營業(yè)利潤的比率'])
t14[['其中:營業(yè)收入(元)','其中:營業(yè)成本(元)', '營業(yè)稅金及附加(元)', '營業(yè)利潤(元)']] = \
benefit_df[['其中:營業(yè)收入(元)','其中:營業(yè)成本(元)', '營業(yè)稅金及附加(元)','三、營業(yè)利潤(元)']]
t14['四費合計'] = t12['四費合計']
t14['主營利潤'] = t14['其中:營業(yè)收入(元)'] - t14.T[1:4].sum()
t14['主營利潤率'] = t14['主營利潤'] / t14['其中:營業(yè)收入(元)']
t14['主營利潤占營業(yè)利潤的比率'] = t14['主營利潤'] / t14['營業(yè)利潤(元)']
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% 以上,主業(yè)盈利能力很強(qiáng),近 3 年出現(xiàn)下降趨勢,不過仍保持在 23% 以上。
繪制主營利潤率與營業(yè)利潤的比率柱形圖:
plot_show(t14['主營利潤占營業(yè)利潤的比率'], title='主營利潤占營業(yè)利潤的比率',
ylabel='', y_format='p', kind='bar')

該公司主營利潤率與營業(yè)利潤的比例近 5 年維持在 87% 以上,利潤質(zhì)量非常高,很大一部分利潤都是由公司的主業(yè)創(chuàng)造的。
15、看凈利潤,了解公司的經(jīng)營成果及含金量,凈利潤主要看凈利潤含金量
注:過去 5 年的平均凈利潤現(xiàn)金比率小于 100% 的公司,淘汰掉。
計算凈利潤現(xiàn)金含量:
t15 = pd.DataFrame(index=cash_df.index,
columns=['經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額','凈利潤', '凈利潤現(xiàn)金比率'])
t15['凈利潤'] = benefit_df['五、凈利潤(元)']
t15['經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額'] = cash_df['經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額(元)']
t15['凈利潤現(xiàn)金比率'] = t15['經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額'] / t15['凈利潤']
t15_show = pd.concat([t15.T[:2].apply(format_thousandth), t15.T[2:].apply(format_percentage)])
t15_show

計算平均凈利潤現(xiàn)金含量:
>> print(f"{t15['凈利潤現(xiàn)金比率'].mean():.2%}")
119.16%
公司的凈利潤現(xiàn)金含量遠(yuǎn)大于 100% ,不僅賺到了利潤,也賺到了真金白銀。
16、看歸母凈利潤,了解公司的整體盈利能力及持續(xù)性
用歸母凈利潤和歸母股東權(quán)益可以計算出公司的凈資產(chǎn)收益率 ROE 。最優(yōu)秀公司的 ROE 一般會持續(xù)大于 20%,優(yōu)秀公司的 ROE 也會持續(xù)大于15%。
ROE小于15%的公司需要淘汰掉。另外歸母凈利潤增長率持續(xù)小于10%的公司也要淘汰掉。
歸母凈利潤增長率:大于 10%,說明公司在以較快的速度成長;小于 0,很可能意味公司已經(jīng)處于衰落之中。
ROE = 歸母凈利潤 / 歸母所有者權(quán)益合計:持續(xù)大于 20%,最優(yōu)秀的公司;持續(xù)大于 15%,優(yōu)秀的公司;小于 15%,淘汰。
計算歸母凈利潤的增速以及 ROE:
t16 = pd.DataFrame(index=benefit_df.index,
columns=['歸屬于母公司所有者的凈利潤', '歸屬于母公司所有者權(quán)益合計',
'凈資產(chǎn)收益率(ROE)', '歸屬于母公司所有者的凈利潤增長率'])
t16['歸屬于母公司所有者的凈利潤'] = benefit_df['歸屬于母公司所有者的凈利潤(元)']
t16['歸屬于母公司所有者權(quán)益合計'] = debt_df['歸屬于母公司所有者權(quán)益合計(元)']
t16['凈資產(chǎn)收益率(ROE)'] = t16['歸屬于母公司所有者的凈利潤'] / t16['歸屬于母公司所有者權(quán)益合計']
t16['歸屬于母公司所有者的凈利潤增長率'] = t16['歸屬于母公司所有者的凈利潤'].pct_change()
pd.concat([t16.T[:2].apply(format_thousandth), t16.T[2:].apply(format_percentage)])

繪制凈資產(chǎn)收益率 ROE 的柱形圖:
plot_show(t16['凈資產(chǎn)收益率(ROE)'], title='凈資產(chǎn)收益率(ROE)', ylabel='', kind='bar', y_format='p')

繪制歸母凈利潤增速的柱形圖:
plot_show(t16['歸屬于母公司所有者的凈利潤增長率'],
title='歸屬于母公司所有者的凈利潤增長率',
ylabel='',
kind='bar',
y_format='p')

該公司近 4 年的 ROE 在 17% 以上,最近 3 年在 20% 以上,自有資產(chǎn)獲益能力非常強(qiáng)。
歸母凈利潤的增速 2020 年只有 4.58% ,小于 10% ,異常。需要通過閱讀年報或者咨詢董秘來了解異常的原因。
17、看購買固定資產(chǎn)、無形資產(chǎn)和其他長期資產(chǎn)支付的現(xiàn)金,了解公司的增長潛力
購建固定資產(chǎn)、無形資產(chǎn)和其他長期資產(chǎn)支付的現(xiàn)金與經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額的比率位于 3%-60% 區(qū)間的公司增長潛力較大并且風(fēng)險相對較小。大于 100% 或持續(xù)小于 3% 需要淘汰掉,前者風(fēng)險較大,后者回報較低。
明天的增長來源于今天的投資。
計算購建支付的現(xiàn)金與經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額的比率:
t17 = pd.DataFrame(index=cash_df.index,
columns=['購建固定資產(chǎn)、無形資產(chǎn)和其他長期資產(chǎn)支付的現(xiàn)金',
'經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額',
'購建支付的現(xiàn)金與經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額的比率'
])
t17[['購建固定資產(chǎn)、無形資產(chǎn)和其他長期資產(chǎn)支付的現(xiàn)金', '經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額']] = \
cash_df[['購建固定資產(chǎn)、無形資產(chǎn)和其他長期資產(chǎn)支付的現(xiàn)金(元)','經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額(元)']]
t17['購建支付的現(xiàn)金與經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額的比率'] = \
t17['購建固定資產(chǎn)、無形資產(chǎn)和其他長期資產(chǎn)支付的現(xiàn)金'] / t17['經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額']
pd.concat([t17.T[:2].apply(format_thousandth), t17.T[2:].apply(format_percentage)])

繪圖:
plot_show(t17['購建支付的現(xiàn)金與經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額的比率'],
title='購建支付的現(xiàn)金與經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額的比率',
ylabel='', y_format='p', kind='bar')

18、看分配股利、利潤或償付利息支付的現(xiàn)金,了解公司的現(xiàn)金分紅情況
分配股利、利潤或償付利息支付的現(xiàn)金與經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額的比率最好在 20%-70% 之間,比率小于 20% 不夠厚道,大于 70% 難以持續(xù)。
- 比率低于 20%,公司要么能力有問題,要么品質(zhì)有問題。如果主要是償付利息的金額,那分紅的錢就更少了。
- 合理比率為 20%-70%,分紅的長期可持續(xù)性較強(qiáng)。
- 比率高于70%,分紅比例很難長期持續(xù)。
計算分配股利、利潤或償付利息支付的現(xiàn)金與經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額的比率:
t18 = pd.DataFrame(index=cash_df.index,
columns=['分配股利、利潤或償付利息支付的現(xiàn)金','經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額',
'分配股利、利潤或償付利息支付的現(xiàn)金/經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額'])
t18[['分配股利、利潤或償付利息支付的現(xiàn)金','經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額']] = \
cash_df[['分配股利、利潤或償付利息支付的現(xiàn)金(元)','經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額(元)']]
t18['分配股利、利潤或償付利息支付的現(xiàn)金/經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額'] = \
t18['分配股利、利潤或償付利息支付的現(xiàn)金'] / t18['經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額']
pd.concat([t18.T[:2].apply(format_thousandth), t18.T[2:].apply(format_percentage)])

繪圖:
plot_show(t18['分配股利、利潤或償付利息支付的現(xiàn)金/經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額'],
title='分配股利、利潤或償付利息支付的現(xiàn)金/經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額',
ylabel='',
y_format='p',
kind='bar')

以上就是關(guān)于利潤表和現(xiàn)金流量表的分析了,兩個表加起來一共也是九步,再加上上一篇文章中資產(chǎn)負(fù)債表的九步,三大財務(wù)報表一共是 18 步。通過十八步法分析財報,可以幫助我們識別財報造假,分析好公司。
附
除了十八步法,我們也可以分析一下經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額、投資活動產(chǎn)生的現(xiàn)金流量凈額以及籌資活動產(chǎn)生的現(xiàn)金流量凈額。
plot_show(cash_df[['經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額(元)',
'投資活動產(chǎn)生的現(xiàn)金流量凈額(元)',
'籌資活動產(chǎn)生的現(xiàn)金流量凈額(元)']],
title='三大現(xiàn)金流量凈額')

我們主要看凈額的正負(fù)情況,投資中更傾向于【正負(fù)負(fù)】和【正正負(fù)】類型的企業(yè),也就是經(jīng)營活動產(chǎn)生的現(xiàn)金流強(qiáng)大,并且大量分紅。