帮我写代码,完成作业:利用tushare,搜集比亚迪 002594.SZ, 长城汽车,601633.SH 【2019-2023】年的资产负债表、利润表和现金流量表数据,分别存入比亚迪.xlsx, 长城汽车.xlsx 两个文件中,利用相关数据分别测算以下财务指标:营业毛利率、研发费用率、销售费用率、营业净利率、ROE、总资产周转率、库存周转率、流动比率、资产负债率、利息保障倍数、营业收入增长率、营业利润增长率等指标,分别存入两个文件的财务比率表中。
时间: 2025-06-24 21:42:53 浏览: 33
### 如何使用Tushare获取比亚迪(002594.SZ)和长城汽车(601633.SH)的财务数据
以下是实现目标的具体方法,包括如何通过 `tushare` 获取两家公司的资产负债表、利润表以及现金流量表,并进一步计算所需的财务指标(如营业毛利率和研发费用率),最后将结果保存到 Excel 文件中。
#### 安装依赖库
首先需要安装必要的 Python 库:
```bash
pip install tushare openpyxl pandas
```
---
#### 编写代码逻辑
以下是一个完整的脚本:
```python
import tushare as ts
import pandas as pd
# 设置 Token 并初始化接口
ts.set_token('your_tushare_token_here')
pro = ts.pro_api()
def fetch_financial_data(stock_code, start_year=2019, end_year=2023):
"""
获取指定股票代码的时间范围内的财务报表数据。
参数:
stock_code (str): 股票代码
start_year (int): 开始年份
end_year (int): 结束年份
返回:
dict: 各类财务数据字典
"""
financial_data = {}
# 遍历年份构建时间区间
dates = [(f"{year}0101", f"{year}1231") for year in range(start_year, end_year + 1)]
# 获取资产负债表
balance_sheets = []
for start_date, end_date in dates:
df_bs = pro.balancesheet(ts_code=stock_code, start_date=start_date, end_date=end_date)
balance_sheets.append(df_bs)
financial_data['balancesheet'] = pd.concat(balance_sheets).reset_index(drop=True)
# 获取利润表
income_statements = []
for start_date, end_date in dates:
df_is = pro.income(ts_code=stock_code, start_date=start_date, end_date=end_date)
income_statements.append(df_is)
financial_data['income'] = pd.concat(income_statements).reset_index(drop=True)
# 获取现金流量表
cash_flows = []
for start_date, end_date in dates:
df_cf = pro.cashflow(ts_code=stock_code, start_date=start_date, end_date=end_date)
cash_flows.append(df_cf)
financial_data['cashflow'] = pd.concat(cash_flows).reset_index(drop=True)
return financial_data
def calculate_metrics(financial_data):
"""
计算所需财务指标:营业毛利率、研发费用率等。
参数:
financial_data (dict): 包含各类财务数据的字典
返回:
DataFrame: 添加了新列的收入表数据框
"""
income_df = financial_data.get('income')
if income_df is not None and 'revenue' in income_df.columns and 'oper_cost' in income_df.columns:
# 计算营业毛利率
gross_profit_margin = ((income_df['revenue'] - income_df['oper_cost']) / income_df['revenue']).fillna(0)
income_df['gross_profit_margin'] = gross_profit_margin * 100 # 百分比形式
if income_df is not None and 'rd_expense' in income_df.columns and 'revenue' in income_df.columns:
# 计算研发费用率
rd_expense_ratio = (income_df['rd_expense'] / income_df['revenue']).fillna(0)
income_df['rd_expense_ratio'] = rd_expense_ratio * 100 # 百分比形式
return income_df[['end_date', 'gross_profit_margin', 'rd_expense_ratio']] if income_df is not None else None
def save_to_excel(stock_name, financial_data, metrics_df):
"""
将财务数据和计算后的指标保存为 Excel 文件。
参数:
stock_name (str): 股票名称
financial_data (dict): 财务数据字典
metrics_df (DataFrame): 指标数据框
"""
with pd.ExcelWriter(f'{stock_name}_financials.xlsx') as writer:
if 'balancesheet' in financial_data:
financial_data['balancesheet'].to_excel(writer, sheet_name='Balance Sheet', index=False)
if 'income' in financial_data:
financial_data['income'].to_excel(writer, sheet_name='Income Statement', index=False)
if 'cashflow' in financial_data:
financial_data['cashflow'].to_excel(writer, sheet_name='Cash Flow Statement', index=False)
if metrics_df is not None:
metrics_df.to_excel(writer, sheet_name='Metrics', index=False)
if __name__ == "__main__":
stocks = {
"BYD": "002594.SZ",
"Great_Wall_Motor": "601633.SH"
}
for name, code in stocks.items():
print(f"Fetching data for {name} ({code})...")
try:
data = fetch_financial_data(code)
metrics = calculate_metrics(data)
save_to_excel(name, data, metrics)
print(f"Data saved to '{name}_financials.xlsx'")
except Exception as e:
print(f"Error processing {name}: {e}")
```
---
#### 关键说明
1. **设置 Token**: 替换 `'your_tushare_token_here'` 为你自己的 Tushare Token[^1]。
2. **函数功能**:
- `fetch_financial_data`: 提取给定股票代码的历史财务报表数据,支持跨年度的数据请求。
- `calculate_metrics`: 基于提取的利润表数据,计算营业毛利率 `(营业收入 - 营业成本)/营业收入` 和研发费用率 `研发支出/营业收入`[^2]。
- `save_to_excel`: 将所有提取的数据及其衍生指标保存到单独的 Excel 文件中,便于后续分析。
3. **错误处理**: 如果某项数据无法成功下载,则会跳过并记录错误消息。
---
#### 输出文件结构
对于每只股票,生成一个名为 `{股票名}_financials.xlsx` 的 Excel 文件,其中包含以下几个工作表:
- Balance Sheet: 资产负债表数据。
- Income Statement: 利润表数据。
- Cash Flow Statement: 现金流量表数据。
- Metrics: 自定义计算的财务指标(如营业毛利率和研发费用率)。
---
阅读全文