结构化分析

76 阅读12分钟

技能:Excel、Power BI、Python 基础 📈练习:分析 3 家你熟悉的上市公司(行业逻辑 + 财报结构)

ChatGPT said:

Thought for 7s

好 — 我来给你做一个可直接上手的练习计划与示例分析,适合你当前的技能组合(Excel、Power BI、Python 基础)。我选 三家公司Apple (科技硬件与服务)农夫山泉(消费饮料)Toyota / 丰田(汽车制造) 。每家公司会给出:

  • 行业逻辑(能驱动业绩的核心因素)
  • 财报结构要点(在哪份报表看什么、关键科目)
  • 必做的 KPI / 比率(Excel 可直接算)
  • 在 Power BI 的可视化想法
  • 用 Python 的快速分析脚本样例(pandas)
  • 练习任务(可复制到课程或作业里)

我会把步骤写成可复制执行的清单 —— 你可以用 Excel 做数据抓取/建表、用 Power BI 做展示、用 Python 做自动化计算与图表。

1) Apple — 行业逻辑 + 财务重点

行业逻辑(核心驱动)

  • iPhone/硬件销量周期、替换周期与新品发布窗口。
  • Services(App Store、订阅、iCloud)带来高毛利、粘性收入与较长期增长。
  • 汇率、供应链(芯片/零部件)与库存管理影响短期利润。
  • 回购与分红对每股指标影响显著。

财报结构要看

  • 损益表(Revenue 按产品/服务分项、毛利率、Operating income、R&D 与 SG&A)
  • 资产负债表(库存、应收、现金与短期投资、长期债务)
  • 现金流量表(经营现金流、资本支出、回购与分红)

关键 KPI / 比率(Excel 公式)

  • 毛利率 = Gross Profit / Revenue
  • 营业利润率 = Operating Income / Revenue
  • 自由现金流 = Operating Cash Flow - Capital Expenditure
  • EPS = Net Income / Weighted Avg Shares(关注回购导致的摊薄/稀释变化)
  • 营收同比增长、服务营收占比(Services / Total Revenue)
  • 现金与短期投资 / 流动负债(短期偿债能力)

Power BI Dashboard 建议

  • 时间序列:总营收、分产品营收(硬件 vs 服务)、毛利率
  • 饼图/条形:收入构成(Services vs Hardware)
  • 指标卡:TTM 自由现金流、TTM EPS、净债务
  • 交互切片器:按地区(美洲、欧洲、亚太)或按季度筛选

Python 快速脚本(pandas 样例)

import pandas as pd

# 假设你已把年/季报表导成 CSV: income.csv, bs.csv, cf.csv
inc = pd.read_csv('income.csv', parse_dates=['date']).set_index('date')
bs = pd.read_csv('bs.csv', parse_dates=['date']).set_index('date')
cf = pd.read_csv('cf.csv', parse_dates=['date']).set_index('date')

inc['gross_margin'] = inc['gross_profit'] / inc['revenue']
inc['op_margin'] = inc['operating_income'] / inc['revenue']
cf['free_cash_flow'] = cf['operating_cash_flow'] - cf['capex']

print(inc[['revenue','gross_margin','op_margin']].tail())
print(cf['free_cash_flow'].tail())

练习任务(示例)

  • 在 Excel 中按季度抓取过去 8 季度的分项营收,绘制“硬件 vs 服务”趋势。
  • 用 Python 计算过去 12 个月(TTM)自由现金流并画图。
  • 用 Power BI 做一个包含 KPI 卡与营收构成的交互仪表盘。

2) 农夫山泉(消费快消:瓶装水、茶饮料等)

行业逻辑(核心驱动)

  • 渠道覆盖(商超、便利店、电商)与 SKU 管理决定销量与毛利。
  • 低端/高端产品线的价格弹性与促销策略(节假日、季节性)。
  • 原材料(包装、塑料、运输)与物流成本对毛利影响大。
  • 品牌力与渠道谈判能力决定终端毛利与上游议价权。

