财报分析实战:3个Python脚本自动计算ROE、毛利率等10项核心财务比率

在量化投资和企业财务分析领域,能够快速准确地计算关键财务指标是做出明智决策的基础。传统手动计算不仅效率低下,还容易出错,而Python的自动化处理能力可以彻底改变这一局面。本文将提供三个即插即用的Python脚本,帮助开发者一键生成10个最具价值的财务比率,涵盖盈利能力、偿债能力和运营效率三大维度。

1. 环境准备与数据获取

在开始编写财务指标计算脚本前,需要确保Python环境已安装必要的库。推荐使用Anaconda创建独立环境:

conda create -n financial_analysis python=3.8
conda activate financial_analysis
pip install pandas numpy yfinance requests

对于上市公司财务数据获取,我们有两种主流方式:

方式一:使用Yahoo Finance API获取实时数据

import yfinance as yf

def get_financial_data(ticker):
    company = yf.Ticker(ticker)
    # 获取资产负债表
    balance_sheet = company.balance_sheet
    # 获取利润表
    income_statement = company.income_stmt
    # 获取现金流量表
    cash_flow = company.cashflow
    return balance_sheet, income_statement, cash_flow

方式二:从本地Excel导入历史数据

import pandas as pd

def import_from_excel(file_path):
    balance_sheet = pd.read_excel(file_path, sheet_name='BalanceSheet')
    income_statement = pd.read_excel(file_path, sheet_name='IncomeStatement')
    cash_flow = pd.read_excel(file_path, sheet_name='CashFlow')
    return balance_sheet, income_statement, cash_flow

提示:对于A股上市公司,可以使用Tushare或AKShare等专门针对中国市场的金融数据接口

2. 盈利能力指标计算脚本

盈利能力是评估公司价值的关键维度。以下脚本可自动计算ROE、毛利率、净利率和核心利润贡献度四大指标:

def calculate_profitability_ratios(income_stmt, balance_sheet):
    """
    计算盈利能力指标
    :param income_stmt: 利润表DataFrame
    :param balance_sheet: 资产负债表DataFrame
    :return: 包含盈利能力指标的字典
    """
    ratios = {}
    
    # 获取必要数据
    net_income = income_stmt.loc['Net Income']
    total_revenue = income_stmt.loc['Total Revenue']
    cost_of_revenue = income_stmt.loc['Cost of Revenue']
    operating_income = income_stmt.loc['Operating Income']
    shareholders_equity = balance_sheet.loc['Total Stockholder Equity']
    
    # 计算ROE(净资产收益率)
    ratios['ROE'] = net_income / shareholders_equity
    
    # 计算毛利率
    gross_profit = total_revenue - cost_of_revenue
    ratios['Gross Margin'] = gross_profit / total_revenue
    
    # 计算净利率
    ratios['Net Margin'] = net_income / total_revenue
    
    # 计算核心利润贡献度
    ratios['Core Profit Ratio'] = operating_income / net_income
    
    return ratios

关键指标解释:

指标名称 计算公式 健康范围 分析意义
ROE 净利润/股东权益 15%-20%+ 衡量股东投资回报率
毛利率 (营收-成本)/营收 行业相关 反映产品/服务直接盈利能力
净利率 净利润/营收 行业相关 综合盈利能力指标
核心利润贡献度 营业利润/净利润 >70% 判断盈利质量

注意:不同行业的合理指标范围差异很大,科技公司通常有更高的毛利率,而零售业则较低

3. 偿债能力指标计算脚本

偿债能力分析对评估公司财务健康至关重要。以下脚本计算流动比率、速动比率、资产负债率和利息保障倍数:

def calculate_liquidity_ratios(balance_sheet, income_stmt):
    """
    计算偿债能力指标
    :param balance_sheet: 资产负债表DataFrame
    :param income_stmt: 利润表DataFrame
    :return: 包含偿债能力指标的字典
    """
    ratios = {}
    
    # 获取必要数据
    current_assets = balance_sheet.loc['Total Current Assets']
    current_liabilities = balance_sheet.loc['Total Current Liabilities']
    inventory = balance_sheet.loc['Inventory']
    total_assets = balance_sheet.loc['Total Assets']
    total_liabilities = balance_sheet.loc['Total Liabilities']
    ebit = income_stmt.loc['EBIT']
    interest_expense = income_stmt.loc['Interest Expense']
    
    # 计算流动比率
    ratios['Current Ratio'] = current_assets / current_liabilities
    
    # 计算速动比率(酸性测试比率)
    quick_assets = current_assets - inventory
    ratios['Quick Ratio'] = quick_assets / current_liabilities
    
    # 计算资产负债率
    ratios['Debt to Asset Ratio'] = total_liabilities / total_assets
    
    # 计算利息保障倍数
    ratios['Interest Coverage'] = ebit / interest_expense
    
    return ratios

偿债能力指标应用场景:

  • 短期债权人 最关注流动比率和速动比率
  • 长期投资者 更看重资产负债率和利息保障倍数
  • 行业对比 时要注意不同行业的资本结构差异

典型问题处理:

# 处理利息支出为零的情况
if interest_expense == 0:
    ratios['Interest Coverage'] = float('inf')  # 设为无穷大

4. 运营效率指标计算脚本

运营效率指标反映公司管理资产的效能。以下脚本计算应收账款周转率、存货周转率和总资产周转率:

def calculate_efficiency_ratios(income_stmt, balance_sheet):
    """
    计算运营效率指标
    :param income_stmt: 利润表DataFrame
    :param balance_sheet: 资产负债表DataFrame
    :return: 包含运营效率指标的字典
    """
    ratios = {}
    
    # 获取必要数据
    total_revenue = income_stmt.loc['Total Revenue']
    accounts_receivable = balance_sheet.loc['Accounts Receivable']
    inventory = balance_sheet.loc['Inventory']
    total_assets = balance_sheet.loc['Total Assets']
    
    # 计算应收账款周转率
    ratios['Receivables Turnover'] = total_revenue / accounts_receivable
    
    # 计算存货周转率
    ratios['Inventory Turnover'] = total_revenue / inventory
    
    # 计算总资产周转率
    ratios['Asset Turnover'] = total_revenue / total_assets
    
    return ratios

周转率指标的行业差异:

行业 应收账款周转率 存货周转率 总资产周转率
零售 高(50+) 高(10+) 中(1.5-3)
制造 中(8-12) 中(6-8) 低(0.5-1)
科技 高(20+) 无/低 中(0.7-1.5)

5. 综合应用与可视化

将三个脚本整合并添加可视化功能:

import matplotlib.pyplot as plt

def analyze_company(ticker):
    # 获取数据
    balance_sheet, income_stmt, cash_flow = get_financial_data(ticker)
    
    # 计算各类指标
    profit_ratios = calculate_profitability_ratios(income_stmt, balance_sheet)
    liquidity_ratios = calculate_liquidity_ratios(balance_sheet, income_stmt)
    efficiency_ratios = calculate_efficiency_ratios(income_stmt, balance_sheet)
    
    # 合并所有指标
    all_ratios = {**profit_ratios, **liquidity_ratios, **efficiency_ratios}
    
    # 可视化展示
    plt.figure(figsize=(12, 6))
    pd.Series(all_ratios).plot(kind='bar')
    plt.title(f'{ticker} Financial Ratios')
    plt.ylabel('Ratio Value')
    plt.xticks(rotation=45)
    plt.tight_layout()
    plt.show()
    
    return all_ratios

实际项目中,我们还需要考虑:

  • 多期数据对比分析
  • 同行业公司对标
  • 异常值检测与处理
  • 自动化报告生成
# 多期数据分析示例
def multi_period_analysis(ticker, years=5):
    ratios_history = []
    for year in range(2023-years, 2023):
        # 获取历史数据(需要相应API支持)
        data = get_historical_data(ticker, year)
        ratios = analyze_company(data)
        ratios_history.append(ratios)
    
    # 转换为DataFrame便于分析
    return pd.DataFrame(ratios_history)

更多推荐