数据分析
概述
数据分析是财报分析 Agent 的核心环节。本章介绍如何计算关键财务指标、进行趋势分析和同业对比。
财务指标体系
指标分类
| 类别 | 指标 | 计算公式 | 意义 |
|---|---|---|---|
| 估值 | 市盈率 (P/E) | 股价 / 每股收益 | 估值高低 |
| 市净率 (P/B) | 股价 / 每股净资产 | 资产溢价 | |
| 市销率 (P/S) | 市值 / 营收 | 收入估值 | |
| 盈利 | 毛利率 | (营收-成本) / 营收 | 产品盈利能力 |
| 净利率 | 净利润 / 营收 | 整体盈利能力 | |
| ROE | 净利润 / 股东权益 | 股东回报 | |
| ROA | 净利润 / 总资产 | 资产利用效率 | |
| 偿债 | 流动比率 | 流动资产 / 流动负债 | 短期偿债能力 |
| 速动比率 | (流动资产-存货) / 流动负债 | 快速偿债能力 | |
| 资产负债率 | 总负债 / 总资产 | 财务杠杆 | |
| 成长 | 营收增长率 | (本期-上期) / 上期 | 业务扩张速度 |
| 净利润增长率 | (本期-上期) / 上期 | 盈利增长速度 |
指标计算实现
基础指标计算类
python
class FinancialMetrics:
"""财务指标计算器"""
def __init__(self, ticker_symbol):
self.symbol = ticker_symbol
self.ticker = yf.Ticker(ticker_symbol)
self.info = self.ticker.info
def get_valuation_metrics(self):
"""估值指标"""
return {
"市盈率": self.info.get("trailingPE"),
"市净率": self.info.get("priceToBook"),
"市销率": self.info.get("priceToSalesTrailing12Months"),
"EV/EBITDA": self.info.get("enterpriseToEbitda"),
}
def get_profitability_metrics(self):
"""盈利能力指标"""
return {
"毛利率": self.info.get("grossMargins"),
"营业利润率": self.info.get("operatingMargins"),
"净利率": self.info.get("profitMargins"),
"ROE": self.info.get("returnOnEquity"),
"ROA": self.info.get("returnOnAssets"),
}
def get_solvency_metrics(self):
"""偿债能力指标"""
return {
"流动比率": self.info.get("currentRatio"),
"速动比率": self.info.get("quickRatio"),
"资产负债率": self.info.get("debtToEquity"),
}
def get_growth_metrics(self):
"""成长性指标"""
return {
"营收增长率": self.info.get("revenueGrowth"),
"净利润增长率": self.info.get("earningsGrowth"),
"每股收益增长率": self.info.get("earningsQuarterlyGrowth"),
}使用示例
python
# 计算苹果公司的财务指标
metrics = FinancialMetrics("AAPL")
print("=== 估值指标 ===")
for k, v in metrics.get_valuation_metrics().items():
print(f"{k}: {v}")
print("\n=== 盈利能力 ===")
for k, v in metrics.get_profitability_metrics().items():
if v:
print(f"{k}: {v:.2%}")杜邦分析法
原理
杜邦分析法将 ROE 分解为三个驱动因素:
ROE = 净利率 × 资产周转率 × 权益乘数
= (净利润/营收) × (营收/总资产) × (总资产/股东权益)实现代码
python
def dupont_analysis(ticker_symbol):
"""杜邦分析"""
ticker = yf.Ticker(ticker_symbol)
# 获取财务数据
income = ticker.financials
balance = ticker.balance_sheet
# 提取关键数据
net_income = income.loc["Net Income"].iloc[0]
revenue = income.loc["Total Revenue"].iloc[0]
total_assets = balance.loc["Total Assets"].iloc[0]
equity = balance.loc["Stockholders Equity"].iloc[0]
# 计算杜邦三因素
net_margin = net_income / revenue
asset_turnover = revenue / total_assets
equity_multiplier = total_assets / equity
# 计算 ROE
roe = net_margin * asset_turnover * equity_multiplier
return {
"净利率": f"{net_margin:.2%}",
"资产周转率": f"{asset_turnover:.2f}",
"权益乘数": f"{equity_multiplier:.2f}",
"ROE": f"{roe:.2%}",
}
# 使用
result = dupont_analysis("AAPL")
for k, v in result.items():
print(f"{k}: {v}")趋势分析
同比增长计算
python
def calculate_yoy_growth(df, column):
"""计算同比增长率"""
df = df.sort_index()
df[f"{column}_YoY"] = df[column].pct_change() * 100
return df
# 示例:计算营收同比增长
financials = ticker.financials.T
financials = calculate_yoy_growth(financials, "Total Revenue")
print(financials[["Total Revenue", "Total Revenue_YoY"]])多期趋势分析
python
def analyze_trend(values, periods=4):
"""分析趋势方向"""
if len(values) < 2:
return "数据不足"
recent = values[:periods]
# 计算增长率
growth_rates = []
for i in range(len(recent) - 1):
if recent[i+1] != 0:
rate = (recent[i] - recent[i+1]) / abs(recent[i+1])
growth_rates.append(rate)
avg_growth = sum(growth_rates) / len(growth_rates)
if avg_growth > 0.1:
return "强劲增长"
elif avg_growth > 0:
return "稳定增长"
elif avg_growth > -0.1:
return "轻微下滑"
else:
return "明显下滑"同业对比
行业对比分析
python
def compare_peers(symbols, metrics_list):
"""同业对比分析"""
results = []
for symbol in symbols:
ticker = yf.Ticker(symbol)
info = ticker.info
row = {"股票": symbol, "公司": info.get("shortName")}
for metric in metrics_list:
row[metric] = info.get(metric)
results.append(row)
return pd.DataFrame(results)
# 对比科技巨头
peers = ["AAPL", "MSFT", "GOOGL", "META"]
metrics = ["trailingPE", "priceToBook", "profitMargins", "returnOnEquity"]
comparison = compare_peers(peers, metrics)
print(comparison)异常检测
指标异常判断
python
def detect_anomalies(metrics):
"""检测财务指标异常"""
warnings = []
# 估值异常
pe = metrics.get("市盈率", 0)
if pe and pe < 0:
warnings.append("⚠️ 市盈率为负,公司可能亏损")
elif pe and pe > 100:
warnings.append("⚠️ 市盈率过高,估值可能偏贵")
# 偿债能力异常
current_ratio = metrics.get("流动比率", 0)
if current_ratio and current_ratio < 1:
warnings.append("⚠️ 流动比率低于1,存在短期偿债风险")
debt_ratio = metrics.get("资产负债率", 0)
if debt_ratio and debt_ratio > 200:
warnings.append("⚠️ 资产负债率过高,财务杠杆风险大")
# 盈利能力异常
roe = metrics.get("ROE", 0)
if roe and roe < 0:
warnings.append("⚠️ ROE 为负,股东权益在缩水")
return warnings注意事项
- 数据时效性:财务数据有滞后性,季报通常滞后 1-2 个月
- 行业差异:不同行业的指标标准不同,需按行业对比
- 会计政策:不同公司会计政策可能不同,影响指标可比性
- 一次性项目:需剔除非经常性损益的影响
下一步
数据分析完成,开始用 AI 生成分析洞察。