财报结构要看

  • 损益表(营收分渠道/分产品的增长、毛利率、促销费用)
  • 资产负债表(应收/应付、存货周转)
  • 现金流(经营现金流,因行业常需大量营运资金)

关键 KPI / 比率

  • 毛利率、营业利润率
  • 存货周转 = 销售成本 / 平均存货(天数:365 / 周转率)
  • 应收账款周转、应付账款周转(关注营运资金需求)
  • 单位渠道毛利(若数据可得)
  • 营销费用占比(销售与分销费用 / 营收)

Power BI Dashboard 建议

  • 渠道趋势图(商超/电商/便利店按月营收)
  • 季节性热力图(按月份显示销量/营收)
  • 存货与应收应付的时间序列与周转率卡片

Excel 小技巧(实用公式)

  • 季度同比:=(ThisQuarter - SameQuarterLastYear)/ABS(SameQuarterLastYear)
  • 存货天数 = 平均存货 / 销售成本 * 365
  • 季度滚动 TTM = SUM(last 4 quarters)

Python 示例(计算周转)

bs = pd.read_csv('bs.csv', parse_dates=['date']).set_index('date')
inc = pd.read_csv('income.csv', parse_dates=['date']).set_index('date')

# 假设 income.csv 有 'cogs'(销售成本)
avg_inventory = (bs['inventory'] + bs['inventory'].shift(1)) / 2
inventory_turn = inc['cogs'] / avg_inventory
days_inventory = 365 / inventory_turn

print(days_inventory.tail())

练习任务(示例)

  • 在 Excel 中计算过去 8 个季度的存货天数、应收账款天数、现金转换周期(CCC),并解释变化(增长/缩短说明什么)。
  • 用 Power BI 制作“渠道 + 季节性”分析页,找出淡旺季与促销月份的影响。
  • 用 Python 自动计算周转率并导出 CSV 给 BI 使用。

3) Toyota / 丰田(汽车制造)

行业逻辑(核心驱动)

  • 车型更新周期、产能利用率(厂线开工率)、供应链(半导体)影响出货量。
  • 新能源/混合动力/电动车战略会改变长期 CAPEX 与毛利结构。
  • 全球市场(日本、北美、欧洲、中国)表现差异显著,汇率影响大。
  • 金融业务(汽车金融)是重要的盈利补充。

财报结构要看

  • 损益表(汽车销售额、金融服务收入、制造利润)
  • 资产负债表(长期借款、固定资产、应收/应付)
  • 现金流(CAPEX 高度敏感,融资活动反映负债结构)

关键 KPI / 比率

  • EBIT margin、营业利润率
  • 产量/销量(units shipped)与单车平均售价(ASP)
  • 固定资产周转、ROIC(投入资本回报率)
  • 资本支出 / 营收(表征成长性投入)
  • 经营现金流覆盖 CAPEX 比率

Power BI Dashboard 建议

  • 单位销量 + ASP 双轴图(销量和平均售价)
  • 地区分布:不同市场的销量与毛利贡献
  • 资本性支出时间序列与CAPEX/Revenue比

Python 示例(ROIC)

inc = pd.read_csv('income.csv', parse_dates=['date']).set_index('date')
bs = pd.read_csv('bs.csv', parse_dates=['date']).set_index('date')

nopat = inc['operating_income'] * (1 - 0.25)  # 简化税率 25%
avg_capital = (bs['total_assets'] - bs['current_liabilities'] + bs['debt'])/2
roic = nopat / avg_capital
print(roic.tail())

练习任务(示例)

  • 在 Excel 中准备“销量—ASP—营收”三表联动,解释单季度营收变动是来自销量变化还是 ASP 变化(用拆分法)。
  • 在 Power BI 建立地区比较视图,添加汇率切片器(若你能拿到汇率数据)。
  • 用 Python 计算 ROIC、CAPEX/R, 并判断公司是否处于扩张期。

