技能: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, 并判断公司是否处于扩张期。
通用工作流程(适用于所有三家公司)
-
数据来源(建议)
- 公司年报 / 季报(原文 PDF),或用财经网站导出的历史财报 CSV(Excel 可直接导入)。
- 市场数据(销量、行业报告)可作为补充。
-
Excel 操作流程
- 将三张报表(损益、资产负债、现金流)按同一时间轴(季度/年度)整理成表格。
- 新增计算列:同比、环比、TTM、关键比率。
- 制作数据透视表与图表(趋势图、堆叠条形、饼图)。
-
Power BI
- 把 Excel 或 CSV 导入,建模型(关系通常以 date 字段连结)。
- 建 KPI 卡、时间序列、下钻(drill-through)到分产品或分地区明细。
- 加入注释层(书签)解释异常季度(例如一次性收入/资产减值/回购)。
-
Python(自动化/重复任务)
- 用 pandas 读取原始 CSV,写函数计算常用比率,输出到新 CSV / Excel。
- 封装成 notebook:把数据清洗→计算→画图(matplotlib)步骤写成可复用脚本。
-
报告与结论
- 每家公司写 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 自动生成 |
| 报告 | PPT | Jupyter 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 连接
- 生成中间层 CSV/Parquet(用 Python)
- Power BI 读取 processed 文件夹即可自动刷新
- 或者直接用 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())
项目骨架已生成 ✅
这是一个完整的可扩展财务分析框架,包括数据抓取、清洗、行业模型、报告生成等模块。
接下来你可以选择我帮你补充哪一块:
- 📈 增加一个 Power BI 或 Streamlit 仪表盘展示模块
- 🧠 加入更多行业模板(如银行、互联网、制造)
- 🤖 增加自动化脚本(定期拉取 + 报告生成 + 推送)
- 📦 打包成可发布的 Python 包(含 CLI)