各位同学,欢迎来到新的一章。
今天,我们将学习企业财务分析的基石——财务比率分析。
这是一种将复杂财报数据转化为深刻商业洞见的技术。
财务报表充满了数字,但数字本身不会说话。
财务比率,就是回答这些问题的标准化工具。
在本章结束时,你将能够:
pandas
自动化计算这些比率。我们将使用业界标准的工具来完成分析。
tushare
: 一个强大的财经数据接口,用于获取真实的财务报表数据。pandas
: Python数据分析的核心库,用于数据处理、计算和操作。matplotlib
: (稍后会用到) 用于数据可视化,将比率转化为直观的图表。在开始之前,请确保你已经安装了必要的库,并拥有一个tushare
的API token。
盈利能力是企业的生命线,是所有分析的起点。
它回答了最根本的问题:这家公司赚钱的能力有多强?
我们将学习四个关键的盈利能力指标。
我们将依次剖析四个层层递进的指标,它们从不同角度揭示了公司的盈利’成色’。
毛利率揭示了企业产品或服务的直接盈利能力。
它是衡量企业’卖东西’这门生意的基础利润空间。
毛利率代表销售收入中,扣除与产品直接相关的成本(营业成本)后,剩余部分占总收入的百分比。
\[ \large{ \text{毛利率} = \frac{\text{营业收入} - \text{营业成本}}{\text{营业收入}} } \]
核心内涵:公司的定价权和成本控制能力。
我们可以用pandas
轻松地从财务数据DataFrame
中计算。
关键代码:
请注意: 在Tushare获取的财报中,字段名为减:营业成本
,这与财报原文保持一致。
毛利没有考虑日常运营费用。营业利润率更进一步,衡量主营业务的综合盈利水平。
它回答了:公司在支付了所有运营相关成本后,还剩多少利润?
营业利润率是指企业的营业利润占营业收入的百分比。
\[ \large{ \text{营业利润率} = \frac{\text{营业利润}}{\text{营业收入}} } \]
它比毛利率更全面地反映了企业的经营效率和费用控制能力。
营业利润是在毛利的基础上,进一步考虑了期间费用。
计算非常直接,只需用’营业利润’列除以’营业收入’列。
关键代码:
净利润率是衡量企业最终盈利能力的’终极指标’。
它告诉我们,在扣除所有成本、费用和所得税后,每一元销售收入最终能为公司带来多少净利润。
净利润率是指企业实现的净利润与营业收入的对比关系。
\[ \large{ \text{净利润率} = \frac{\text{净利润}}{\text{营业收入}} } \]
它是评估企业整体盈利能力和经营管理水平的最终体现。
Tushare接口返回的字段名为 n_income
(净利润) 和 revenue
(营业收入)。
关键代码:
前面的指标都从’收入’角度衡量。ROE则从股东投入资本的角度来衡量公司为股东赚钱的能力。
它回答了一个核心问题:‘股东每投入一块钱,公司能为他们赚回多少钱?’
ROE衡量的是公司运用股东投入的资本(净资产)所产生的净利润回报。
\[ \large{ \text{ROE} = \frac{\text{归属于母公司所有者的净利润}}{\text{平均归属于母公司所有者的净资产}} } \]
ROE是连接利润表和资产负债表的桥梁,深受投资者青睐。
为了更准确地反映’期间’的盈利能力,分母通常使用期初和期末净资产的平均值。
\[ \large{ \text{平均净资产} = \frac{\text{期初净资产} + \text{期末净资产}}{2} } \]
这可以消除因年中增发新股或回购等资本变动对指标的扭曲。
计算ROE时,需要用到当期和上一期的股东权益数据。
关键代码:
现在,我们将理论付诸实践,计算贵州茅台(600519.SH)2019-2023年的盈利指标。
我们将合并利润表和资产负债表,并计算所有四个指标。
下面的代码展示了从读取数据到计算毛利率和营业利润率的全过程。
核心计算逻辑展示:
# 导入库并连接API
import pandas as pd
import tushare as ts
pro = ts.pro_api('你的token')
# 读取并合并报表 (此处省略读取过程)
# data = pd.merge(...)
# 计算毛利率
data['毛利率'] = round((data['营业收入']-data['减:营业成本'])/data['营业收入'],4)
print(data[['报告期','毛利率']])
# 计算营业利润率
data['营业利润率'] = round((data['营业利润'])/data['营业收入'],4)
print(data[['报告期','营业利润率']])
接着,我们计算净利润率和ROE。计算ROE需要获取2018年的股东权益作为2019年的期初值。
核心计算逻辑展示:
# 计算净利润率
data['净利润率'] = round(data['净利润(含少数股东损益)']/data['营业收入'],4)
print(data[['报告期','净利润率']])
# 获取2018年的净资产数据 (注意原文中的错误)
# 正确应为 period='20181231'
df_2018 = pro.balancesheet(ts_code='600519.SH',period='20181231')
# ... 构造'股东权益(上期余额)'列 (此处省略) ...
# 计算ROE
data['ROE'] = round(data['净利润(不含少数股东损益)']/((data['股东权益合计(不含少数股东权益)']+data['股东权益(上期余额)'])/2),4)
print(data[['报告期','ROE']])
我们学习了四个衡量盈利能力的关键指标。
指标 | 核心问题 | 视角 |
---|---|---|
毛利率 | 产品的直接利润空间有多大? | 产品层面 |
营业利润率 | 主营业务的综合赚钱能力如何? | 公司运营层面 |
净利润率 | 最终能留下多少利润? | 整体经营层面 |
ROE | 为股东创造回报的效率有多高? | 股东资本层面 |
运营能力衡量企业利用其资产创造销售收入的效率。
光有高利润率不够,如果资产周转缓慢(钱都压在库存里),整体资本回报率依然会很低。
它回答:公司’转动’资产的速度有多快?
我们将关注三个核心的运营效率指标。
存货周转率反映了企业存货管理的效率。
周转越快,存货从入库到售出的时间越短,资金占用越少。
该比率衡量企业在一年内存货周转的次数。
\[ \large{ \text{存货周转率} = \frac{\text{营业成本}}{\text{平均存货余额}} } \]
分母同样采用期初与期末的平均值。
存货周转率必须在同行业内比较才有意义。
计算需要用到当期和上一期的存货数据。
关键代码:
这是一个更宏观的效率指标,衡量企业利用全部资产产生销售收入的能力。
它回答:每一元的资产,能创造多少元的销售额?
该比率是企业的营业收入与平均总资产之比。
\[ \large{ \text{总资产周转率} = \frac{\text{营业收入}}{\text{平均总资产}} } \]
比率越高,说明公司的资产利用效率越高。
资产周转率也高度依赖于行业模式。
计算需要用到当期和上一期的资产总计数据。
关键代码:
应收账款周转率衡量企业收回账款的速度。
比率过低,可能意味着公司信用政策宽松,或客户回款不力,有坏账风险。
该比率是企业的营业收入与平均应收账款余额之比。
\[ \large{ \text{应收账款周转率} = \frac{\text{营业收入}}{\text{平均应收账款}} } \]
对于像贵州茅台这样产品供不应求的公司,往往’先款后货’,应收账款极少,周转率会非常高。
计算需要用到当期和上一期的应收账款数据。
关键代码:
我们为贵州茅台计算存货周转率和总资产周转率,并为五粮液计算应收账款周转率。
这展示了不同指标在不同公司背景下的应用。
下面的代码展示了计算过程,包括为获取期初数据而连接API。
核心计算逻辑展示:
# (为茅台) 准备上期存货和总资产数据...
data['存货周转率'] = round(data['减:营业成本']/((data['存货']+data['存货(上期余额)'])/2),4)
data['总资产周转率'] = round(data['营业收入']/((data['资产总计']+data['资产总计(上期余额)'])/2),4)
# (为五粮液) 读取数据...
# (为五粮液) 准备上期应收账款数据 (注意原文错误)
# 正确应为 ts_code='000858.SZ'
df_2018 = pro.balancesheet(ts_code='000858.SZ', period='20181231')
# ...
data_wly['应收账款周转率'] = round(data_wly['营业收入']/((data_wly['应收账款']+data_wly['应收账款(上期余额)'])/2),4)
偿债能力是衡量企业财务安全性的关键。它分为:
我们将学习三个经典的偿债能力指标。
流动比率是衡量短期偿债能力最常用的指标。
它表明企业每一元的流动负债,有多少元的流动资产作为偿还保障。
该比率是企业的流动资产与流动负债之比。
\[ \large{ \text{流动比率} = \frac{\text{流动资产总额}}{\text{流动负债总额}} } \]
传统经验认为,流动比率在2左右较为安全,但这也因行业而异。
计算非常简单,只需两列相除。
关键代码:
流动资产中,存货的变现能力相对较差。速动比率剔除了存货,能更严格地评估企业的短期偿债能力。
这个比率也被称为’酸性测试比率’ (Acid-Test Ratio)。
该比率是企业速动资产与流动负债之比。
\[ \large{ \text{速动比率} = \frac{\text{流动资产总额} - \text{存货} - \text{预付款项}}{\text{流动负债总额}} } \]
一般认为速动比率大于1,企业的短期偿债风险较低。
计算时从流动资产中减去存货和预付款项。
关键代码:
这是衡量企业长期偿债能力的重要指标。
它反映了企业经营利润偿付银行贷款等债务利息的能力。
该比率是企业息税前利润(EBIT)与利息费用之比。
\[ \large{ \text{利息保障倍数} = \frac{\text{息税前利润 (EBIT)}}{\text{利息费用}} } \]
这个倍数越高,说明企业偿付利息的能力越强,财务风险越小。
计算需要用到’息税前利润’和’减:利息支出’字段。
关键代码:
我们以贵州茅台为例,计算其2019-2023年期间的三个偿债能力指标。
核心计算逻辑展示:
# 假设 data 已合并好三张报表
# 计算流动比率
data['流动比率'] = round(data['流动资产合计']/data['流动负债合计'],4)
print(data[['报告期','流动比率']])
# 计算速动比率
data['速动比率'] = round((data['流动资产合计']-data['存货']-data['预付款项'])/data['流动负债合计'],4)
print(data[['报告期','速动比率']])
# 计算利息保障倍数
data['利息保障倍数'] = round(data['息税前利润']/data['减:利息支出'],4)
print(data[['报告期','利息保障倍数']])
成长能力是评价企业未来发展潜力的关键。
成长性指标通常是同比指标,即与上一年同期的数据进行比较,衡量扩张的速度。
它回答:公司业务规模和盈利水平的扩张速度有多快?
我们将分析三个核心的成长性指标,它们与盈利能力的三个核心指标一一对应。
营业收入增长率直观地反映了公司市场扩张的速度。
它是所有增长的源头,常被称为’Top-line growth’。
该比率是指企业本年营业收入增加额与上年营业收入总额的比率。
\[ \large{ \text{营收增长率} = \frac{\text{本年营收} - \text{上年营收}}{\text{上年营收}} } \]
计算需要用到当期和上一期的营业收入数据。
关键代码:
营业利润的增长不仅要看收入的扩张,还要看成本费用的控制。
这是衡量成长’质量’的重要指标。
该比率是企业本年营业利润增长额与上年营业利润总额的比率。
\[ \large{ \text{营业利润增长率} = \frac{\text{本年营业利润} - \text{上年营业利润}}{\text{上年营业利润}} } \]
如果利润增长率 > 收入增长率,通常说明公司的盈利能力在增强。
计算需要用到当期和上一期的营业利润数据。
关键代码:
净利润增长率是衡量企业最终盈利成果增长速度的指标。
它反映了为股东创造的价值(每股收益EPS)的增长情况,常被称为’Bottom-line growth’。
该比率反映企业本期净利润增加额与上期净利润总额的比率。
\[ \large{ \text{净利润增长率} = \frac{\text{本期净利润} - \text{上期净利润}}{\text{上期净利润}} } \]
计算需要用到当期和上一期的净利润数据。
关键代码:
我们继续以贵州茅台为例,计算其2019-2023年期间的三个成长能力指标。
核心计算逻辑展示:
# 获取2018年的收入、营业利润、净利润数据... (此处省略)
# 构造'上期余额'列...
# 计算营业收入增长率
data['营业收入增长率'] = round((data['营业收入']-data['营业收入(上期余额)'])/data['营业收入(上期余额)'],4)
# 计算营业利润增长率 (注意原文笔误 df_2014)
data['营业利润增长率'] = round((data['营业利润']-data['营业利润(上期余额)'])/data['营业利润(上期余额)'],4)
# 计算净利润增长率
data['净利润增长率'] = round((data['净利润']-data['净利润(上期余额)'])/data['净利润(上期余额)'],4)
我们的目标是编写一个Python脚本,实现从数据获取到最终报表生成的全自动化流程。
我们将整个过程设计成一个清晰的流水线。
access_data
为了代码的复用性,我们首先定义一个函数,专门用于获取并保存指定公司的三张报表。
核心逻辑:
获取数据后,我们将三张报表合并,并使用一个非常巧妙的技巧来创建’上期余额’列。
关键代码:
shift(-1)
的妙用data[column].shift(-1)
会将 column
列的数据向上移动一行。
这使得当前行的’上期余额’正好等于下一行的’当期余额’,完美地为我们准备好了计算同比和平均值所需的数据。
报告期 | 营业收入 | 营业收入(上期) |
---|---|---|
2023 | 1505 | 1275 |
2022 | 1275 | 1094 |
2021 | 1094 | … |
准备好数据后,我们就可以像之前一样,一行一行地计算所有13个指标。
最后,整理格式并使用pd.ExcelWriter
以追加模式(mode='a'
)写入新的sheet。
关键代码:
脚本运行结束后,我们会得到一个更新后的Excel文件,其中包含一个新的’财务比率表’sheet。
这张表清晰地展示了公司过去几年在四大维度上的财务表现,为进一步的分析和可视化打下了坚实基础。
背景:贵州茅台、五粮液、泸州老窖是中国高端白酒市场的三巨头。对它们进行横向对比,能帮我们理解各家的竞争优势和行业格局。
目标:将上一节的脚本函数化,实现对’茅五泸’三家公司财务比率的批量生成与存储。
编程中有一个重要原则:DRY (Don’t Repeat Yourself)。
我们将上一节的核心逻辑封装进一个函数 ratio_sheet(comp)
,然后通过一个简单的循环,批量调用这个函数,为每家公司生成分析报告。
ratio_sheet
函数我们把从’读取Excel’到’保存比率表’的全部代码,都放进一个名为 ratio_sheet
的函数里。这个函数只接收一个参数:公司名称 comp
。
函数骨架:
定义好函数后,我们就可以用一个 for
循环来自动化处理所有公司。
主程序逻辑:
# 批量需要获取数据的公司名称、股票代码、年份
comps = ['贵州茅台','五粮液','泸州老窖']
codes = ['600519.SH','000858.SZ','000568.SZ']
years = [2023,2022,2021,2020,2019,2018]
# 第一步:批量获取并保存原始报表
access_data(comps, codes, years)
# 第二步:批量生成比率分析表
for comp in comps:
print(comp)
ratio_sheet(comp) # 调用核心函数
print("-----------------------------------")
当代码运行结束后,我们将得到三个独立的Excel文件,每个文件都包含了对应公司的原始报表和我们生成的财务比率表。
下一步是什么?
有了这些标准化的数据,我们就可以进行更深入的可视化对比分析,例如绘制’茅五泸’的ROE、毛利率等关键指标的历年走势对比图。这将是我们下一章的主题。
今天,我们系统地学习了财务比率分析的理论与实践。
pandas
自动化处理财务数据的全过程。有问题吗?
商业大数据分析与应用