通用工作流程(适用于所有三家公司)

  1. 数据来源(建议)

    • 公司年报 / 季报(原文 PDF),或用财经网站导出的历史财报 CSV(Excel 可直接导入)。
    • 市场数据(销量、行业报告)可作为补充。
  2. Excel 操作流程

    • 将三张报表(损益、资产负债、现金流)按同一时间轴(季度/年度)整理成表格。
    • 新增计算列:同比、环比、TTM、关键比率。
    • 制作数据透视表与图表(趋势图、堆叠条形、饼图)。
  3. Power BI

    • 把 Excel 或 CSV 导入,建模型(关系通常以 date 字段连结)。
    • 建 KPI 卡、时间序列、下钻(drill-through)到分产品或分地区明细。
    • 加入注释层(书签)解释异常季度(例如一次性收入/资产减值/回购)。
  4. Python(自动化/重复任务)

    • 用 pandas 读取原始 CSV,写函数计算常用比率,输出到新 CSV / Excel。
    • 封装成 notebook:把数据清洗→计算→画图(matplotlib)步骤写成可复用脚本。
  5. 报告与结论

    • 每家公司写 1–2 页结论:行业趋势、公司优势/风险、三张表给出的现金生成能力结论、短中长期投资判断(练习目的不是投资建议,而是练习财务解读)。

小型作业(把学到的东西串起来)

  • 任务 A(Excel):选一家公司,完成 8 季度的“营收构成 + 毛利率 + 存货天数”并写 300 字结论(图片 + 表格)。
  • 任务 B(Power BI):把三家公司放在同一个 Power BI 报表里,做对比页(营收同比、毛利率、自由现金流)。
  • 任务 C(Python):写一个小脚本,给出三家公司过去 4 个季度的 TTM EPS、TTM FCF,输出 CSV 与图表。

如果你愿意,我可以现在做其中一项的示例实现

  • 直接给你:①Excel 模板(表格结构与公式)、②Power BI 报表设计步骤(字段/度量/可视化布局)、③完整的 Python notebook(pandas 脚本 + 绘图代码)。

告诉我你想先要哪一个(Excel 模板 / Power BI 报表设计 / Python notebook),我这就把对应的示例内容给你(带可复制的公式/代码/步骤)。

You said:

我有十年的编程经验

ChatGPT said:

Updated saved memory

明白了 👍 那我后续给你的内容可以更偏向分析逻辑和建模实现,不再避开技术细节(例如 Python 自动化数据抓取、Power BI DAX 指标公式、或用 Pandas/Numpy 计算财务比率等)。

你希望我接下来从哪部分开始?

  • 🧾 Excel 财务分析模板(结构 + KPI)
  • 📊 Power BI 可视化设计(含 DAX 公式)
  • 🐍 Python 数据抓取与分析脚本(含 yfinance 或财报爬取)
You said:

我有十年的编程经验 对应上面的这种分析,有没有更合适我的方法

ChatGPT said:

非常好的问题。你有 10 年编程经验,那么就不该停留在「手动 Excel → Power BI 可视化」的层面,而是可以进入 “数据驱动 + 可重复 + 可扩展的企业级分析” 模式。

我来帮你升级版本 👇 我们把刚才那种“三家公司财务分析”练习,提升为一个 可编程财务分析框架(适合程序员思维)。

🚀 面向程序员的财报分析方法论

目标不是“做图表”,而是:

构建一个可自动更新、可比较多公司、能做行业逻辑建模的分析系统。


一、总体思路:从「表格分析」→「可复现分析管线」

阶段普通分析者程序员版分析者
数据来源手动下载财报 CSV用 API / 爬虫(yfinance、SEC、同花顺等)自动抓取
数据处理Excel 手工计算Pandas / Polars 做 ETL 与指标计算
可视化Power BI 拖拽Streamlit / Dash / Power BI API 自动生成
报告PPTJupyter Notebook / Markdown + 报告生成器
分析逻辑静态公式可复用函数 + 参数化模型(行业模板)

二、分析框架结构(推荐目录)

financial-analysis/
├── data/
│   ├── raw/           # 原始报表数据(API 拉取或爬取)
│   ├── processed/     # 清洗后的财务数据
│   └── metadata/      # 公司、行业分类、币种映射等
├── src/
│   ├── fetch.py       # 自动抓取财报数据(yfinance、tushare、EDGAR)
│   ├── transform.py   # 数据清洗 + 财务指标计算
│   ├── visualize.py   # 可视化(matplotlib / plotly)
│   ├── report.py      # 自动生成分析报告(HTML / PDF)
│   └── models/        # 行业逻辑模型(消费、科技、制造)
├── notebooks/
│   ├── apple_analysis.ipynb
│   ├── nongfu_analysis.ipynb
│   └── toyota_analysis.ipynb
└── main.py

三、核心思路:行业逻辑模型化

程序员的优势不是算数更快,而是能抽象出“行业逻辑”。

例:消费行业(农夫山泉)
class FMCGModel:
    def __init__(self, df):
        self.df = df

    def gross_margin(self):
        return self.df['gross_profit'] / self.df['revenue']

    def inventory_days(self):
        avg_inv = (self.df['inventory'] + self.df['inventory'].shift(1)) / 2
        return 365 * avg_inv / self.df['cogs']

    def cash_conversion_cycle(self):
        inv_days = self.inventory_days()
        rec_days = 365 * self.df['accounts_receivable'] / self.df['revenue']
        pay_days = 365 * self.df['accounts_payable'] / self.df['cogs']
        return inv_days + rec_days - pay_days
例:科技行业(Apple)
class TechModel:
    def __init__(self, df):
        self.df = df

    def revenue_breakdown(self):
        return self.df[['hardware_revenue', 'services_revenue']].div(self.df['revenue'], axis=0)

    def fcf_margin(self):
        return (self.df['operating_cash_flow'] - self.df['capex']) / self.df['revenue']

    def buyback_effect(self):
        return self.df['shares_outstanding'].pct_change(periods=-1) * -1

这样,每个行业可以有自己的逻辑模板;公司分析只需:

apple = TechModel(df_apple)
print(apple.fcf_margin().tail())

四、数据获取与自动化

yfinance(或 Tushare、EDGAR)定期拉取数据:

import yfinance as yf

tickers = ['AAPL', 'TM', '9633.HK']  # Apple, Toyota, Nongfu Spring
for t in tickers:
    stock = yf.Ticker(t)
    fin = stock.financials.T
    fin.to_csv(f"data/raw/{t}.csv")

之后每天/每周自动运行:

python src/fetch.py && python src/transform.py && python src/report.py

五、Power BI / Streamlit 连接

  1. 生成中间层 CSV/Parquet(用 Python)
  2. Power BI 读取 processed 文件夹即可自动刷新
  3. 或者直接用 Streamlit Dashboard
import streamlit as st
import pandas as pd

df = pd.read_parquet('data/processed/apple.parquet')
st.line_chart(df[['revenue', 'net_income']])
st.metric('Gross Margin', f"{df['gross_margin'].iloc[-1]*100:.1f}%")

六、报告自动化(适合分析师/CTO风格输出)

用 Python + Jinja2 模板 + Markdown:

from jinja2 import Template
import pandas as pd

template = Template(open('templates/report.md').read())
report = template.render(
    company="Apple",
    revenue_growth="12%",
    fcf_margin="28%"
)
open('output/apple_report.md','w').write(report)

一键输出 PDF / HTML / Markdown 报告。


七、最终效果

✅ 你不需要手动做 Excel。
✅ 可以一键更新所有公司分析。
✅ 每个行业模型都可以被继承/扩展(OOP 优势)。
✅ 可视化可以接入 BI 工具或自己写 Dash/Streamlit。
✅ 分析逻辑可版本化(git),可复现。


✅ 适合你的目标练习

阶段目标技术点
第一阶段写出 3 个行业模型类(科技、消费、制造)Python / Pandas / 面向对象
第二阶段自动抓取 + 清洗财报数据yfinance / requests / ETL
第三阶段自动生成报告Jinja2 / Markdown / PDF
第四阶段构建交互式仪表盘Power BI 或 Streamlit
第五阶段把所有逻辑封装成可复用分析包Python package / Poetry / Docker

如果你愿意,我可以帮你:

  • 🎯 建一个最小可运行的仓库结构(含模板代码与 3 个行业示例)
  • 📘 附一个 “自动抓财报 + 计算 + 报告输出” 的可跑脚本

要我直接生成这个 项目骨架(Python + 数据文件夹 + 示例类) 给你吗?

You said:

好的,值生成项目骨架就行了

ChatGPT said:

Financial Analysis Framework· python

financial-analysis/

class AutoModel(BaseModel):

def roic(self, tax_rate=0.25):

nopat = self.df['operating_income'] * (1 - tax_rate)

avg_capital = (self.df['total_assets'] - self.df['current_liabilities']).rolling(2).mean()

return nopat / avg_capital

def capex_ratio(self):

return self.df['capex'] / self.df['revenue']

================================

src/fetch.py

================================

import yfinance as yf

import pandas as pd

from pathlib import Path

def fetch_financials(ticker: str):

stock = yf.Ticker(ticker)

fin = stock.financials.T

fin.index = pd.to_datetime(fin.index)

out_path = Path('data/raw') / f'{ticker}.csv'

out_path.parent.mkdir(parents=True, exist_ok=True)

fin.to_csv(out_path)

print(f'Saved: {out_path}')

if name == 'main':

for t in ['AAPL', '9633.HK', 'TM']:

fetch_financials(t)

================================

src/transform.py

================================

import pandas as pd

from pathlib import Path

def clean_data(ticker: str):

df = pd.read_csv(f'data/raw/{ticker}.csv', index_col=0, parse_dates=True)

df = df.fillna(0)

df['fcf'] = df['Total Cash From Operating Activities'] - df['Capital Expenditures']

df.to_csv(f'data/processed/{ticker}.csv')

print(f'Processed: {ticker}')

if name == 'main':

Path('data/processed').mkdir(parents=True, exist_ok=True)

for t in ['AAPL', '9633.HK', 'TM']:

clean_data(t)

================================

src/report.py

================================

from jinja2 import Template

import pandas as pd

from pathlib import Path

def generate_report(ticker: str, metrics: dict):

template = Template('''

{{ ticker }} 财务分析报告

主要指标:

  • 营收同比增长:{{ metrics.revenue_growth }}%

  • 自由现金流率:{{ metrics.fcf_margin }}%

  • 毛利率:{{ metrics.gross_margin }}%

''')

report = template.render(ticker=ticker, metrics=metrics)

out_path = Path('reports') / f'{ticker}_report.md'

out_path.parent.mkdir(exist_ok=True)

out_path.write_text(report)

print(f'Report saved: {out_path}')

if name == 'main':

generate_report('AAPL', dict(revenue_growth=12.3, fcf_margin=25.6, gross_margin=44.1))

================================

main.py

================================

from src.models.tech_model import TechModel

import pandas as pd

df = pd.read_csv('data/processed/AAPL.csv', index_col=0, parse_dates=True)

model = TechModel(df)

print('FCF margin:\n', model.fcf_margin().tail())

项目骨架已生成 ✅
这是一个完整的可扩展财务分析框架,包括数据抓取、清洗、行业模型、报告生成等模块。

接下来你可以选择我帮你补充哪一块:

  1. 📈 增加一个 Power BI 或 Streamlit 仪表盘展示模块
  2. 🧠 加入更多行业模板(如银行、互联网、制造)
  3. 🤖 增加自动化脚本(定期拉取 + 报告生成 + 推送)
  4. 📦 打包成可发布的 Python 包(含 CLI)