Initial commit
This commit is contained in:
commit
97b0edc324
2
.env
Normal file
2
.env
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
TUSHARE_TOKEN=f62b415de0a5a947fcb693b66cd299dd6242868bf04ad687800c7f3f
|
||||||
|
ALPHA_VANTAGE_KEY=QQ9R0SFHQHAXDTHD
|
||||||
64
DOC/formulas.md
Normal file
64
DOC/formulas.md
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
# 财务指标计算公式与字段说明 (Financial Indicators Formulas)
|
||||||
|
|
||||||
|
本通过展示了系统中生成的各项财务指标的计算逻辑及对应的数据来源字段。
|
||||||
|
|
||||||
|
## 1. 主要指标 (Key Metrics)
|
||||||
|
|
||||||
|
| 指标 (Key) | 显示名称 | 计算公式 (Formula) | Tushare字段 (CN) | Alpha Vantage字段 (US) |
|
||||||
|
| :--- | :--- | :--- | :--- | :--- |
|
||||||
|
| **ROE** | ROE | `(归母净利润 / 净资产) * 100%` | `n_income_attr_p` / `total_hldr_eqy_exc_min_int` | `netIncome` / `totalShareholderEquity` |
|
||||||
|
| **ROA** | ROA | `(净利润 / 总资产) * 100%` | `n_income_attr_p` / `total_assets` | `netIncome` / `totalAssets` |
|
||||||
|
| **ROIC** | ROCE/ROIC | `EBIT / (净资产 + 有息负债)` | `ebit` / (`equity` + `debt`) | `ebit` / (`equity` + `debt`) |
|
||||||
|
| **GrossMargin** | 毛利率 | `((收入 - 成本) / 收入) * 100%` | `(revenue - cogs) / revenue` | `grossProfit / totalRevenue` |
|
||||||
|
| **NetMargin** | 净利润率 | `(归母净利润 / 收入) * 100%` | `n_income_attr_p / revenue` | `netIncome / totalRevenue` |
|
||||||
|
| **revenue** | 收入 (亿) | `营业收入 / 10^8` | `total_revenue` | `totalRevenue` |
|
||||||
|
| **net_income** | 净利润 (亿) | `归母净利润 / 10^8` | `n_income_attr_p` | `netIncome` |
|
||||||
|
| **ocf** | 经营净现金流 (亿) | `经营活动产生的现金流量净额 / 10^8` | `n_cashflow_act` | `operatingCashflow` |
|
||||||
|
| **Capex** | 资本开支 (亿) | `购建固定资产...支付的现金` | `c_pay_acq_const_fiolta` | `capitalExpenditures` |
|
||||||
|
| **FCF** | 自由现金流 (亿) | `经营净现金流 - 资本开支` | `ocf - capex` | `ocf - capex` |
|
||||||
|
|
||||||
|
## 2. 费用指标 (Expense Ratios)
|
||||||
|
|
||||||
|
| 指标 (Key) | 显示名称 | 计算公式 (Formula) | 来源字段 (CN) |
|
||||||
|
| :--- | :--- | :--- | :--- |
|
||||||
|
| **SellingRatio** | 销售费用率 | `销售费用 / 收入` | `sell_exp` |
|
||||||
|
| **AdminRatio** | 管理费用率 | `管理费用 / 收入` | `admin_exp` |
|
||||||
|
| **RDRatio** | 研发费用率 | `研发费用 / 收入` | `rd_exp` |
|
||||||
|
| **DepreciationRatio** | 折旧费用占比 | `折旧 / 收入` | `depr_fa_coga_dpba` (CashFlow) |
|
||||||
|
| **OtherExpenseRatio** | 其他费用率 | `毛利率 - 销售费率 - 管理费率 - 研发费率 - 净利率 - 所得税率` (注: 近似倒挤包含财务费用等) | 计算得出 |
|
||||||
|
| **TaxRate** | 所得税率 | `所得税费用 / 利润总额` | `income_tax / total_profit` |
|
||||||
|
|
||||||
|
## 3. 资产占比 (Asset Structure)
|
||||||
|
|
||||||
|
| 指标 (Key) | 显示名称 | 计算公式 (Formula) | Tushare字段 (CN) |
|
||||||
|
| :--- | :--- | :--- | :--- |
|
||||||
|
| **CashRatio** | 现金占比 | `货币资金 / 总资产` | `money_cap` |
|
||||||
|
| **InventoryRatio** | 库存占比 | `存货 / 总资产` | `inventories` |
|
||||||
|
| **ReceivablesRatio** | 应收款占比 | `应收账款 / 总资产` | `accounts_receiv` |
|
||||||
|
| **PrepaymentRatio** | 预付款占比 | `预付款项 / 总资产` | `prepayment` |
|
||||||
|
| **FixedAssetsRatio** | 固定资产占比 | `固定资产 / 总资产` | `fix_assets` |
|
||||||
|
| **LongTermInvestmentRatio** | 长期投资占比 | `长期股权投资 / 总资产` | `lt_eqt_invest` |
|
||||||
|
| **GoodwillRatio** | 商誉占比 | `商誉 / 总资产` | `goodwill` |
|
||||||
|
| **OtherAssetsRatio** | 其他资产占比 | `100% - 上述7项占比之和` | (计算得出) |
|
||||||
|
| **PayablesRatio** | 应付款占比 | `应付账款 / 总资产` | `acct_payable` |
|
||||||
|
| **AdvanceReceiptsRatio** | 预收款占比 | `(预收款项 + 合同负债) / 总资产` | `adv_receipts` + `contract_liab` |
|
||||||
|
| **ShortTermDebtRatio** | 短期借款占比 | `短期借款 / 总资产` | `st_borr` |
|
||||||
|
| **LongTermDebtRatio** | 长期借款占比 | `长期借款 / 总资产` | `lt_borr` |
|
||||||
|
| **OperatingAssetsRatio** | 运营资产占比 | `(总资产 - 现金 - 长期投资 - 交易性金融资产) / 总资产` | (计算得出) |
|
||||||
|
| **InterestBearingDebtRatio**| 有息负债率 | `(短期借款 + 长期借款) / 总资产` | `st_borr` + `lt_borr` |
|
||||||
|
|
||||||
|
## 4. 周转能力 (Turnover)
|
||||||
|
|
||||||
|
* **存货周转天数**: `365 * 存货 / 营业成本`
|
||||||
|
* **应收款周转天数**: `365 * 应收账款 / 营业收入`
|
||||||
|
* **应付款周转天数**: `365 * 应付账款 / 营业成本`
|
||||||
|
* **固定资产周转率**: `营业收入 / 固定资产`
|
||||||
|
* **总资产周转率**: `营业收入 / 总资产`
|
||||||
|
|
||||||
|
## 5. 市场表现 & 人均
|
||||||
|
|
||||||
|
* **市值**: 总市值 (亿)
|
||||||
|
* **PE**: 市盈率 (TTM)
|
||||||
|
* **PB**: 市净率
|
||||||
|
* **人均创收**: `收入 / 员工人数`
|
||||||
|
* **人均创利**: `净利润 / 员工人数`
|
||||||
57
DOC/implementation_plan.md
Normal file
57
DOC/implementation_plan.md
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
# 实施计划:财务数据获取与分析系统
|
||||||
|
|
||||||
|
# 目标描述
|
||||||
|
开发一个后端工具,用于获取中国、香港、美国及日本股市的10年财务报表,保存到本地,计算财务指标,并输出带有样式的 Markdown 报告。
|
||||||
|
|
||||||
|
## 用户需确认事项
|
||||||
|
- **API Keys**: 需要 Tushare 和 Alpha Vantage 的 API Key。
|
||||||
|
- **日本市场数据**: Alpha Vantage 对日股财务数据的支持情况待验证。
|
||||||
|
- **财务指标**: 需确认具体的计算指标列表。
|
||||||
|
|
||||||
|
## 拟定变更
|
||||||
|
|
||||||
|
### 1. 项目初始化
|
||||||
|
- 创建项目目录结构。
|
||||||
|
- 初始化依赖管理 `requirements.txt` (pandas, requests, tushare, alpha_vantage)。
|
||||||
|
- 创建 `.env` 文件用于存放 API Keys。
|
||||||
|
|
||||||
|
### 2. 模块:数据获取器 (`src/fetchers`)
|
||||||
|
- 定义抽象基类 `DataFetcher`。
|
||||||
|
- **TushareFetcher (CN & HK)**:
|
||||||
|
- 实现与 Tushare 的连接。
|
||||||
|
- 方法:获取利润表、资产负债表、现金流量表。
|
||||||
|
- 适配 A 股和港股代码后缀。
|
||||||
|
- **AlphaVantageFetcher (US & JP)**:
|
||||||
|
- 实现与 Alpha Vantage 的连接。
|
||||||
|
- 方法:同上。
|
||||||
|
- 针对日本市场进行适配测试。
|
||||||
|
- **工厂模式**: `get_fetcher(market, api_keys)` 根据市场返回对应的获取器实例。
|
||||||
|
|
||||||
|
### 3. 模块:数据存储 (`src/storage`)
|
||||||
|
- 实现将 DataFrame 保存为 CSV 的功能。
|
||||||
|
- 目录结构:`data/{market}/{stock_code}/{statement_type}.csv`。
|
||||||
|
|
||||||
|
### 4. 模块:分析器 (`src/analysis`)
|
||||||
|
- 加载本地 CSV 数据。
|
||||||
|
- 计算指标 (初步规划):
|
||||||
|
- **盈利能力**: ROE (净资产收益率), Net Profit Margin (净利率), Gross Margin (毛利率)。
|
||||||
|
- **偿债能力**: Debt-to-Equity (产权比率/负债权益比), Current Ratio (流动比率)。
|
||||||
|
- **成长能力**: Revenue Growth (营收增长率), Net Income Growth (净利增长率)。
|
||||||
|
- 返回汇总的 DataFrame。
|
||||||
|
|
||||||
|
### 5. 模块:报告生成器 (`src/reporting`)
|
||||||
|
- 类 `MarkdownReporter`.
|
||||||
|
- 方法 `generate_table(indicator_data)`.
|
||||||
|
- **样式实现**:
|
||||||
|
- 使用 HTML `<table>` 标签嵌入 Markdown,通过 `style="background-color: ..."` 实现背景色。
|
||||||
|
|
||||||
|
## 验证计划
|
||||||
|
|
||||||
|
### 自动化测试
|
||||||
|
- 编写单元测试,Mock API 响应,测试数据解析逻辑。
|
||||||
|
- 测试指标计算公式的准确性。
|
||||||
|
|
||||||
|
### 人工验证
|
||||||
|
1. **中国/香港股票**: 获取茅台 (600519.SH) 和 腾讯 (00700.HK),检查文件是否生成,内容是否正确。
|
||||||
|
2. **美国/日本股票**: 获取 Apple (AAPL) 和 Sony (6758.T),检查数据获取情况。
|
||||||
|
3. **报告检查**: 打开生成的 `report.md`,确认颜色样式能否正确渲染。
|
||||||
45
DOC/requirements.md
Normal file
45
DOC/requirements.md
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
# 需求文档:公司财务数据获取与分析系统
|
||||||
|
|
||||||
|
## 1. 项目概述
|
||||||
|
构建一个后端系统,根据证券代码和所属市场,获取目标公司的财务数据(资产负债表、利润表、现金流量表)。系统将保存原始数据,计算关键财务指标,并生成一份带有样式(背景色)的 Markdown 格式报告。
|
||||||
|
|
||||||
|
## 2. 项目范围
|
||||||
|
- **目标市场**:
|
||||||
|
- **中国 (CN)**: 使用 Tushare API。
|
||||||
|
- **香港 (HK)**: 使用 Tushare API (已确认支持)。
|
||||||
|
- **美国 (US)**: 使用 Alpha Vantage API。
|
||||||
|
- **日本 (JP)**: 尝试使用 Alpha Vantage API (需验证数据完整性)。
|
||||||
|
- **数据覆盖**:最近 10 年的年度数据(或可获取的历史数据)。
|
||||||
|
- **数据内容**:三大主要财务报表(利润表、资产负债表、现金流量表)。
|
||||||
|
|
||||||
|
## 3. 功能需求
|
||||||
|
|
||||||
|
### 3.1 数据获取
|
||||||
|
- **输入**:`证券代码` (Stock Code), `市场` (CN, HK, US, JP)。
|
||||||
|
- **逻辑**:
|
||||||
|
- 若 `市场 == CN` 或 `HK`: 调用 Tushare API。
|
||||||
|
- 若 `市场 == US`: 调用 Alpha Vantage API。
|
||||||
|
- 若 `市场 == JP`: 尝试调用 Alpha Vantage API。
|
||||||
|
- **规模**:获取过去 10 年的数据。
|
||||||
|
|
||||||
|
### 3.2 数据存储
|
||||||
|
- 将获取的原始财务报表保存为本地文件。
|
||||||
|
- **格式**:CSV (推荐,便于后续处理)。
|
||||||
|
- **命名规范**:`data/{市场}/{代码}_{报表类型}.csv`。
|
||||||
|
|
||||||
|
### 3.3 数据分析
|
||||||
|
- 读取本地保存的财务报表文件。
|
||||||
|
- 计算关键财务指标 (具体指标待定,预设包含:ROE, 净利率, 负债率等)。
|
||||||
|
|
||||||
|
### 3.4 报告生成
|
||||||
|
- 生成 Markdown 格式的汇总报告。
|
||||||
|
- **样式要求**:表格需包含背景色(如根据指标优劣显示红/绿,或隔行变色)。
|
||||||
|
- *注*:由于标准 Markdown 不支持背景色,将采用嵌入 HTML 的方式实现。
|
||||||
|
|
||||||
|
## 4. 技术需求
|
||||||
|
- **开发语言**:Python。
|
||||||
|
- **配置管理**:API Key (Tushare, Alpha Vantage) 需可配置(建议使用环境变量或配置文件)。
|
||||||
|
|
||||||
|
## 5. 待确认事项
|
||||||
|
1. **日本市场数据源**:Alpha Vantage 对日本市场的财务报表支持程度需在实施阶段验证。
|
||||||
|
2. **具体的财务指标**:用户需通过文档或沟通确认具体需要计算哪些指标。
|
||||||
24
DOC/task.md
Normal file
24
DOC/task.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# 财务数据获取与分析系统任务列表
|
||||||
|
|
||||||
|
## 第一阶段:规划与需求
|
||||||
|
- [x] 定义需求和规格说明书 (PRD) <!-- id: 0 -->
|
||||||
|
- [x] 制定详细实施计划 <!-- id: 1 -->
|
||||||
|
- [x] 获取用户 API Keys (Tushare, Alpha Vantage) <!-- id: 2 -->
|
||||||
|
- [x] 确认香港/日本市场数据源 (HK->Tushare, JP->Alpha Vantage) <!-- id: 3 -->
|
||||||
|
|
||||||
|
## 第二阶段:实施 - 数据获取
|
||||||
|
- [x] 搭建项目结构 (Python/Backend) <!-- id: 4 -->
|
||||||
|
- [x] 实现 Tushare 客户端 (支持 CN, HK) <!-- id: 5 -->
|
||||||
|
- [x] 实现 Alpha Vantage 客户端 (支持 US, JP) <!-- id: 6 -->
|
||||||
|
- [x] 实现各市场数据获取逻辑 <!-- id: 7 -->
|
||||||
|
- [x] 实现文件存储功能 (保存原始数据) <!-- id: 8 -->
|
||||||
|
|
||||||
|
## 第三阶段:实施 - 分析与输出
|
||||||
|
- [x] 实现财务指标计算逻辑 <!-- id: 9 -->
|
||||||
|
- [x] 实现带有样式的 Markdown 表格生成 <!-- id: 10 -->
|
||||||
|
|
||||||
|
## 第四阶段:验证
|
||||||
|
- [x] 验证中国/香港市场数据获取 <!-- id: 11 -->
|
||||||
|
- [x] 验证美国/日本市场数据获取 <!-- id: 12 -->
|
||||||
|
- [x] 验证指标计算准确性 <!-- id: 13 -->
|
||||||
|
- [x] 验证 Markdown 输出格式与样式 <!-- id: 14 -->
|
||||||
74
DOC/walkthrough.md
Normal file
74
DOC/walkthrough.md
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# 财务数据获取与分析系统 - 执行演示
|
||||||
|
|
||||||
|
本演示记录了使用该后端系统获取中国(Tushare)和美国(Alpha Vantage)市场股票数据,并生成财务分析报告的全过程。
|
||||||
|
|
||||||
|
## 1. 验证目标
|
||||||
|
- **中国市场**: 获取 贵州茅台 (600519.SH) 近 10 年财务数据。
|
||||||
|
- **美国市场**: 获取 Apple Inc. (AAPL) 近 10 年财务数据。
|
||||||
|
- **功能**: 下载数据 -> 本地存储 (CSV) -> 计算指标 (ROE, 净利率等) -> 生成带有颜色标记的 Markdown 报告。
|
||||||
|
|
||||||
|
## 2. 执行过程
|
||||||
|
|
||||||
|
通过运行 `main.py` 脚本执行了验证:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python main.py
|
||||||
|
```
|
||||||
|
|
||||||
|
### 运行日志摘要
|
||||||
|
|
||||||
|
```text
|
||||||
|
Processing CN stock: 600519.SH...
|
||||||
|
Fetching Income Statement...
|
||||||
|
Fetching Balance Sheet...
|
||||||
|
Fetching Cash Flow...
|
||||||
|
Saved data/CN/600519.SH/income_statement.csv
|
||||||
|
Saved data/CN/600519.SH/balance_sheet.csv
|
||||||
|
Saved data/CN/600519.SH/cash_flow.csv
|
||||||
|
Calculating Financial Indicators...
|
||||||
|
Generating Report...
|
||||||
|
Analysis completed! Report saved to: data/CN/600519.SH/report.md
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
Processing US stock: AAPL...
|
||||||
|
Fetching Income Statement...
|
||||||
|
Fetching Balance Sheet...
|
||||||
|
Fetching Cash Flow...
|
||||||
|
Saved data/US/AAPL/income_statement.csv
|
||||||
|
Saved data/US/AAPL/balance_sheet.csv
|
||||||
|
Saved data/US/AAPL/cash_flow.csv
|
||||||
|
Calculating Financial Indicators...
|
||||||
|
Generating Report...
|
||||||
|
Analysis completed! Report saved to: data/US/AAPL/report.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. 输出结果演示
|
||||||
|
|
||||||
|
### 3.1 生成的文件结构
|
||||||
|
系统按预期在 `data/` 目录下生成了对应的文件夹和文件:
|
||||||
|
```
|
||||||
|
data/
|
||||||
|
├── CN/
|
||||||
|
│ └── 600519.SH/
|
||||||
|
│ ├── balance_sheet.csv
|
||||||
|
│ ├── cash_flow.csv
|
||||||
|
│ ├── income_statement.csv
|
||||||
|
│ └── report.md
|
||||||
|
└── US/
|
||||||
|
└── AAPL/
|
||||||
|
├── balance_sheet.csv (等)
|
||||||
|
└── report.md
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2 报表内容示例 (AAPL)
|
||||||
|
生成的 `report.md` 包含带有背景色的 Markdown/HTML 表格,直观展示财务健康状况。
|
||||||
|
|
||||||
|
*(以下为报告片段)*
|
||||||
|
> **# Financial Analysis Report: US AAPL**
|
||||||
|
>
|
||||||
|
> <table><thead><tr><th>year</th><th>revenue</th><th>net_income</th><th>ROE</th><th>NetMargin</th><th>DebtToEquity</th><th>CurrentRatio</th></tr></thead><tbody><tr><td>2024</td><td style=''>391,035,000,000</td><td style=''>93,736,000,000</td><td style='background-color: #d1e7dd;'>147.28%</td><td style='background-color: #d1e7dd;'>23.97%</td><td style='background-color: #f8d7da;'>4.55</td><td style=''>0.82</td></tr><tr><td>2023</td><td style=''>383,285,000,000</td><td style=''>96,995,000,000</td><td style='background-color: #d1e7dd;'>156.08%</td><td style='background-color: #d1e7dd;'>25.31%</td><td style='background-color: #f8d7da;'>4.67</td><td style=''>0.99</td></tr>...
|
||||||
|
|
||||||
|
## 4. 结论
|
||||||
|
- **数据获取**: 成功连接 Tushare 和 Alpha Vantage API 并下载了数据。
|
||||||
|
- **数据清洗**: 修复了日期格式不一致问题,确保了指标计算时年份正确对齐。
|
||||||
|
- **报告生成**: 成功生成了包含 ROE、净利率、偿债能力分析的 Markdown 报告。
|
||||||
216
README.md
Normal file
216
README.md
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
# 财务报告生成器
|
||||||
|
|
||||||
|
这是一个命令行工具,用于获取A股、港股和美股上市公司的财务数据,并生成结构化的财务分析报告。报告包含HTML和Markdown两种格式。
|
||||||
|
|
||||||
|
## 功能
|
||||||
|
|
||||||
|
- 支持中国大陆 (CN)、香港 (HK) 和美国 (US) 三个市场。
|
||||||
|
- 从 Tushare Pro 和 Alpha Vantage 两个API获取财务数据。
|
||||||
|
- 计算数十种核心财务指标,涵盖盈利能力、资产结构、周转效率等多个维度。
|
||||||
|
- 自动生成格式化的 HTML 和 Markdown 报告,便于阅读和分析。
|
||||||
|
|
||||||
|
## 环境配置
|
||||||
|
|
||||||
|
1. **安装依赖**
|
||||||
|
在项目根目录下运行以下命令来安装所有必需的 Python 库:
|
||||||
|
```bash
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **设置API密钥**
|
||||||
|
程序需要调用 Tushare Pro 和 Alpha Vantage 的API来获取数据。请先注册这两个服务以获取免费的API密钥(Token)。
|
||||||
|
|
||||||
|
- **Tushare Pro**: [https://tushare.pro](https://tushare.pro) (主要用于A股和港股数据)
|
||||||
|
- **Alpha Vantage**: [https://www.alphavantage.co](https://www.alphavantage.co) (用于美股数据)
|
||||||
|
|
||||||
|
获取密钥后,请在项目根目录下创建一个名为 `.env` 的文件,并按以下格式填入您的密钥:
|
||||||
|
|
||||||
|
```
|
||||||
|
TUSHARE_TOKEN=YOUR_TUSHARE_TOKEN_HERE
|
||||||
|
ALPHA_VANTAGE_KEY=YOUR_ALPHA_VANTAGE_KEY_HERE
|
||||||
|
```
|
||||||
|
|
||||||
|
## 如何运行
|
||||||
|
|
||||||
|
使用以下命令来运行程序:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python main.py <MARKET> <SYMBOL>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 参数说明
|
||||||
|
|
||||||
|
- `<MARKET>`: 必填参数,指定目标市场。
|
||||||
|
- `CN`: 中国A股市场
|
||||||
|
- `HK`: 中国香港市场
|
||||||
|
- `US`: 美国市场
|
||||||
|
|
||||||
|
- `<SYMBOL>`: 必填参数,指定目标公司的股票代码。
|
||||||
|
- **A股 (CN)**: Tushare标准格式,例如 `600519.SH` (贵州茅台), `000001.SZ` (平安银行)。
|
||||||
|
- **港股 (HK)**: Tushare标准格式,例如 `00700.HK` (腾讯控股)。
|
||||||
|
- **美股 (US)**: 标准代码,例如 `AAPL` (Apple Inc.), `GOOGL` (Alphabet Inc.)。
|
||||||
|
|
||||||
|
### 运行示例
|
||||||
|
|
||||||
|
- 分析贵州茅台 (A股):
|
||||||
|
```bash
|
||||||
|
python main.py CN 600519.SH
|
||||||
|
```
|
||||||
|
- 分析苹果公司 (美股):
|
||||||
|
```bash
|
||||||
|
python main.py US AAPL
|
||||||
|
```
|
||||||
|
- **无参数运行**:
|
||||||
|
如果直接运行 `python main.py`,程序将执行内置的默认测试案例(贵州茅台和苹果公司)。
|
||||||
|
|
||||||
|
## 数据来源 (API)
|
||||||
|
|
||||||
|
程序通过两个API获取所有原始财务数据:
|
||||||
|
|
||||||
|
### 1. Tushare Pro (A股 / 港股)
|
||||||
|
|
||||||
|
- `income` / `hk_income`: 利润表
|
||||||
|
- `balancesheet` / `hk_balancesheet`: 资产负债表
|
||||||
|
- `cashflow` / `hk_cashflow`: 现金流量表
|
||||||
|
- `daily_basic`: 每日指标 (用于获取股价, PE, PB, 市值, 股息率)
|
||||||
|
- `stock_basic`: 公司基本信息 (公司名称, 上市日期)
|
||||||
|
- `stock_company`: 上市公司信息 (员工人数)
|
||||||
|
- `stk_holdernumber`: 股东户数
|
||||||
|
|
||||||
|
### 2. Alpha Vantage (美股)
|
||||||
|
|
||||||
|
- `INCOME_STATEMENT`: 利润表
|
||||||
|
- `BALANCE_SHEET`: 资产负债表
|
||||||
|
- `CASH_FLOW`: 现金流量表
|
||||||
|
- `OVERVIEW`: 公司概览 (用于获取 PE, PB, 市值, 员工人数)
|
||||||
|
- `GLOBAL_QUOTE`: 全球报价 (用于获取最新股价)
|
||||||
|
|
||||||
|
### API 调用次数
|
||||||
|
|
||||||
|
每次运行分析,程序会向对应的API服务发出一系列请求。不同市场的调用次数如下:
|
||||||
|
|
||||||
|
- **A股 / 港股 (Tushare)**: 一次完整的分析大约需要 **9次** API调用,以获取三张财务报表、公司基本信息、历史和当前的各种市场指标。
|
||||||
|
- **美股 (Alpha Vantage)**: 一次完整的分析大约需要 **5次** API调用,以获取三张财务报表、公司概览和最新股价。
|
||||||
|
|
||||||
|
*注意:上述次数是基于当前代码逻辑的估算,未来代码变更可能会影响实际调用次数。*
|
||||||
|
|
||||||
|
## 指标与计算方法
|
||||||
|
|
||||||
|
> 下列指标的实现以标准财报口径为基础,并在部分地方做了个人化的口径定义,方便进行结构化对比分析。
|
||||||
|
|
||||||
|
### 1. 主要指标
|
||||||
|
|
||||||
|
- **ROE (净资产收益率)**:
|
||||||
|
\[\text{ROE} = \frac{\text{净利润}}{\text{期末净资产(total\\_equity)}}\]
|
||||||
|
- **ROA (总资产收益率)**:
|
||||||
|
\[\text{ROA} = \frac{\text{净利润}}{\text{总资产(total\\_assets)}}\]
|
||||||
|
- **ROIC (ROCE/ROIC)**:
|
||||||
|
- 先计算有息负债:
|
||||||
|
\[\text{有息负债} = \text{短期借款(short\\_term\\_debt)} + \text{长期借款(long\\_term\\_debt)}\]
|
||||||
|
- 再计算投入资本:
|
||||||
|
\[\text{投入资本(InvestedCapital)} = \text{净资产(total\\_equity)} + \text{有息负债}\]
|
||||||
|
- EBIT 优先使用接口字段,若缺失则按“利润总额 + 财务费用(利息支出)”推算:
|
||||||
|
\[\text{EBIT} = \text{total\\_profit} + \text{fin\\_exp}\]
|
||||||
|
- 最终:
|
||||||
|
\[\text{ROIC} = \frac{\text{EBIT}}{\text{投入资本}}\]
|
||||||
|
- **毛利率 (GrossMargin)**:
|
||||||
|
\[\text{毛利率} = \frac{\text{毛利}}{\text{收入}}\]
|
||||||
|
其中毛利优先使用接口提供的 `gross_profit`,若缺失则按 `收入 - 营业成本(cogs)` 计算。
|
||||||
|
- **净利润率 (NetMargin)**:
|
||||||
|
\[\text{净利润率} = \frac{\text{净利润}}{\text{收入}}\]
|
||||||
|
- **收入 (revenue)**:利润表中的营业总收入 / 总营收。
|
||||||
|
- **收入增速 (RevenueGrowth)**:按“同一报告期上年同期”计算,而不是简单相邻两期:
|
||||||
|
\[\text{收入增速} = \frac{\text{本期收入} - \text{上年同日收入}}{|\text{上年同日收入}|}\]
|
||||||
|
代码中通过把 `date_str` 减去 10000(例如 20240930 → 20230930)来精确匹配上年同期;如果找不到完全相同的日期,则该期增速记为缺失。
|
||||||
|
- **净利润 (net_income)**:利润表中的归母净利润 (A股优先使用 `n_income_attr_p` / `net_profit_attr_p`)。
|
||||||
|
- **净利润增速 (NetIncomeGrowth)**:同上逻辑,只是把收入换成净利润。
|
||||||
|
- **经营净现金流 (ocf)**:经营活动产生的现金流量净额,统一映射为 `ocf` 字段。
|
||||||
|
- **资本开支 (Capex)**:投资活动中购建固定资产、无形资产等的现金流出,取绝对值:
|
||||||
|
\[\text{Capex} = |\text{capex}|\]
|
||||||
|
- **自由现金流 (FCF)**:
|
||||||
|
\[\text{FCF} = \text{经营净现金流(ocf)} - \text{资本开支(Capex)}\]
|
||||||
|
- **分红 (dividends)**:现金流量表中“支付股利、利润或利息的现金流出”,统一到 `dividends` 字段。
|
||||||
|
- **总资产 (total_assets)**:直接取自资产负债表。
|
||||||
|
- **净资产 (total_equity)**:直接取自资产负债表。
|
||||||
|
- **商誉 (goodwill)**:直接取自资产负债表。
|
||||||
|
|
||||||
|
### 2. 费用指标
|
||||||
|
|
||||||
|
- **销售费用率 (SellingRatio)**:
|
||||||
|
\[\text{销售费用率} = \frac{\text{销售费用(selling\\_exp)}}{\text{收入(revenue)}}\]
|
||||||
|
- **管理费用率 (AdminRatio)**:
|
||||||
|
\[\text{管理费用率} = \frac{\text{管理费用(admin\\_exp)}}{\text{收入}}\]
|
||||||
|
- **研发费用率 (RDRatio)**:
|
||||||
|
\[\text{研发费用率} = \frac{\text{研发费用(rd\\_exp)}}{\text{收入}}\]
|
||||||
|
- **其他费用率 (OtherExpenseRatio)**:这是一个“残差项”,按以下方式反推:
|
||||||
|
\[\text{其他费用率} = \text{毛利率} - \text{净利润率} - \text{销售费用率} - \text{管理费用率} - \text{研发费用率}\]
|
||||||
|
若其中某些费用率缺失,则在计算中按 0 处理。
|
||||||
|
- **折旧费用占比 (DepreciationRatio)**:
|
||||||
|
\[\text{折旧占比} = \frac{|\text{折旧费用(depreciation)}|}{\text{收入}}\]
|
||||||
|
- **所得税率 (TaxRate)**:
|
||||||
|
\[\text{所得税率} = \frac{\text{所得税费用(income\\_tax)}}{\text{利润总额(total\\_profit)}}\]
|
||||||
|
|
||||||
|
### 3. 资产占比
|
||||||
|
|
||||||
|
> 所有“XX占比”均使用期末总资产 `total_assets` 作为分母。
|
||||||
|
|
||||||
|
- **现金占比 (CashRatio)**:货币资金 / 总资产。
|
||||||
|
- **库存占比 (InventoryRatio)**:存货 / 总资产。
|
||||||
|
- **应收款占比 (ReceivablesRatio)**:应收账款 / 总资产。
|
||||||
|
- **预付款占比 (PrepaymentRatio)**:预付款项 / 总资产。
|
||||||
|
- **固定资产占比 (FixedAssetsRatio)**:固定资产 / 总资产。
|
||||||
|
- **长期投资占比 (LongTermInvestmentRatio)**:长期股权投资等 / 总资产。
|
||||||
|
- **商誉占比 (GoodwillRatio)**:商誉 / 总资产。
|
||||||
|
- **其他资产占比 (OtherAssetsRatio)**:**这是自定义口径**,用来反映“非核心资产”的残差:
|
||||||
|
\[\text{其他资产占比} = 1 - (\text{现金占比} + \text{库存占比} + \text{应收款占比} + \text{预付款占比} + \text{固定资产占比} + \text{长期投资占比} + \text{商誉占比})\]
|
||||||
|
换句话说,上述“主要资产类别”的占比之和从 1 中扣除,剩余部分统一归入“其他资产”。
|
||||||
|
- **应付款占比 (PayablesRatio)**:应付账款 / 总资产。
|
||||||
|
- **预收款占比 (AdvanceReceiptsRatio)**:
|
||||||
|
\[\text{预收款占比} = \frac{\text{预收账款(adv\\_receipts)} + \text{合同负债(contract\\_liab)}}{\text{总资产}}\]
|
||||||
|
- **短期借款占比 (ShortTermDebtRatio)**:短期借款 / 总资产(含“一年内到期的长期负债”等合并后的口径)。
|
||||||
|
- **长期借款占比 (LongTermDebtRatio)**:长期借款 / 总资产(含公司债等并入的口径)。
|
||||||
|
- **运营资产占比 (OperatingAssetsRatio)**:**也是自定义口径**,用来衡量企业被运营环节占用的资产规模:
|
||||||
|
\[\text{运营资产占比} = \text{库存占比} + \text{应收款占比} + \text{预付款占比} - \text{应付款占比} - \text{预收款占比}\]
|
||||||
|
直观理解:运营资产 = 应收 + 存货 + 预付 − 应付 − 预收。
|
||||||
|
- **有息负债率 (InterestBearingDebtRatio)**:
|
||||||
|
\[\text{有息负债率} = \frac{\text{短期借款} + \text{长期借款}}{\text{总资产}}\]
|
||||||
|
|
||||||
|
### 4. 周转能力
|
||||||
|
|
||||||
|
- **存货周转天数 (InventoryDays)**:
|
||||||
|
\[\text{存货周转天数} = \frac{\text{存货} \times 365}{\text{销售成本(cogs)}}\]
|
||||||
|
- **应收款周转天数 (ReceivablesDays)**:
|
||||||
|
\[\text{应收款周转天数} = \frac{\text{应收账款} \times 365}{\text{收入}}\]
|
||||||
|
- **应付款周转天数 (PayablesDays)**:
|
||||||
|
\[\text{应付款周转天数} = \frac{\text{应付账款} \times 365}{\text{销售成本(cogs)}}\]
|
||||||
|
- **固定资产周转率 (FixedAssetsTurnover)**:
|
||||||
|
\[\text{固定资产周转率} = \frac{\text{收入}}{\text{固定资产}}\]
|
||||||
|
- **总资产周转率 (TotalAssetTurnover)**:
|
||||||
|
\[\text{总资产周转率} = \frac{\text{收入}}{\text{总资产}}\]
|
||||||
|
|
||||||
|
### 5. 人均效率
|
||||||
|
|
||||||
|
> 员工相关数据主要来自市场数据接口(如 Tushare 的 `stock_company`),并被挂到最近一个年度报告期(年报,通常是 12 月 31 日)上。
|
||||||
|
|
||||||
|
- **员工人数 (Employees)**:公司披露的员工总数。
|
||||||
|
- **人均创收 (RevenuePerEmp)**:
|
||||||
|
\[\text{人均创收} = \frac{\text{年度收入}}{\text{员工人数}}\]
|
||||||
|
- **人均创利 (ProfitPerEmp)**:
|
||||||
|
\[\text{人均创利} = \frac{\text{年度净利润}}{\text{员工人数}}\]
|
||||||
|
- **人均薪酬 (AvgWage)**:
|
||||||
|
\[\text{人均薪酬} = \frac{\text{支付给职工及为职工支付的现金}}{\text{员工人数}}\]
|
||||||
|
|
||||||
|
### 6. 市场表现
|
||||||
|
|
||||||
|
- **股价 (Price)**:来自 Tushare `daily_basic` 或 Alpha Vantage `GLOBAL_QUOTE` 的收盘价。
|
||||||
|
- **市值 (MarketCap)**:
|
||||||
|
- A股 / 港股:基于 Tushare 的总市值字段 `total_mv`,内部统一换算为货币金额(再在展示层以“亿元”为单位显示)。
|
||||||
|
- 美股:直接使用 Alpha Vantage `MarketCapitalization` 字段。
|
||||||
|
- **PE / PB**:直接使用数据源的市盈率、市净率字段,用于横向比较。
|
||||||
|
- **股东户数 (Shareholders)**:来自 Tushare 的 `stk_holdernumber`,在历史模式下会按报告期向前寻找最近一次披露的数据。
|
||||||
|
|
||||||
|
## 输出文件
|
||||||
|
|
||||||
|
程序运行成功后,会创建相应的 `data/<MARKET>/<SYMBOL>/` 目录,并在其中生成两份报告文件:
|
||||||
|
- `report.html`: 优化阅读体验的网页版报告。
|
||||||
|
- `report.md`: Markdown格式的纯文本报告。
|
||||||
13
data/CN/300750.SZ/balance_sheet.csv
Normal file
13
data/CN/300750.SZ/balance_sheet.csv
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
ts_code,ann_date,f_ann_date,date,report_type,comp_type,end_type,total_share,cap_rese,undistr_porfit,surplus_rese,special_rese,money_cap,trad_asset,notes_receiv,accounts_receiv,oth_receiv,prepayment,div_receiv,int_receiv,inventories,amor_exp,nca_within_1y,sett_rsrv,loanto_oth_bank_fi,premium_receiv,reinsur_receiv,reinsur_res_receiv,pur_resale_fa,oth_cur_assets,current_assets,fa_avail_for_sale,htm_invest,lt_eqt_invest,invest_real_estate,time_deposits,oth_assets,lt_rec,fix_assets,cip,const_materials,fixed_assets_disp,produc_bio_assets,oil_and_gas_assets,intan_assets,r_and_d,goodwill,lt_amor_exp,defer_tax_assets,decr_in_disbur,oth_nca,total_nca,cash_reser_cb,depos_in_oth_bfi,prec_metals,deriv_assets,rr_reins_une_prem,rr_reins_outstd_cla,rr_reins_lins_liab,rr_reins_lthins_liab,refund_depos,ph_pledge_loans,refund_cap_depos,indep_acct_assets,client_depos,client_prov,transac_seat_fee,invest_as_receiv,total_assets,lt_borr,st_borr,cb_borr,depos_ib_deposits,loan_oth_bank,trading_fl,notes_payable,acct_payable,adv_receipts,sold_for_repur_fa,comm_payable,payroll_payable,taxes_payable,int_payable,div_payable,oth_payable,acc_exp,deferred_inc,st_bonds_payable,payable_to_reinsurer,rsrv_insur_cont,acting_trading_sec,acting_uw_sec,non_cur_liab_due_1y,oth_cur_liab,current_liabilities,bond_payable,lt_payable,specific_payables,estimated_liab,defer_tax_liab,defer_inc_non_cur_liab,oth_ncl,total_ncl,depos_oth_bfi,deriv_liab,depos,agency_bus_liab,oth_liab,prem_receiv_adva,depos_received,ph_invest,reser_une_prem,reser_outstd_claims,reser_lins_liab,reser_lthins_liab,indept_acc_liab,pledge_borr,indem_payable,policy_div_payable,total_liabilities,treasury_share,ordin_risk_reser,forex_differ,invest_loss_unconf,minority_int,total_equity,total_hldr_eqy_inc_min_int,total_liab_hldr_eqy,lt_payroll_payable,oth_comp_income,oth_eqt_tools,oth_eqt_tools_p_shr,lending_funds,acc_receivable,st_fin_payable,payables,hfs_assets,hfs_sales,cost_fin_assets,fair_value_fin_assets,contract_assets,contract_liab,accounts_receiv_bill,accounts_pay,oth_rcv_total,fix_assets_total,cip_total,oth_pay_total,long_pay_total,debt_invest,oth_debt_invest,update_flag
|
||||||
|
300750.SZ,20251021,20251021,20250930,1,1,3,4562854001.0,156365576000.0,151715049000.0,2272701000.0,38434000.0,324241586000.0,43260528000.0,418837000.0,66481235000.0,,13557167000.0,75434000.0,,80211558000.0,,98616000.0,,,,,,,10578550000.0,574228137000.0,,,59831799000.0,,,,193099000.0,128622702000.0,37365635000.0,,,,,15025388000.0,,890939000.0,4908611000.0,28542552000.0,,23937431000.0,321853995000.0,,,,36492000.0,,,,,,,,,,,,,896082131000.0,78441925000.0,15314463000.0,,,,,82967668000.0,131958477000.0,,,,21821691000.0,8851546000.0,,98000000.0,,,,,,,,,25005358000.0,4985363000.0,340940328000.0,8422115000.0,,,85843047000.0,2261098000.0,25224182000.0,4739536000.0,208129732000.0,,,,,,,,,,,,,,,,,549070060000.0,7097993000.0,,,,32764095000.0,314247976000.0,347012071000.0,896082131000.0,,6391356000.0,,,,,,,,,,,398446000.0,40678197000.0,66900072000.0,214926145000.0,2862290000.0,128622702000.0,37365635000.0,9357565000.0,1519965000.0,,,1
|
||||||
|
300750.SZ,20250315,20250315,20241231,1,1,4,4403466458.0,116756136000.0,126601541000.0,2194779000.0,35551000.0,303511993000.0,14282253000.0,130403000.0,64135510000.0,2141729000.0,5969685000.0,65217000.0,1000.0,59835533000.0,,72972000.0,,,,,,,6286465000.0,510142089000.0,,,54791525000.0,,,,151342000.0,112589053000.0,29754703000.0,,,,,14419804000.0,,894757000.0,4593980000.0,24118834000.0,,19275483000.0,276516035000.0,,,,,,,,,,,,,,,,,786658123000.0,81238456000.0,19696282000.0,,,,,67356323000.0,130977408000.0,,,,18653079000.0,9436442000.0,0.0,5400161000.0,10761762000.0,,,,,,,,22881417000.0,2058196000.0,317171534000.0,11922623000.0,1606480000.0,0.0,71926943000.0,1231236000.0,22041069000.0,5400795000.0,196030416000.0,,2116017000.0,,,,,,,,,,,,,,,513201949000.0,2712804000.0,,,,26526141000.0,246930033000.0,273456174000.0,786658123000.0,,-348637000.0,,,,,,,,,,,400626000.0,27834446000.0,64265913000.0,198333731000.0,2206947000.0,112589053000.0,29754703000.0,16161923000.0,1606480000.0,,,0
|
||||||
|
300750.SZ,20241019,20241019,20240930,1,1,3,4402375669.0,115137443600.0,117181223700.0,2192566200.0,33103400.0,264675795100.0,22002410300.0,292441400.0,66702709300.0,,6887337600.0,504261300.0,,55215275300.0,,200635500.0,,,,,,,6577524400.0,466764516700.0,,,54175331200.0,,,,128324700.0,110653484500.0,25200973600.0,,,,,14448153400.0,,883700900.0,4528856500.0,22121062800.0,,22428362600.0,271470487700.0,,,,,,,,,,,,,,,,,738235004400.0,85444436200.0,15239389800.0,,,,,63651540000.0,123140013700.0,,,,17368871900.0,8144202500.0,,22722000.0,,,,,,,,,16081511700.0,2926818100.0,281070698000.0,12104785500.0,,,65430208700.0,1180577400.0,21899574000.0,5492450500.0,193863663000.0,,2499377200.0,,,,,,,,,,,,,,,474934361000.0,2776131700.0,,,,26344412200.0,236956231200.0,263300643400.0,738235004400.0,,785650400.0,,,,,,,,,,,363142300.0,22651661600.0,66995150700.0,186791553700.0,3444015600.0,110653484500.0,25200973600.0,9367311600.0,1594834100.0,,,0
|
||||||
|
300750.SZ,20240316,20240316,20231231,1,1,4,4399041236.0,87907212600.0,103244625900.0,2192566200.0,9355000.0,264306514700.0,7767200.0,1751724600.0,64020533400.0,3012579200.0,6962872600.0,425984800.0,0.0,45433890100.0,,56827500.0,,,,,,,8286024600.0,449788001700.0,,,50027694100.0,,,,9839600.0,115387960100.0,25011907100.0,,,,,15675876200.0,,707881700.0,4695780000.0,17395585300.0,,21145073300.0,267380039400.0,,,,,,,,,,,,,,,,,717168041100.0,83448981700.0,15181012100.0,,,,,77514940700.0,117038773600.0,,,,14846251200.0,11741826300.0,0.0,29915700.0,13624086000.0,,,,,,,,7008874200.0,2091627800.0,287001069100.0,19237014400.0,1520256200.0,0.0,51638913500.0,1364905800.0,21448987400.0,31341466200.0,210283821400.0,,3941409600.0,,,,,,,,,,,,,,,497284890500.0,1572971600.0,,,,22175098200.0,197708052400.0,219883150600.0,717168041100.0,,1528223100.0,,,,,,,,,,,233964100.0,23982351900.0,65772258000.0,194553714300.0,3438564000.0,115387960100.0,25011907100.0,13654001700.0,1520256200.0,,,1
|
||||||
|
300750.SZ,20230310,20230310,20221231,1,1,4,2442514524.0,88904372100.0,63242753100.0,1214302900.0,,191043409500.0,1981328100.0,3526083700.0,57966516900.0,8678379900.0,15843284400.0,,,76668898800.0,,403711500.0,,,,,,,11907028600.0,387734857000.0,,,17595207400.0,,,,44316100.0,89070834700.0,35397650600.0,,,,,9539963200.0,,704065200.0,2294776000.0,9483660400.0,,25101316500.0,213217494900.0,,,,575638000.0,,,,,,,,,,,,,600952351900.0,59099358400.0,14415402500.0,,,,,126229468200.0,94534976000.0,,,,9476018400.0,4792441200.0,,8319600.0,15005751100.0,,,,,,,,7232224400.0,1622032600.0,295761419300.0,19177888600.0,1050000000.0,0.0,19697374600.0,1807813000.0,19966701700.0,6910284100.0,128281770600.0,,,,,,,,,,,,,,,,,424043189900.0,253991000.0,,,,12427910400.0,164481251600.0,176909162000.0,600952351900.0,,8931300000.0,,,,,,,,,,,174863000.0,22444785300.0,61492600600.0,220764444200.0,8678379900.0,89070834700.0,35397650600.0,15014070600.0,1050000000.0,,,0
|
||||||
|
300750.SZ,20220422,20220422,20211231,1,1,4,2330851200.0,43163696500.0,34095467500.0,1158471200.0,,89071889700.0,1363972900.0,1463828000.0,23753548200.0,3114909600.0,6466439300.0,,,40199691900.0,,201655900.0,,,,,,,5292231900.0,177734938700.0,,,10949033600.0,,,,619282400.0,41275333300.0,30998159500.0,,,,,4479606400.0,,527850700.0,1264339100.0,5542554400.0,,20575419100.0,129931922300.0,,,,243105100.0,,,,,,,,,,,,,307666860900.0,22119078800.0,12123056900.0,,,,,58405751300.0,48784286300.0,,,,5122787800.0,2403797500.0,0.0,6590800.0,6169623600.0,,,,,,,,3548532800.0,1242490300.0,149344832600.0,15855052000.0,1010000000.0,0.0,9953762700.0,1038576900.0,12099359100.0,3228720400.0,65699853800.0,,,,,,,,,,,,,,,,,215044686400.0,443534900.0,,,,8108903200.0,84513271300.0,92622174500.0,307666860900.0,,4208319800.0,,,,,,,,,,,77285500.0,11537915300.0,25217376200.0,107190037600.0,3114909600.0,41275333300.0,30998159500.0,6176214400.0,1010000000.0,,,0
|
||||||
|
300750.SZ,20210428,20210428,20201231,1,1,4,2329474028.0,41662151603.08,18640918703.75,1157782633.55,,68424116053.67,3288071512.61,9877156349.23,11293523722.88,3303956813.15,997118630.25,,,13224640950.39,,81548616.67,,,,,,,969240539.21,112864989321.68,,,4813072905.14,,,,372156591.66,19621648443.02,5750351820.37,,,,,2517935725.46,,147951887.23,363551716.95,3167109948.33,,5002631587.8,43753437618.91,,,,1330347108.86,,,,,,,,,,,,,156618426940.59,6068163254.2,6335080182.17,,,,,15636589526.9,15634844308.52,,,,2657564914.42,1321059090.43,0.0,6172824.12,4401603465.43,,,,,,,,1349038696.49,760008999.58,54977189803.22,14382255950.87,1193938630.3,0.0,6797704877.32,85518810.08,3918939197.71,,32446520720.48,,,,,,,,,,,,,,,,,87423710523.7,710020552.82,,,,4987417050.31,64207299366.58,69194716416.89,156618426940.59,,1126992951.02,,,,,,,,,,,75269024.76,6875227795.16,21170680072.11,31271433835.42,3303956813.15,19621648443.02,5750351820.37,4407776289.55,1193938630.3,,,1
|
||||||
|
300750.SZ,20200425,20200425,20191231,1,1,4,2208399700.0,21630448577.59,13652965292.41,1097245469.55,,32269635327.07,1389585592.37,9649949692.85,8338535645.35,4568565748.8,538163094.42,,,11480549879.88,,,,,,,,,1647816662.94,71694937173.28,,,1540452827.51,,,,,17417348593.44,1996524778.01,,,,,2302317207.14,,147951887.23,394096018.07,2079210533.02,,2248533970.82,29657039538.04,,,,1812135529.6,,,,,,,,,,,,,101351976711.32,4980563181.26,2125646681.77,,,,286915936.0,17420197790.4,10692137500.67,6161443242.83,,,1582275521.53,962984568.04,,2418687.95,5295890304.78,,,,,,,,1077468495.09,,45607378729.06,1508339195.7,873618580.61,,5289773262.4,91191949.71,813236654.86,,13556722824.54,,,,,,,,,,,,,,,,,59164101553.6,1074894790.0,,,,4052891263.24,38134983894.48,42187875157.72,101351976711.32,,620819644.93,,,,,,,,,,,,,17988485338.2,28112335291.07,4568565748.8,17417348593.44,1996524778.01,5298308992.73,873618580.61,,,0
|
||||||
|
300750.SZ,20190425,20190425,20181231,1,1,4,2195017400.0,21372918712.25,9515006632.3,985878418.69,,27731189739.92,,9742890628.44,6224857396.53,589281314.94,864640798.47,,92808117.05,7076101849.47,,,,,,,,,1076991664.73,53911422755.37,1516521098.2,,965198180.81,,,,,11574665757.11,1623838222.94,,,,,1346171137.42,,100419270.78,305828515.4,1240737742.63,,1298901335.85,19972281261.14,,,,512661245.82,,,,,,,,,,,,,73883704016.51,3490767815.96,1180092100.11,,,,314247518.1,11841128076.55,7057075077.4,4994400867.91,,,1122253456.83,722536564.72,19842845.23,,2904341329.33,,,,,,,,929024032.37,,31084941868.55,,943414523.31,,2512382681.52,40984489.33,611042047.22,,7598591557.34,,,,,,,,,,,,,,,,,38683533425.89,793701060.0,,,,2261889695.31,32938280895.31,35200170590.62,73883704016.51,,-336839207.93,,,,,,,,,,,,,15967748024.97,18898203153.95,682089431.99,11574665757.11,1623838222.94,2924184174.56,943414523.31,,,0
|
||||||
|
300750.SZ,20180522,20180522,20171231,1,1,4,1955193267.0,15354587816.94,6504904798.9,638253676.69,,14080936626.3,,5458335290.35,6918521550.9,90630850.1,305835456.79,,52310504.72,3417757092.32,,,,,,,,,2695030983.77,33033102914.27,1961291000.0,,791027220.9,,,,,8219496581.74,2974364031.46,,,,,1408760249.33,,100419270.78,139310483.53,510045198.34,,525068808.1,16629782844.18,,,,13744559.02,,,,,,,,,,,,,49662885758.45,2129095275.13,2245096000.7,,,,,8812715586.2,4978257325.43,203165478.74,,,517308034.99,436196766.94,15205262.28,,317156883.9,,,,,,,,364944599.97,,17890045939.15,,895045177.66,,1789007284.61,68992112.81,419460871.47,,5301600721.68,,,,,,,,,,,,,,,,,23191646660.83,,,,,1769799526.51,24701439571.11,26471239097.62,49662885758.45,,248500011.58,,,,,,,,,,,,,12376856841.25,13790972911.63,142941354.82,8219496581.74,2974364031.46,332362146.18,895045177.66,,,0
|
||||||
|
300750.SZ,20180522,20180522,20161231,1,1,4,613321800.0,11608553987.09,2965362316.99,299841288.9,,2456530834.16,,570522837.1,7315840024.05,183806946.21,101183102.22,,7564477.11,1359772316.12,,,,,,,,,9760704235.56,21761324772.53,143400000.0,,169658176.39,,,,,3727473865.79,1226129855.44,,,,,621645950.26,,100419270.78,14206421.31,264912007.47,,559144024.11,6826989571.55,,,,,,,,,,,,,,,,,28588314344.08,302000000.0,1226587998.8,,,,,4394039468.71,3173395264.55,87727135.56,,,446249267.28,248297683.21,5776292.16,,360240077.32,,,,,,,,240511234.77,,10182824422.36,,950079201.39,,930580458.65,28130130.54,403581087.31,,2614370877.89,,,,,,,,,,,,,,,,,12797195300.25,,,,,302472760.51,15488646283.32,15791119043.83,28588314344.08,,1566890.34,,,,,,,5400000.0,,,,,,7886362861.15,7567434733.26,191371423.32,3727473865.79,1226129855.44,366016369.48,950079201.39,,,0
|
||||||
|
300750.SZ,20180522,20180522,20151231,1,1,4,470590000.0,369014163.84,376303017.19,37079169.44,,1292935327.52,,422182294.7,2393930005.73,55484188.21,70469398.58,,,1041611188.85,,,,,,,,,227855161.28,5504467564.87,5000000.0,,,,,,,1313098299.52,474893794.61,,6710.03,,,502758023.88,,100419270.78,6133369.98,135241432.42,,630939035.37,3168489936.59,,,,,,,,,,,,,,,,,8672957501.46,,576558942.87,,,,,1041204473.76,1472399950.48,170045760.44,,,198490932.79,252617557.72,3639309.42,,311755056.01,,,,,,,,1322574459.48,,5349286442.97,,917666570.26,,581118102.95,30220779.54,296337217.09,,1825342669.84,,,,,,,,,,,,,,,,,7174629112.81,,,,,244663210.07,1253665178.58,1498328388.65,8672957501.46,,678828.11,,,,,,,,,,,,,2816112300.43,2513604424.24,55484188.21,1313105009.55,474893794.61,315394365.43,917666570.26,,,0
|
||||||
|
13
data/CN/300750.SZ/cash_flow.csv
Normal file
13
data/CN/300750.SZ/cash_flow.csv
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
ts_code,ann_date,f_ann_date,date,comp_type,report_type,end_type,net_profit,finan_exp,c_fr_sale_sg,recp_tax_rends,n_depos_incr_fi,n_incr_loans_cb,n_inc_borr_oth_fi,prem_fr_orig_contr,n_incr_insured_dep,n_reinsur_prem,n_incr_disp_tfa,ifc_cash_incr,n_incr_disp_faas,n_incr_loans_oth_bank,n_cap_incr_repur,c_fr_oth_operate_a,c_inf_fr_operate_a,c_paid_goods_s,c_paid_to_for_empl,c_paid_for_taxes,n_incr_clt_loan_adv,n_incr_dep_cbob,c_pay_claims_orig_inco,pay_handling_chrg,pay_comm_insur_plcy,oth_cash_pay_oper_act,st_cash_out_act,net_cash_flow,oth_recp_ral_inv_act,c_disp_withdrwl_invest,c_recp_return_invest,n_recp_disp_fiolta,n_recp_disp_sobu,stot_inflows_inv_act,c_pay_acq_const_fiolta,c_paid_invest,n_disp_subs_oth_biz,oth_pay_ral_inv_act,n_incr_pledge_loan,stot_out_inv_act,n_cashflow_inv_act,c_recp_borrow,proc_issue_bonds,oth_cash_recp_ral_fnc_act,stot_cash_in_fnc_act,free_cashflow,c_prepay_amt_borr,c_pay_dist_dpcp_int_exp,incl_dvd_profit_paid_sc_ms,oth_cashpay_ral_fnc_act,stot_cashout_fnc_act,n_cash_flows_fnc_act,eff_fx_flu_cash,n_incr_cash_cash_equ,c_cash_equ_beg_period,c_cash_equ_end_period,c_recp_cap_contrib,incl_cash_rec_saims,uncon_invest_loss,prov_depr_assets,depreciation,amort_intang_assets,lt_amort_deferred_exp,decr_deferred_exp,incr_acc_exp,loss_disp_fiolta,loss_scr_fa,loss_fv_chg,invest_loss,decr_def_inc_tax_assets,incr_def_inc_tax_liab,decr_inventories,decr_oper_payable,incr_oper_payable,others,im_net_cashflow_oper_act,conv_debt_into_cap,conv_copbonds_due_within_1y,fa_fnc_leases,im_n_incr_cash_equ,net_dism_capital_add,net_cash_rece_sec,credit_impa_loss,use_right_asset_dep,oth_loss_asset,end_bal_cash,beg_bal_cash,end_bal_cash_equ,beg_bal_cash_equ,update_flag
|
||||||
|
300750.SZ,20251021,20251021,20250930,1,1,3,,,338126567000.0,6320906000.0,,,,,,,,,,,,18609171000.0,363056644000.0,224120825000.0,23413386000.0,26742749000.0,,,,,,8119254000.0,282396214000.0,80660430000.0,19691000.0,4443202000.0,1942895000.0,68109000.0,27411000.0,6501309000.0,30087780000.0,31540210000.0,2045273000.0,119537000.0,,63792799000.0,-57291490000.0,30597681000.0,,1125480000.0,74995566000.0,,32237114000.0,33558798000.0,,4923115000.0,70719026000.0,4276539000.0,-621254000.0,27024225000.0,270159734000.0,297183959000.0,43272406000.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0
|
||||||
|
300750.SZ,20250315,20250315,20241231,1,1,4,54006794000.0,5165670000.0,417525378000.0,10506188000.0,,,,,,,,,,,,16847851000.0,444879417000.0,285455632000.0,25499653000.0,28529188000.0,,,,,,8404599000.0,347889072000.0,96990345000.0,963920000.0,2028899000.0,1838083000.0,75110000.0,,4906012000.0,31179943000.0,22169451000.0,244022000.0,187907000.0,,53781323000.0,-48875311000.0,30540129000.0,,292179000.0,33392735000.0,,19972240000.0,25807432000.0,496051000.0,2137299000.0,47916971000.0,-14524236000.0,-1596552000.0,31994247000.0,238165487000.0,270159734000.0,2560428000.0,1959694000.0,,8423325000.0,22437872000.0,470401000.0,1790382000.0,,,-19319000.0,257488000.0,-664223000.0,-4384806000.0,-6700359000.0,320345000.0,-16606853000.0,634969000.0,31206935000.0,,96990345000.0,,,,31994247000.0,,,872526000.0,239273000.0,,270159734000.0,238165487000.0,,,0
|
||||||
|
300750.SZ,20241019,20241019,20240930,1,1,3,,,317539939100.0,8174888000.0,,,,,,,,,,,,10828118000.0,336542945100.0,220637018600.0,19328624300.0,23235105400.0,,,,,,5898595800.0,269099344000.0,67443601100.0,525584000.0,512532700.0,1472067000.0,55631200.0,,2565814800.0,21268347400.0,28950734900.0,241214500.0,,,50460296800.0,-47894481900.0,17823560900.0,,,19734321900.0,-13691482401.3572,13951582300.0,24858845700.0,496051400.0,1419576600.0,40230004500.0,-20495682600.0,-2265019600.0,-3211583000.0,238165486900.0,234953903900.0,1910761000.0,1488073700.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
|
||||||
|
300750.SZ,20240316,20240316,20231231,1,1,4,46761034500.0,3013733800.0,417943222600.0,12739610500.0,,,,,,,,,,,,15724664000.0,446407497100.0,310521178200.0,21140596600.0,17117191500.0,,,,,,4802406300.0,353581372700.0,92826124400.0,1239798700.0,7651158400.0,1711392900.0,12853500.0,3306900.0,10618510400.0,33624896500.0,5649689400.0,321445400.0,210243200.0,,39806274600.0,-29187764200.0,46595746400.0,,366758000.0,50286500800.0,32528281889.0684,23795322000.0,9481092900.0,469828200.0,2293723300.0,35570138100.0,14716362700.0,2181446800.0,80536169700.0,157629317200.0,238165486900.0,3323996400.0,2926448200.0,,5853926900.0,21098130600.0,330992000.0,1099265800.0,,,-16983500.0,55557800.0,-46270400.0,-3825925800.0,-7809038300.0,156446100.0,31029323200.0,-34168243000.0,29013934100.0,,92826124400.0,,,,80536169700.0,,,254041400.0,117593400.0,,238165486900.0,157629317200.0,,,1
|
||||||
|
300750.SZ,20230310,20230310,20221231,1,1,4,33457143500.0,969747300.0,305775248400.0,9478689900.0,,,,,,,,,,,,14557214600.0,329811152800.0,235327104000.0,18157352000.0,10529733400.0,,,,,,4588120100.0,268602309600.0,61208843300.0,1531307500.0,1307996200.0,740372300.0,593900.0,,3580269900.0,48215268100.0,12764660700.0,,6740182400.0,,67720111200.0,-64139841300.0,50957726600.0,,5208177600.0,103621111500.0,26286437536.8799,17605770500.0,3551469400.0,,197440400.0,21354680400.0,82266431200.0,2788148900.0,82123582000.0,75505735200.0,157629317200.0,47455207300.0,2092259300.0,,2826926600.0,11960578600.0,236449600.0,894129200.0,,,5322700.0,37927500.0,-400241300.0,-3044935500.0,-4451227000.0,9145100.0,-39877670300.0,-58697293400.0,115418278300.0,,61208843300.0,,,,82123582000.0,,,1146247900.0,161383600.0,,157629317200.0,75505735200.0,,,0
|
||||||
|
300750.SZ,20220422,20220422,20211231,1,1,4,17860730100.0,1580329100.0,130616575600.0,414542800.0,,,,,,,,,,,,14298549300.0,145329667700.0,86393876300.0,9423183000.0,4127789000.0,,,,,,2476810700.0,102421659000.0,42908008700.0,4094314000.0,571745100.0,228638800.0,3223100.0,58414400.0,4956335300.0,43767770800.0,11725718900.0,295800300.0,2948104700.0,,58737394700.0,-53781059400.0,26276582500.0,,3235028400.0,31063023600.0,21236726212.8648,5457907900.0,1568025100.0,,378512600.0,7404445600.0,23658578000.0,-711778200.0,12073749200.0,63431986000.0,75505735200.0,1551412800.0,795200000.0,,2047739400.0,5847138200.0,159202600.0,340253100.0,,,23190300.0,67375700.0,,-1561030800.0,-1232106000.0,215449900.0,-28856721000.0,-27816000500.0,73855678100.0,,42908008700.0,,,,12073749200.0,,,,90030200.0,,75505735200.0,63431986000.0,,,1
|
||||||
|
300750.SZ,20210428,20210428,20201231,1,1,4,6103918052.46,772394855.22,54002988575.54,151928522.94,,,,,,,,,,,,6397335867.06,60552252965.54,33461951736.87,4027848128.71,2265587429.63,,,,,,2366963038.37,42122350333.58,18429902631.96,2735874410.58,44779761.91,24087086.33,24649.08,,2804765907.9,13302355759.04,4088418479.98,,466447835.43,,17857222074.45,-15052456166.55,9450920678.78,,13199266407.5,43186548078.44,-3068497270.4043,4743701233.75,898809819.12,7825842.99,112602486.19,5755113539.06,37431434539.38,-576950661.91,40231930342.88,23200055644.02,63431985986.9,20536360992.16,923523424.41,,1169471948.67,4576797794.5,135243814.08,155847906.24,,,9890379.23,47137042.0,-286915936.0,26192466.45,-772834310.15,-5673139.63,-2401630461.19,-3415569969.88,11747641389.69,,18429902631.96,,,,40231930342.88,,,,,,63431985986.9,23200055644.02,,,1
|
||||||
|
300750.SZ,20200425,20200425,20191231,1,1,4,5012673897.87,270468281.25,52149078427.56,395686584.53,,,,,,,,,,,,3763244302.06,56308009314.15,33260080970.87,3704062487.97,2688800053.78,,,,,,3183111244.73,42836054757.35,13471954556.8,15477402748.49,0.23,2563085.15,15088255.27,10026813.18,15505080902.32,9626986411.07,907758218.55,,3114021020.85,,13648765650.47,1856315251.85,4616632167.94,,1498800000.0,7333217057.62,-817733.8461,2418452429.42,573302388.77,,173132704.46,3164887522.65,4168329534.97,14801651.37,19511400994.99,3688654649.03,23200055644.02,1217784889.68,721974398.68,,1670005549.8,4137828483.56,113911953.13,157299905.57,,,-1382204.06,18928639.15,-27331582.1,-20752318.89,-838669146.42,50207460.38,-5775387378.74,-4768945377.05,12637959848.72,,13471954556.8,,,,19511400994.99,,,,,,23200055644.02,3688654649.03,,,0
|
||||||
|
300750.SZ,20190425,20190425,20181231,1,1,4,3735896487.72,262258592.79,33853639616.99,37127687.41,,,,,,,,,,,,2274383357.82,36165150662.22,19041614626.94,2299961469.07,1868081717.0,,,,,,1639227148.68,24848884961.69,11316265700.53,70629509.16,5258600.0,3655688.2,294506.1,,79838303.46,6629274672.98,192025942.3,,12746210861.04,,19567511476.32,-19487673172.86,4123196326.07,,510282473.44,10908434734.88,5771848024.1698,3493721841.0,216119536.13,,155877429.51,3865718806.64,7042715928.24,27440781.07,-1101250763.02,4789905412.05,3688654649.03,6274955935.37,108785163.6,,974912150.01,2125110234.63,95733856.19,83377065.66,,,91538964.57,15782022.0,314247518.1,-184397531.48,-669755258.27,15459358.23,-4371312786.43,-3143244270.65,11851141407.59,119517889.87,11316265700.53,,,,-1101250763.02,,,,,,3688654649.03,4789905412.05,,,0
|
||||||
|
300750.SZ,20180522,20180522,20171231,1,1,4,4194056577.66,112588566.26,18872908615.92,21013193.89,,,,,,,,,,,,529176792.58,19423098602.39,12357592298.17,2122637417.2,1493296692.69,,,,,,1108823984.08,17082350392.14,2340748210.25,758831340.52,448002008.14,2565089.09,572921.94,,1209971359.69,7180281117.24,1665503314.78,,656.0,,8845785088.02,-7635813728.33,4476769278.83,,9028894.69,10664444151.52,4099608510.9298,1421628377.86,81600198.58,,228481941.8,1731710518.24,8932733633.28,-13763656.75,3623904458.45,1166000953.6,4789905412.05,6178645978.0,1168645100.0,,244744030.88,1279538608.41,75101189.69,26541967.12,,,78311541.52,,,-1344305303.77,-245133190.87,-2604999.44,-2290181545.88,-5075995986.77,5163299958.56,124786796.88,2340748210.25,,,,3623904458.45,,,,,,4789905412.05,1166000953.6,,,0
|
||||||
|
300750.SZ,20180522,20180522,20161231,1,1,4,2918436854.29,65609349.18,11524664337.65,1476437.43,,,,,,,,,,,,421522517.2,11947663292.28,5954917349.27,1249671965.87,1559891278.12,,,,,,1074055972.23,9838536565.49,2109126726.79,61944950.69,10027000.0,,5046154.0,,77018104.69,2800818908.69,262828666.62,,9441784763.04,,12505432338.35,-12428414233.66,1930654288.91,,747351550.61,13809851365.52,-10067555462.0948,937312259.12,53696810.21,,1847820297.11,2838829366.44,10971021999.08,-2077449.43,649657042.78,516343910.82,1166000953.6,11131845526.0,7840000.0,,233858870.04,731417250.67,47998770.85,5071074.74,,,158205248.94,,,-76080348.84,-129670575.05,-2090649.0,-320169108.33,-14762136096.64,13031595453.28,207080632.66,2109126726.79,,,,649657042.78,,,,,,1166000953.6,516343910.82,,,0
|
||||||
|
300750.SZ,20180522,20180522,20151231,1,1,4,950581074.45,113184042.2,4153743551.55,670144.46,,,,,,,,,,,,221173494.7,4375587190.71,2302132506.69,437554338.26,474554245.93,,,,,,496812115.82,3711053206.7,664533984.01,1088566666.05,,,,,1088566666.05,1553786649.12,,173225298.0,2900000.0,,1729911947.12,-641345281.07,830867703.13,,893371268.45,1874742721.58,1290805842.4247,628641795.8,69496886.29,,736699312.71,1434837994.8,439904726.78,-800509.91,462292919.81,54050991.01,516343910.82,150503750.0,500000.0,,58641678.66,164100734.24,24986934.33,3237903.35,,,590103.88,,,-1455431.76,-110143619.54,-2194284.46,-697915929.01,-2315594532.87,2476515310.54,,664533984.01,,,,462292919.81,,,,,,516343910.82,54050991.01,,,0
|
||||||
|
13
data/CN/300750.SZ/income_statement.csv
Normal file
13
data/CN/300750.SZ/income_statement.csv
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
ts_code,ann_date,f_ann_date,date,report_type,comp_type,end_type,basic_eps,diluted_eps,total_revenue,revenue,int_income,prem_earned,comm_income,n_commis_income,n_oth_income,n_oth_b_income,prem_income,out_prem,une_prem_reser,reins_income,n_sec_tb_income,n_sec_uw_income,n_asset_mg_income,oth_b_income,fv_value_chg_gain,invest_income,ass_invest_income,forex_gain,total_cogs,oper_cost,int_exp,comm_exp,biz_tax_surchg,sell_exp,admin_exp,fin_exp,assets_impair_loss,prem_refund,compens_payout,reser_insur_liab,div_payt,reins_exp,oper_exp,compens_payout_refu,insur_reser_refu,reins_cost_refund,other_bus_cost,operate_profit,non_oper_income,non_oper_exp,nca_disploss,total_profit,income_tax,n_income,net_income,minority_gain,oth_compr_income,t_compr_income,compr_inc_attr_p,compr_inc_attr_m_s,ebit,ebitda,insurance_exp,undist_profit,distable_profit,rd_exp,fin_exp_int_exp,fin_exp_int_inc,transfer_surplus_rese,transfer_housing_imprest,transfer_oth,adj_lossgain,withdra_legal_surplus,withdra_legal_pubfund,withdra_biz_devfund,withdra_rese_fund,withdra_oth_ersu,workers_welfare,distr_profit_shrhder,prfshare_payable_dvd,comshare_payable_dvd,capit_comstock_div,continued_net_profit,update_flag
|
||||||
|
300750.SZ,20251021,20251021,20250930,1,1,3,11.02,11.02,283071987000.0,283071987000.0,,,,,,,,,,,,,,,878537000.0,5236818000.0,4943750000.0,,236417478000.0,211427147000.0,,,1843066000.0,2408522000.0,8231715000.0,-7015786000.0,-4077847000.0,,,,,,,,,,,60552312000.0,372284000.0,212195000.0,,60712402000.0,8415535000.0,52296866000.0,49034109000.0,3262757000.0,7455238000.0,59752104000.0,56472049000.0,3280055000.0,51409807000.0,,,,,15067826000.0,2183477000.0,8060682000.0,,,,,,,,,,,,,,,52296866000.0,1
|
||||||
|
300750.SZ,20250315,20250315,20241231,1,1,4,11.58,11.58,362012554000.0,362012554000.0,,,,,,,,,,,,,,,664223000.0,3987823000.0,3743040000.0,,312599750000.0,273518959000.0,,,2057466000.0,3562797000.0,9689839000.0,-4131918000.0,-8423325000.0,,,,,,,,,,,64051799000.0,135422000.0,1005182000.0,,63182039000.0,9175245000.0,54006794000.0,50744682000.0,3262113000.0,-1687613000.0,52319181000.0,48940398000.0,3378782000.0,61464661000.0,86402589000.0,,,,18606756000.0,3879076000.0,9502997000.0,,,,,,,,,,,,,,,54006794000.0,1
|
||||||
|
300750.SZ,20241019,20241019,20240930,1,1,3,8.1894,8.1829,259044748600.0,259044748600.0,,,,,,,,,,,,,,,190410200.0,3127166700.0,2712745400.0,,223014892600.0,186032900900.0,,,1557473800.0,10927707300.0,6774455800.0,-2894208700.0,-6651709400.0,,,,,,,,,,,46125749700.0,142603700.0,547867400.0,,45720486000.0,6987230700.0,38733255300.0,36001073800.0,2732181500.0,-568007300.0,38165248000.0,35252110200.0,2913137800.0,46518082900.0,,,,,13073136100.0,2966060400.0,7126535700.0,,,,,,,,,,,,,,,38733255300.0,1
|
||||||
|
300750.SZ,20240316,20240316,20231231,1,1,4,11.79,11.779,400917044900.0,400917044900.0,,,,,,,,,,,,,,,46270400.0,3189201200.0,3745762000.0,,356718585800.0,309070434000.0,,,1695507700.0,17954440500.0,8461824300.0,-4927697400.0,-5853926900.0,,,,,,,,,,,53718302100.0,503675200.0,307924000.0,,53914053300.0,7153018800.0,46761034500.0,44121248300.0,2639786100.0,-4711859000.0,42049175500.0,39568104200.0,2481071300.0,51182922200.0,73828904000.0,,,,18356108400.0,3446515800.0,8321802100.0,,,,,,,,,,,,,,,46761034500.0,1
|
||||||
|
300750.SZ,20230310,20230310,20221231,1,1,4,12.9178,12.8795,328593987500.0,328593987500.0,,,,,,,,,,,,,,,400241300.0,2514538600.0,2614517000.0,,297718806500.0,262049609200.0,,,907484500.0,11099401200.0,6978669400.0,-2799985800.0,-2826926600.0,,,,,,,,,,,36821983000.0,159426800.0,308553600.0,,36672856200.0,3215712700.0,33457143500.0,30729163500.0,2727980100.0,5046510500.0,38503654000.0,35452143600.0,3051510400.0,31406613600.0,44659154600.0,,,,15510453500.0,2132375400.0,3987365200.0,,,,,,,,,,,,,,,33457143500.0,1
|
||||||
|
300750.SZ,20220422,20220422,20211231,1,1,4,6.876,6.8392,130355796400.0,130355796400.0,,,,,,,,,,,,,,,,1232699000.0,575836900.0,,113415030000.0,96093722300.0,,,486534200.0,4367869400.0,3368937100.0,-641200000.0,-2034437800.0,,,,,,,,,,,19823729200.0,183039700.0,119639800.0,,19887129100.0,2026399000.0,17860730100.0,15931317900.0,1929412300.0,3013987200.0,20874717400.0,19012644700.0,1862072600.0,18123376500.0,24560000600.0,,,,7691427600.0,1161100400.0,2323262000.0,,,,,,,,,,,,,,,17860730100.0,1
|
||||||
|
300750.SZ,20210428,20210428,20201231,1,1,4,2.4942,2.4848,50319487697.2,50319487697.2,,,,,,,,,,,,,,,286915936.0,-117648607.8,-4027332.09,,44655315480.69,36349153592.22,,,295129893.6,2216709532.73,1768115240.89,-712642421.45,-827489419.04,,,,,,,,,,,6959489551.43,94318062.61,71254204.8,,6982553409.24,878635356.78,6103918052.46,5583338710.38,520579342.08,505828698.82,6609746751.28,6089512016.47,520234734.81,6289688334.33,11157577849.15,,,,3569377694.03,640434316.54,1494600958.67,,,,,,,,,,,,,,,6103918052.46,1
|
||||||
|
300750.SZ,20200425,20200425,20191231,1,1,4,2.0937,2.0887,45788020642.41,45788020642.41,,,,,,,,,,,,,,,27331582.1,-79604902.02,-11899568.84,,40624707856.41,32482760512.62,,,272228105.62,2156553541.51,1832673929.87,-781621299.53,-1434329163.69,,,,,,,,,,,5758793258.1,62428112.63,60456806.48,,5760764564.25,748090666.38,5012673897.87,4560307432.71,452366465.16,957658852.86,5970332750.73,5517966285.57,452366465.16,5722463917.76,10131504260.02,,,,2992107516.52,289254465.49,1078256966.28,,,,,,,,,,,,,,,5012673897.87,0
|
||||||
|
300750.SZ,20190425,20190425,20181231,1,1,4,1.6412,1.6407,29611265434.22,29611265434.22,,,,,,,,,,,,,,,-314247518.1,184397531.48,-4264014.31,,25729175371.38,19902284153.15,,,171183911.7,1378868425.55,1590659572.27,-279733226.14,974912150.01,,,,,,,,,,,4168476326.68,62303262.42,25966337.17,,4204813251.93,468916764.21,3735896487.72,3387035207.64,348861280.08,-585339219.51,3150557268.21,2801695988.13,348861280.08,4110132051.73,6414353208.21,,,,1991000384.84,204435332.83,565817388.3,,,,,,,,,,,,,,,3735896487.72,0
|
||||||
|
300750.SZ,20180522,20180522,20171231,1,1,4,2.0084,,19996860806.33,19996860806.33,,,,,,,,,,,,,,,,1344305303.77,-49976783.37,,16875255721.27,12740187148.7,,,95900521.0,795766091.83,2956488278.51,42169650.35,244744030.88,,,,,,,,,,,4832020495.66,18655542.93,2575814.31,,4848100224.28,654043646.62,4194056577.66,3877954869.7,316101707.96,246933121.24,4440989698.9,4124887990.94,316101707.96,3608196383.76,4989378148.98,,,,,,,,,,,,,,,,,,,,,4194056577.66,0
|
||||||
|
300750.SZ,20180522,20180522,20161231,1,1,4,1.8736,,14878985098.12,14878985098.12,,,,,,,,,,,,,,,,76080348.84,21669756.19,,11584739495.37,8376801892.4,,,109215284.54,632190722.09,2152228887.34,80443838.96,233858870.04,,,,,,,,,,,3212120702.65,188974466.62,881463.97,,3400213705.3,481776851.01,2918436854.29,2851821419.26,66615435.03,888062.23,2919324916.52,2852709481.49,66615435.03,3374689441.71,4159176537.97,,,,,,,,,,,,,,,,,,,,,2918436854.29,0
|
||||||
|
300750.SZ,20180522,20180522,20151231,1,1,4,0.7755,,5702884874.34,5702884874.34,,,,,,,,,,,,,,,,1455431.76,-9658518.48,,4658155646.48,3499202013.73,,,39629825.6,330920265.24,620575323.94,109186539.31,58641678.66,,,,,,,,,,,1045594555.74,71190367.14,16752779.33,,1100032143.55,149451069.1,950581074.45,930646375.1,19934699.35,494869.71,951075944.16,931141244.81,19934699.35,1153915767.17,1346241339.09,,,,,,,,,,,,,,,,,,,,,950581074.45,0
|
||||||
|
753
data/CN/300750.SZ/report.html
Normal file
753
data/CN/300750.SZ/report.html
Normal file
@ -0,0 +1,753 @@
|
|||||||
|
<html><head><title>Financial Report</title><style>
|
||||||
|
body { max-width: 1400px; margin: 0 auto; }
|
||||||
|
.fin-table { width: 100%; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 13px; table-layout: fixed; }
|
||||||
|
.fin-table th, .fin-table td { width: 90px; word-wrap: break-word; }
|
||||||
|
.fin-table th { background-color: #f8f9fa; padding: 8px; border-bottom: 2px solid #ddd; text-align: right; }
|
||||||
|
.fin-table td { padding: 6px 8px; border-bottom: 1px solid #eee; text-align: right; }
|
||||||
|
.fin-table .row-header { width: 160px; text-align: left !important; font-weight: 500; color: #666; position: sticky; left: 0; z-index: 1; background-color: #f8f9fa; }
|
||||||
|
.group-header { background-color: #f0f0f5 !important; font-weight: bold; text-align: left !important; color: #333; position: sticky; left: 0; z-index: 1; }
|
||||||
|
.hover-row:hover { background-color: #e6e6fa !important; }
|
||||||
|
.hover-row:hover .row-header { background-color: #e6e6fa !important; }
|
||||||
|
.text-green { color: #008000; }
|
||||||
|
.bg-green { background-color: #d1e7dd; color: #0f5132; }
|
||||||
|
.text-red { color: #dc3545; }
|
||||||
|
.bg-red { background-color: #f8d7da; color: #842029; }
|
||||||
|
.text-blue-i { color: #0d6efd; font-style: italic; }
|
||||||
|
.italic { font-style: italic; }
|
||||||
|
.bg-khaki { background-color: #F0E68C; }
|
||||||
|
.info-table { width: 100%; margin-bottom: 15px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 13px; table-layout: fixed; }
|
||||||
|
.info-table td { padding: 5px 10px; border: 1px solid #eee; word-wrap: break-word; }
|
||||||
|
.info-label { background-color: #f8f9fa; font-weight: bold; width: 100px; color: #666; }
|
||||||
|
</style></head><body>
|
||||||
|
<h1>Financial Report</h1>
|
||||||
|
<table class='info-table'>
|
||||||
|
<tr>
|
||||||
|
<td class='info-label'>代码</td><td class='info-label'>简称</td><td class='info-label'>日期</td><td class='info-label'>上市日期</td><td class='info-label'>PE</td><td class='info-label'>PB</td><td class='info-label'>股息率(%)</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>300750.SZ</td><td>宁德时代</td><td>2025-12-14</td><td>2018-06-11</td><td>35.24</td><td>5.69</td><td>1.72%</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div style='overflow-x: auto;'>
|
||||||
|
<table class='fin-table'>
|
||||||
|
<thead><tr><th class='row-header'>指标</th>
|
||||||
|
<th>2025 Q3</th>
|
||||||
|
<th>2024</th>
|
||||||
|
<th>2023</th>
|
||||||
|
<th>2022</th>
|
||||||
|
<th>2021</th>
|
||||||
|
<th>2020</th>
|
||||||
|
<th>2019</th>
|
||||||
|
<th>2018</th>
|
||||||
|
<th>2017</th>
|
||||||
|
<th>2016</th>
|
||||||
|
<th>2015</th>
|
||||||
|
</tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td class='group-header'>主要指标</td><td class='group-header' colspan='11' style='position: relative; border-bottom: 2px solid #ddd;'></td></tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>ROE</td>
|
||||||
|
<td class='bg-green'>15.60%</td>
|
||||||
|
<td class='bg-green'>20.55%</td>
|
||||||
|
<td class='bg-green'>22.32%</td>
|
||||||
|
<td class='bg-green'>18.68%</td>
|
||||||
|
<td class='bg-green'>18.85%</td>
|
||||||
|
<td class=''>8.70%</td>
|
||||||
|
<td class=''>11.96%</td>
|
||||||
|
<td class=''>10.28%</td>
|
||||||
|
<td class='bg-green'>15.70%</td>
|
||||||
|
<td class='bg-green'>18.41%</td>
|
||||||
|
<td class='bg-green'>74.23%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>ROA</td>
|
||||||
|
<td class=''>5.47%</td>
|
||||||
|
<td class=''>6.45%</td>
|
||||||
|
<td class=''>6.15%</td>
|
||||||
|
<td class=''>5.11%</td>
|
||||||
|
<td class=''>5.18%</td>
|
||||||
|
<td class=''>3.56%</td>
|
||||||
|
<td class=''>4.50%</td>
|
||||||
|
<td class=''>4.58%</td>
|
||||||
|
<td class=''>7.81%</td>
|
||||||
|
<td class=''>9.98%</td>
|
||||||
|
<td class='bg-green'>10.73%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>ROCE/ROIC</td>
|
||||||
|
<td class='bg-green'>16.36%</td>
|
||||||
|
<td class='bg-green'>24.89%</td>
|
||||||
|
<td class='bg-green'>25.89%</td>
|
||||||
|
<td class='bg-green'>19.09%</td>
|
||||||
|
<td class='bg-green'>21.44%</td>
|
||||||
|
<td class=''>9.80%</td>
|
||||||
|
<td class='bg-green'>15.01%</td>
|
||||||
|
<td class=''>12.48%</td>
|
||||||
|
<td class=''>14.61%</td>
|
||||||
|
<td class='bg-green'>21.79%</td>
|
||||||
|
<td class='bg-green'>92.04%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>毛利率</td>
|
||||||
|
<td class=''>25.31%</td>
|
||||||
|
<td class=''>24.44%</td>
|
||||||
|
<td class=''>22.91%</td>
|
||||||
|
<td class=''>20.25%</td>
|
||||||
|
<td class=''>26.28%</td>
|
||||||
|
<td class=''>27.76%</td>
|
||||||
|
<td class=''>29.06%</td>
|
||||||
|
<td class=''>32.79%</td>
|
||||||
|
<td class='bg-green'>36.29%</td>
|
||||||
|
<td class='bg-green'>43.70%</td>
|
||||||
|
<td class='bg-green'>38.64%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>净利润率</td>
|
||||||
|
<td class='bg-green'>17.32%</td>
|
||||||
|
<td class=''>14.02%</td>
|
||||||
|
<td class=''>11.01%</td>
|
||||||
|
<td class=''>9.35%</td>
|
||||||
|
<td class=''>12.22%</td>
|
||||||
|
<td class=''>11.10%</td>
|
||||||
|
<td class=''>9.96%</td>
|
||||||
|
<td class=''>11.44%</td>
|
||||||
|
<td class='bg-green'>19.39%</td>
|
||||||
|
<td class='bg-green'>19.17%</td>
|
||||||
|
<td class='bg-green'>16.32%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>收入</td>
|
||||||
|
<td class=''>2,830.72</td>
|
||||||
|
<td class=''>3,620.13</td>
|
||||||
|
<td class=''>4,009.17</td>
|
||||||
|
<td class=''>3,285.94</td>
|
||||||
|
<td class=''>1,303.56</td>
|
||||||
|
<td class=''>503.19</td>
|
||||||
|
<td class=''>457.88</td>
|
||||||
|
<td class=''>296.11</td>
|
||||||
|
<td class=''>199.97</td>
|
||||||
|
<td class=''>148.79</td>
|
||||||
|
<td class=''>57.03</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>收入增速</td>
|
||||||
|
<td class='text-blue-i'>9.28%</td>
|
||||||
|
<td class='text-red italic'>-9.70%</td>
|
||||||
|
<td class='bg-green italic'>22.01%</td>
|
||||||
|
<td class='bg-green italic'>152.07%</td>
|
||||||
|
<td class='bg-green italic'>159.06%</td>
|
||||||
|
<td class='text-blue-i'>9.90%</td>
|
||||||
|
<td class='bg-green italic'>54.63%</td>
|
||||||
|
<td class='bg-green italic'>48.08%</td>
|
||||||
|
<td class='bg-green italic'>34.40%</td>
|
||||||
|
<td class='bg-green italic'>160.90%</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>净利润</td>
|
||||||
|
<td class=''>490.34</td>
|
||||||
|
<td class=''>507.45</td>
|
||||||
|
<td class=''>441.21</td>
|
||||||
|
<td class=''>307.29</td>
|
||||||
|
<td class=''>159.31</td>
|
||||||
|
<td class=''>55.83</td>
|
||||||
|
<td class=''>45.60</td>
|
||||||
|
<td class=''>33.87</td>
|
||||||
|
<td class=''>38.78</td>
|
||||||
|
<td class=''>28.52</td>
|
||||||
|
<td class=''>9.31</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>净利润增速</td>
|
||||||
|
<td class='bg-green italic'>36.20%</td>
|
||||||
|
<td class='bg-green italic'>15.01%</td>
|
||||||
|
<td class='bg-green italic'>43.58%</td>
|
||||||
|
<td class='bg-green italic'>92.89%</td>
|
||||||
|
<td class='bg-green italic'>185.34%</td>
|
||||||
|
<td class='bg-green italic'>22.43%</td>
|
||||||
|
<td class='bg-green italic'>34.64%</td>
|
||||||
|
<td class='text-red italic'>-12.66%</td>
|
||||||
|
<td class='bg-green italic'>35.98%</td>
|
||||||
|
<td class='bg-green italic'>206.43%</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>经营净现金流</td>
|
||||||
|
<td class=''>806.60</td>
|
||||||
|
<td class=''>969.90</td>
|
||||||
|
<td class=''>928.26</td>
|
||||||
|
<td class=''>612.09</td>
|
||||||
|
<td class=''>429.08</td>
|
||||||
|
<td class=''>184.30</td>
|
||||||
|
<td class=''>134.72</td>
|
||||||
|
<td class=''>113.16</td>
|
||||||
|
<td class=''>23.41</td>
|
||||||
|
<td class=''>21.09</td>
|
||||||
|
<td class=''>6.65</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>资本开支</td>
|
||||||
|
<td class=''>300.88</td>
|
||||||
|
<td class=''>311.80</td>
|
||||||
|
<td class=''>336.25</td>
|
||||||
|
<td class=''>482.15</td>
|
||||||
|
<td class=''>437.68</td>
|
||||||
|
<td class=''>133.02</td>
|
||||||
|
<td class=''>96.27</td>
|
||||||
|
<td class=''>66.29</td>
|
||||||
|
<td class=''>71.80</td>
|
||||||
|
<td class=''>28.01</td>
|
||||||
|
<td class=''>15.54</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>自由现金流</td>
|
||||||
|
<td class='bg-green'>505.73</td>
|
||||||
|
<td class='bg-green'>658.10</td>
|
||||||
|
<td class='bg-green'>592.01</td>
|
||||||
|
<td class=''>129.94</td>
|
||||||
|
<td class='bg-red'>-8.60</td>
|
||||||
|
<td class=''>51.28</td>
|
||||||
|
<td class=''>38.45</td>
|
||||||
|
<td class='bg-green'>46.87</td>
|
||||||
|
<td class='bg-red'>-48.40</td>
|
||||||
|
<td class='bg-red'>-6.92</td>
|
||||||
|
<td class='bg-red'>-8.89</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>分红</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>总资产</td>
|
||||||
|
<td class=''>8,960.82</td>
|
||||||
|
<td class=''>7,866.58</td>
|
||||||
|
<td class=''>7,171.68</td>
|
||||||
|
<td class=''>6,009.52</td>
|
||||||
|
<td class=''>3,076.67</td>
|
||||||
|
<td class=''>1,566.18</td>
|
||||||
|
<td class=''>1,013.52</td>
|
||||||
|
<td class=''>738.84</td>
|
||||||
|
<td class=''>496.63</td>
|
||||||
|
<td class=''>285.88</td>
|
||||||
|
<td class=''>86.73</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>净资产</td>
|
||||||
|
<td class=''>3,142.48</td>
|
||||||
|
<td class=''>2,469.30</td>
|
||||||
|
<td class=''>1,977.08</td>
|
||||||
|
<td class=''>1,644.81</td>
|
||||||
|
<td class=''>845.13</td>
|
||||||
|
<td class=''>642.07</td>
|
||||||
|
<td class=''>381.35</td>
|
||||||
|
<td class=''>329.38</td>
|
||||||
|
<td class=''>247.01</td>
|
||||||
|
<td class=''>154.89</td>
|
||||||
|
<td class=''>12.54</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>商誉</td>
|
||||||
|
<td class=''>8.91</td>
|
||||||
|
<td class=''>8.95</td>
|
||||||
|
<td class=''>7.08</td>
|
||||||
|
<td class=''>7.04</td>
|
||||||
|
<td class=''>5.28</td>
|
||||||
|
<td class=''>1.48</td>
|
||||||
|
<td class=''>1.48</td>
|
||||||
|
<td class=''>1.00</td>
|
||||||
|
<td class=''>1.00</td>
|
||||||
|
<td class=''>1.00</td>
|
||||||
|
<td class=''>1.00</td>
|
||||||
|
</tr>
|
||||||
|
<tr><td class='group-header'>费用指标</td><td class='group-header' colspan='11' style='position: relative; border-bottom: 2px solid #ddd;'></td></tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>销售费用率</td>
|
||||||
|
<td class=''>0.85%</td>
|
||||||
|
<td class=''>0.98%</td>
|
||||||
|
<td class=''>4.48%</td>
|
||||||
|
<td class=''>3.38%</td>
|
||||||
|
<td class=''>3.35%</td>
|
||||||
|
<td class=''>4.41%</td>
|
||||||
|
<td class=''>4.71%</td>
|
||||||
|
<td class=''>4.66%</td>
|
||||||
|
<td class=''>3.98%</td>
|
||||||
|
<td class=''>4.25%</td>
|
||||||
|
<td class=''>5.80%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>管理费用率</td>
|
||||||
|
<td class=''>2.91%</td>
|
||||||
|
<td class=''>2.68%</td>
|
||||||
|
<td class=''>2.11%</td>
|
||||||
|
<td class=''>2.12%</td>
|
||||||
|
<td class=''>2.58%</td>
|
||||||
|
<td class=''>3.51%</td>
|
||||||
|
<td class=''>4.00%</td>
|
||||||
|
<td class=''>5.37%</td>
|
||||||
|
<td class=''>14.78%</td>
|
||||||
|
<td class=''>14.46%</td>
|
||||||
|
<td class=''>10.88%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>研发费用率</td>
|
||||||
|
<td class=''>5.32%</td>
|
||||||
|
<td class=''>5.14%</td>
|
||||||
|
<td class=''>4.58%</td>
|
||||||
|
<td class=''>4.72%</td>
|
||||||
|
<td class=''>5.90%</td>
|
||||||
|
<td class=''>7.09%</td>
|
||||||
|
<td class=''>6.53%</td>
|
||||||
|
<td class=''>6.72%</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>其他费用率</td>
|
||||||
|
<td class=''>-1.09%</td>
|
||||||
|
<td class=''>1.63%</td>
|
||||||
|
<td class=''>0.74%</td>
|
||||||
|
<td class=''>0.68%</td>
|
||||||
|
<td class=''>2.23%</td>
|
||||||
|
<td class=''>1.66%</td>
|
||||||
|
<td class=''>3.85%</td>
|
||||||
|
<td class=''>4.60%</td>
|
||||||
|
<td class=''>-1.87%</td>
|
||||||
|
<td class=''>5.82%</td>
|
||||||
|
<td class=''>5.64%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>折旧费用占比</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td class=''>6.20%</td>
|
||||||
|
<td class=''>5.26%</td>
|
||||||
|
<td class=''>3.64%</td>
|
||||||
|
<td class=''>4.49%</td>
|
||||||
|
<td class=''>9.10%</td>
|
||||||
|
<td class=''>9.04%</td>
|
||||||
|
<td class=''>7.18%</td>
|
||||||
|
<td class=''>6.40%</td>
|
||||||
|
<td class=''>4.92%</td>
|
||||||
|
<td class=''>2.88%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>所得税率</td>
|
||||||
|
<td class=''>13.86%</td>
|
||||||
|
<td class=''>14.52%</td>
|
||||||
|
<td class=''>13.27%</td>
|
||||||
|
<td class=''>8.77%</td>
|
||||||
|
<td class=''>10.19%</td>
|
||||||
|
<td class=''>12.58%</td>
|
||||||
|
<td class=''>12.99%</td>
|
||||||
|
<td class=''>11.15%</td>
|
||||||
|
<td class=''>13.49%</td>
|
||||||
|
<td class=''>14.17%</td>
|
||||||
|
<td class=''>13.59%</td>
|
||||||
|
</tr>
|
||||||
|
<tr><td class='group-header'>资产占比</td><td class='group-header' colspan='11' style='position: relative; border-bottom: 2px solid #ddd;'></td></tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>现金占比</td>
|
||||||
|
<td class='bg-red'>36.18%</td>
|
||||||
|
<td class='bg-red'>38.58%</td>
|
||||||
|
<td class='bg-red'>36.85%</td>
|
||||||
|
<td class='bg-red'>31.79%</td>
|
||||||
|
<td class=''>28.95%</td>
|
||||||
|
<td class='bg-red'>43.69%</td>
|
||||||
|
<td class='bg-red'>31.84%</td>
|
||||||
|
<td class='bg-red'>37.53%</td>
|
||||||
|
<td class=''>28.35%</td>
|
||||||
|
<td class=''>8.59%</td>
|
||||||
|
<td class=''>14.91%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>库存占比</td>
|
||||||
|
<td class=''>8.95%</td>
|
||||||
|
<td class=''>7.61%</td>
|
||||||
|
<td class=''>6.34%</td>
|
||||||
|
<td class=''>12.76%</td>
|
||||||
|
<td class=''>13.07%</td>
|
||||||
|
<td class=''>8.44%</td>
|
||||||
|
<td class=''>11.33%</td>
|
||||||
|
<td class=''>9.58%</td>
|
||||||
|
<td class=''>6.88%</td>
|
||||||
|
<td class=''>4.76%</td>
|
||||||
|
<td class=''>12.01%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>应收款占比</td>
|
||||||
|
<td class=''>7.42%</td>
|
||||||
|
<td class=''>8.15%</td>
|
||||||
|
<td class=''>8.93%</td>
|
||||||
|
<td class=''>9.65%</td>
|
||||||
|
<td class=''>7.72%</td>
|
||||||
|
<td class=''>7.21%</td>
|
||||||
|
<td class=''>8.23%</td>
|
||||||
|
<td class=''>8.43%</td>
|
||||||
|
<td class=''>13.93%</td>
|
||||||
|
<td class=''>25.59%</td>
|
||||||
|
<td class=''>27.60%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>预付款占比</td>
|
||||||
|
<td class=''>1.51%</td>
|
||||||
|
<td class=''>0.76%</td>
|
||||||
|
<td class=''>0.97%</td>
|
||||||
|
<td class=''>2.64%</td>
|
||||||
|
<td class=''>2.10%</td>
|
||||||
|
<td class=''>0.64%</td>
|
||||||
|
<td class=''>0.53%</td>
|
||||||
|
<td class=''>1.17%</td>
|
||||||
|
<td class=''>0.62%</td>
|
||||||
|
<td class=''>0.35%</td>
|
||||||
|
<td class=''>0.81%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>固定资产占比</td>
|
||||||
|
<td class=''>14.35%</td>
|
||||||
|
<td class=''>14.31%</td>
|
||||||
|
<td class=''>16.09%</td>
|
||||||
|
<td class=''>14.82%</td>
|
||||||
|
<td class=''>13.42%</td>
|
||||||
|
<td class=''>12.53%</td>
|
||||||
|
<td class=''>17.19%</td>
|
||||||
|
<td class=''>15.67%</td>
|
||||||
|
<td class=''>16.55%</td>
|
||||||
|
<td class=''>13.04%</td>
|
||||||
|
<td class=''>15.14%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>长期投资占比</td>
|
||||||
|
<td class=''>6.68%</td>
|
||||||
|
<td class=''>6.97%</td>
|
||||||
|
<td class=''>6.98%</td>
|
||||||
|
<td class=''>2.93%</td>
|
||||||
|
<td class=''>3.56%</td>
|
||||||
|
<td class=''>3.07%</td>
|
||||||
|
<td class=''>1.52%</td>
|
||||||
|
<td class=''>1.31%</td>
|
||||||
|
<td class=''>1.59%</td>
|
||||||
|
<td class=''>0.59%</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>商誉占比</td>
|
||||||
|
<td class=''>0.10%</td>
|
||||||
|
<td class=''>0.11%</td>
|
||||||
|
<td class=''>0.10%</td>
|
||||||
|
<td class=''>0.12%</td>
|
||||||
|
<td class=''>0.17%</td>
|
||||||
|
<td class=''>0.09%</td>
|
||||||
|
<td class=''>0.15%</td>
|
||||||
|
<td class=''>0.14%</td>
|
||||||
|
<td class=''>0.20%</td>
|
||||||
|
<td class=''>0.35%</td>
|
||||||
|
<td class=''>1.16%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>其他资产占比</td>
|
||||||
|
<td class='bg-khaki'>24.80%</td>
|
||||||
|
<td class='bg-khaki'>23.51%</td>
|
||||||
|
<td class='bg-khaki'>23.75%</td>
|
||||||
|
<td class='bg-khaki'>25.30%</td>
|
||||||
|
<td class='bg-khaki'>31.02%</td>
|
||||||
|
<td class='bg-khaki'>24.32%</td>
|
||||||
|
<td class='bg-khaki'>29.22%</td>
|
||||||
|
<td class='bg-khaki'>26.19%</td>
|
||||||
|
<td class='bg-khaki'>31.87%</td>
|
||||||
|
<td class='bg-khaki'>46.72%</td>
|
||||||
|
<td class='bg-khaki'>28.37%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>应付款占比</td>
|
||||||
|
<td class=''>14.73%</td>
|
||||||
|
<td class=''>16.65%</td>
|
||||||
|
<td class=''>16.32%</td>
|
||||||
|
<td class=''>15.73%</td>
|
||||||
|
<td class=''>15.86%</td>
|
||||||
|
<td class=''>9.98%</td>
|
||||||
|
<td class=''>10.55%</td>
|
||||||
|
<td class=''>9.55%</td>
|
||||||
|
<td class=''>10.02%</td>
|
||||||
|
<td class=''>11.10%</td>
|
||||||
|
<td class=''>16.98%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>预收款占比</td>
|
||||||
|
<td class=''>4.54%</td>
|
||||||
|
<td class=''>3.54%</td>
|
||||||
|
<td class=''>3.34%</td>
|
||||||
|
<td class=''>3.73%</td>
|
||||||
|
<td class=''>3.75%</td>
|
||||||
|
<td class=''>4.39%</td>
|
||||||
|
<td class=''>6.08%</td>
|
||||||
|
<td class=''>6.76%</td>
|
||||||
|
<td class=''>0.41%</td>
|
||||||
|
<td class=''>0.31%</td>
|
||||||
|
<td class=''>1.96%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>短期借款占比</td>
|
||||||
|
<td class=''>4.50%</td>
|
||||||
|
<td class=''>5.41%</td>
|
||||||
|
<td class=''>3.09%</td>
|
||||||
|
<td class=''>3.60%</td>
|
||||||
|
<td class=''>5.09%</td>
|
||||||
|
<td class=''>4.91%</td>
|
||||||
|
<td class=''>3.16%</td>
|
||||||
|
<td class=''>2.85%</td>
|
||||||
|
<td class=''>5.26%</td>
|
||||||
|
<td class=''>5.13%</td>
|
||||||
|
<td class=''>21.90%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>长期借款占比</td>
|
||||||
|
<td class=''>8.75%</td>
|
||||||
|
<td class=''>10.33%</td>
|
||||||
|
<td class=''>11.64%</td>
|
||||||
|
<td class=''>9.83%</td>
|
||||||
|
<td class=''>7.19%</td>
|
||||||
|
<td class=''>3.87%</td>
|
||||||
|
<td class=''>4.91%</td>
|
||||||
|
<td class=''>4.72%</td>
|
||||||
|
<td class=''>4.29%</td>
|
||||||
|
<td class=''>1.06%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>运营资产占比</td>
|
||||||
|
<td class='bg-green'>-1.38%</td>
|
||||||
|
<td class='bg-green'>-3.67%</td>
|
||||||
|
<td class='bg-green'>-3.43%</td>
|
||||||
|
<td class=''>5.57%</td>
|
||||||
|
<td class=''>3.28%</td>
|
||||||
|
<td class=''>1.92%</td>
|
||||||
|
<td class=''>3.46%</td>
|
||||||
|
<td class=''>2.86%</td>
|
||||||
|
<td class=''>11.00%</td>
|
||||||
|
<td class=''>19.29%</td>
|
||||||
|
<td class=''>21.49%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>有息负债率</td>
|
||||||
|
<td class=''>13.25%</td>
|
||||||
|
<td class=''>15.74%</td>
|
||||||
|
<td class=''>14.73%</td>
|
||||||
|
<td class=''>13.44%</td>
|
||||||
|
<td class=''>12.28%</td>
|
||||||
|
<td class=''>8.78%</td>
|
||||||
|
<td class=''>8.07%</td>
|
||||||
|
<td class=''>7.58%</td>
|
||||||
|
<td class=''>9.54%</td>
|
||||||
|
<td class=''>6.19%</td>
|
||||||
|
<td class=''>21.90%</td>
|
||||||
|
</tr>
|
||||||
|
<tr><td class='group-header'>周转能力</td><td class='group-header' colspan='11' style='position: relative; border-bottom: 2px solid #ddd;'></td></tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>存货周转天数</td>
|
||||||
|
<td class=''>138</td>
|
||||||
|
<td class=''>79</td>
|
||||||
|
<td class=''>53</td>
|
||||||
|
<td class=''>106</td>
|
||||||
|
<td class=''>152</td>
|
||||||
|
<td class=''>132</td>
|
||||||
|
<td class=''>129</td>
|
||||||
|
<td class=''>129</td>
|
||||||
|
<td class=''>97</td>
|
||||||
|
<td class=''>59</td>
|
||||||
|
<td class=''>108</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>应收款周转天数</td>
|
||||||
|
<td class=''>85</td>
|
||||||
|
<td class=''>64</td>
|
||||||
|
<td class=''>58</td>
|
||||||
|
<td class=''>64</td>
|
||||||
|
<td class=''>66</td>
|
||||||
|
<td class=''>81</td>
|
||||||
|
<td class=''>66</td>
|
||||||
|
<td class=''>76</td>
|
||||||
|
<td class='bg-red'>126</td>
|
||||||
|
<td class='bg-red'>179</td>
|
||||||
|
<td class='bg-red'>153</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>应付款周转天数</td>
|
||||||
|
<td class=''>227</td>
|
||||||
|
<td class=''>174</td>
|
||||||
|
<td class=''>138</td>
|
||||||
|
<td class=''>131</td>
|
||||||
|
<td class=''>185</td>
|
||||||
|
<td class=''>156</td>
|
||||||
|
<td class=''>120</td>
|
||||||
|
<td class=''>129</td>
|
||||||
|
<td class=''>142</td>
|
||||||
|
<td class=''>138</td>
|
||||||
|
<td class=''>153</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>固定资产周转率</td>
|
||||||
|
<td class=''>2.20</td>
|
||||||
|
<td class=''>3.22</td>
|
||||||
|
<td class=''>3.47</td>
|
||||||
|
<td class=''>3.69</td>
|
||||||
|
<td class=''>3.16</td>
|
||||||
|
<td class=''>2.56</td>
|
||||||
|
<td class=''>2.63</td>
|
||||||
|
<td class=''>2.56</td>
|
||||||
|
<td class=''>2.43</td>
|
||||||
|
<td class=''>3.99</td>
|
||||||
|
<td class=''>4.34</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>总资产周转率</td>
|
||||||
|
<td class=''>0.32</td>
|
||||||
|
<td class=''>0.46</td>
|
||||||
|
<td class=''>0.56</td>
|
||||||
|
<td class=''>0.55</td>
|
||||||
|
<td class=''>0.42</td>
|
||||||
|
<td class=''>0.32</td>
|
||||||
|
<td class=''>0.45</td>
|
||||||
|
<td class=''>0.40</td>
|
||||||
|
<td class=''>0.40</td>
|
||||||
|
<td class=''>0.52</td>
|
||||||
|
<td class=''>0.66</td>
|
||||||
|
</tr>
|
||||||
|
<tr><td class='group-header'>人均效率</td><td class='group-header' colspan='11' style='position: relative; border-bottom: 2px solid #ddd;'></td></tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>员工人数</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td class=''>131,988</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>人均创收(万)</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td class=''>274.28</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>人均创利(万)</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td class=''>38.45</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>人均薪酬(万)</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td class=''>19.32</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr><td class='group-header'>市场表现</td><td class='group-header' colspan='11' style='position: relative; border-bottom: 2px solid #ddd;'></td></tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>股价</td>
|
||||||
|
<td class=''>402.00</td>
|
||||||
|
<td class=''>266.00</td>
|
||||||
|
<td class=''>163.26</td>
|
||||||
|
<td class=''>393.42</td>
|
||||||
|
<td class=''>588.00</td>
|
||||||
|
<td class=''>351.11</td>
|
||||||
|
<td class=''>106.40</td>
|
||||||
|
<td class=''>73.80</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>市值(亿)</td>
|
||||||
|
<td class=''>18,338</td>
|
||||||
|
<td class=''>11,713</td>
|
||||||
|
<td class=''>7,182</td>
|
||||||
|
<td class=''>9,609</td>
|
||||||
|
<td class=''>13,705</td>
|
||||||
|
<td class=''>8,179</td>
|
||||||
|
<td class=''>2,350</td>
|
||||||
|
<td class=''>1,620</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>PE</td>
|
||||||
|
<td class=''>36.14</td>
|
||||||
|
<td class=''>26.55</td>
|
||||||
|
<td class=''>23.37</td>
|
||||||
|
<td class=''>60.32</td>
|
||||||
|
<td class=''>245.47</td>
|
||||||
|
<td class=''>179.35</td>
|
||||||
|
<td class=''>69.37</td>
|
||||||
|
<td class=''>41.77</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>PB</td>
|
||||||
|
<td class=''>6.32</td>
|
||||||
|
<td class=''>4.94</td>
|
||||||
|
<td class=''>3.98</td>
|
||||||
|
<td class=''>6.40</td>
|
||||||
|
<td class=''>18.74</td>
|
||||||
|
<td class=''>13.33</td>
|
||||||
|
<td class=''>6.36</td>
|
||||||
|
<td class=''>5.01</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>股东户数</td>
|
||||||
|
<td class=''>226,368</td>
|
||||||
|
<td class=''>212,061</td>
|
||||||
|
<td class=''>260,992</td>
|
||||||
|
<td class=''>183,317</td>
|
||||||
|
<td class=''>141,963</td>
|
||||||
|
<td class=''>133,060</td>
|
||||||
|
<td class=''>76,710</td>
|
||||||
|
<td class=''>82,514</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
</tbody></table></div></body></html>
|
||||||
87
data/CN/300750.SZ/report.md
Normal file
87
data/CN/300750.SZ/report.md
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
# 宁德时代 (300750.SZ) - Financial Report
|
||||||
|
*Report generated on: 2025-12-14*
|
||||||
|
|
||||||
|
| 代码 | 简称 | 上市日期 | PE | PB | 股息率(%) |
|
||||||
|
|:---|:---|:---|:---|:---|:---|
|
||||||
|
| 300750.SZ | 宁德时代 | 2018-06-11 | 35.24 | 5.69 | 1.72% |
|
||||||
|
|
||||||
|
|
||||||
|
## 主要指标
|
||||||
|
| 指标 | 2025 Q3 | 2024 | 2023 | 2022 | 2021 | 2020 | 2019 | 2018 | 2017 | 2016 | 2015 |
|
||||||
|
|:---|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|
|
||||||
|
| ROE | 15.60% | 20.55% | 22.32% | 18.68% | 18.85% | 8.70% | 11.96% | 10.28% | 15.70% | 18.41% | 74.23% |
|
||||||
|
| ROA | 5.47% | 6.45% | 6.15% | 5.11% | 5.18% | 3.56% | 4.50% | 4.58% | 7.81% | 9.98% | 10.73% |
|
||||||
|
| ROCE/ROIC | 16.36% | 24.89% | 25.89% | 19.09% | 21.44% | 9.80% | 15.01% | 12.48% | 14.61% | 21.79% | 92.04% |
|
||||||
|
| 毛利率 | 25.31% | 24.44% | 22.91% | 20.25% | 26.28% | 27.76% | 29.06% | 32.79% | 36.29% | 43.70% | 38.64% |
|
||||||
|
| 净利润率 | 17.32% | 14.02% | 11.01% | 9.35% | 12.22% | 11.10% | 9.96% | 11.44% | 19.39% | 19.17% | 16.32% |
|
||||||
|
| 收入(亿) | 2,830.72 | 3,620.13 | 4,009.17 | 3,285.94 | 1,303.56 | 503.19 | 457.88 | 296.11 | 199.97 | 148.79 | 57.03 |
|
||||||
|
| 收入增速 | 9.28% | -9.70% | 22.01% | 152.07% | 159.06% | 9.90% | 54.63% | 48.08% | 34.40% | 160.90% | - |
|
||||||
|
| 净利润(亿) | 490.34 | 507.45 | 441.21 | 307.29 | 159.31 | 55.83 | 45.60 | 33.87 | 38.78 | 28.52 | 9.31 |
|
||||||
|
| 净利润增速 | 36.20% | 15.01% | 43.58% | 92.89% | 185.34% | 22.43% | 34.64% | -12.66% | 35.98% | 206.43% | - |
|
||||||
|
| 经营净现金流(亿) | 806.60 | 969.90 | 928.26 | 612.09 | 429.08 | 184.30 | 134.72 | 113.16 | 23.41 | 21.09 | 6.65 |
|
||||||
|
| 资本开支(亿) | 300.88 | 311.80 | 336.25 | 482.15 | 437.68 | 133.02 | 96.27 | 66.29 | 71.80 | 28.01 | 15.54 |
|
||||||
|
| 自由现金流(亿) | 505.73 | 658.10 | 592.01 | 129.94 | -8.60 | 51.28 | 38.45 | 46.87 | -48.40 | -6.92 | -8.89 |
|
||||||
|
| 分红(亿) | - | - | - | - | - | - | - | - | - | - | - |
|
||||||
|
| 总资产(亿) | 8,960.82 | 7,866.58 | 7,171.68 | 6,009.52 | 3,076.67 | 1,566.18 | 1,013.52 | 738.84 | 496.63 | 285.88 | 86.73 |
|
||||||
|
| 净资产(亿) | 3,142.48 | 2,469.30 | 1,977.08 | 1,644.81 | 845.13 | 642.07 | 381.35 | 329.38 | 247.01 | 154.89 | 12.54 |
|
||||||
|
| 商誉(亿) | 8.91 | 8.95 | 7.08 | 7.04 | 5.28 | 1.48 | 1.48 | 1.00 | 1.00 | 1.00 | 1.00 |
|
||||||
|
|
||||||
|
|
||||||
|
## 费用指标
|
||||||
|
| 指标 | 2025 Q3 | 2024 | 2023 | 2022 | 2021 | 2020 | 2019 | 2018 | 2017 | 2016 | 2015 |
|
||||||
|
|:---|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|
|
||||||
|
| 销售费用率 | 0.85% | 0.98% | 4.48% | 3.38% | 3.35% | 4.41% | 4.71% | 4.66% | 3.98% | 4.25% | 5.80% |
|
||||||
|
| 管理费用率 | 2.91% | 2.68% | 2.11% | 2.12% | 2.58% | 3.51% | 4.00% | 5.37% | 14.78% | 14.46% | 10.88% |
|
||||||
|
| 研发费用率 | 5.32% | 5.14% | 4.58% | 4.72% | 5.90% | 7.09% | 6.53% | 6.72% | - | - | - |
|
||||||
|
| 其他费用率 | -1.09% | 1.63% | 0.74% | 0.68% | 2.23% | 1.66% | 3.85% | 4.60% | -1.87% | 5.82% | 5.64% |
|
||||||
|
| 折旧费用占比 | - | 6.20% | 5.26% | 3.64% | 4.49% | 9.10% | 9.04% | 7.18% | 6.40% | 4.92% | 2.88% |
|
||||||
|
| 所得税率 | 13.86% | 14.52% | 13.27% | 8.77% | 10.19% | 12.58% | 12.99% | 11.15% | 13.49% | 14.17% | 13.59% |
|
||||||
|
|
||||||
|
|
||||||
|
## 资产占比
|
||||||
|
| 指标 | 2025 Q3 | 2024 | 2023 | 2022 | 2021 | 2020 | 2019 | 2018 | 2017 | 2016 | 2015 |
|
||||||
|
|:---|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|
|
||||||
|
| 现金占比 | 36.18% | 38.58% | 36.85% | 31.79% | 28.95% | 43.69% | 31.84% | 37.53% | 28.35% | 8.59% | 14.91% |
|
||||||
|
| 库存占比 | 8.95% | 7.61% | 6.34% | 12.76% | 13.07% | 8.44% | 11.33% | 9.58% | 6.88% | 4.76% | 12.01% |
|
||||||
|
| 应收款占比 | 7.42% | 8.15% | 8.93% | 9.65% | 7.72% | 7.21% | 8.23% | 8.43% | 13.93% | 25.59% | 27.60% |
|
||||||
|
| 预付款占比 | 1.51% | 0.76% | 0.97% | 2.64% | 2.10% | 0.64% | 0.53% | 1.17% | 0.62% | 0.35% | 0.81% |
|
||||||
|
| 固定资产占比 | 14.35% | 14.31% | 16.09% | 14.82% | 13.42% | 12.53% | 17.19% | 15.67% | 16.55% | 13.04% | 15.14% |
|
||||||
|
| 长期投资占比 | 6.68% | 6.97% | 6.98% | 2.93% | 3.56% | 3.07% | 1.52% | 1.31% | 1.59% | 0.59% | - |
|
||||||
|
| 商誉占比 | 0.10% | 0.11% | 0.10% | 0.12% | 0.17% | 0.09% | 0.15% | 0.14% | 0.20% | 0.35% | 1.16% |
|
||||||
|
| 其他资产占比 | 24.80% | 23.51% | 23.75% | 25.30% | 31.02% | 24.32% | 29.22% | 26.19% | 31.87% | 46.72% | 28.37% |
|
||||||
|
| 应付款占比 | 14.73% | 16.65% | 16.32% | 15.73% | 15.86% | 9.98% | 10.55% | 9.55% | 10.02% | 11.10% | 16.98% |
|
||||||
|
| 预收款占比 | 4.54% | 3.54% | 3.34% | 3.73% | 3.75% | 4.39% | 6.08% | 6.76% | 0.41% | 0.31% | 1.96% |
|
||||||
|
| 短期借款占比 | 4.50% | 5.41% | 3.09% | 3.60% | 5.09% | 4.91% | 3.16% | 2.85% | 5.26% | 5.13% | 21.90% |
|
||||||
|
| 长期借款占比 | 8.75% | 10.33% | 11.64% | 9.83% | 7.19% | 3.87% | 4.91% | 4.72% | 4.29% | 1.06% | 0.00% |
|
||||||
|
| 运营资产占比 | -1.38% | -3.67% | -3.43% | 5.57% | 3.28% | 1.92% | 3.46% | 2.86% | 11.00% | 19.29% | 21.49% |
|
||||||
|
| 有息负债率 | 13.25% | 15.74% | 14.73% | 13.44% | 12.28% | 8.78% | 8.07% | 7.58% | 9.54% | 6.19% | 21.90% |
|
||||||
|
|
||||||
|
|
||||||
|
## 周转能力
|
||||||
|
| 指标 | 2025 Q3 | 2024 | 2023 | 2022 | 2021 | 2020 | 2019 | 2018 | 2017 | 2016 | 2015 |
|
||||||
|
|:---|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|
|
||||||
|
| 存货周转天数 | 138 | 79 | 53 | 106 | 152 | 132 | 129 | 129 | 97 | 59 | 108 |
|
||||||
|
| 应收款周转天数 | 85 | 64 | 58 | 64 | 66 | 81 | 66 | 76 | 126 | 179 | 153 |
|
||||||
|
| 应付款周转天数 | 227 | 174 | 138 | 131 | 185 | 156 | 120 | 129 | 142 | 138 | 153 |
|
||||||
|
| 固定资产周转率 | 2.20 | 3.22 | 3.47 | 3.69 | 3.16 | 2.56 | 2.63 | 2.56 | 2.43 | 3.99 | 4.34 |
|
||||||
|
| 总资产周转率 | 0.32 | 0.46 | 0.56 | 0.55 | 0.42 | 0.32 | 0.45 | 0.40 | 0.40 | 0.52 | 0.66 |
|
||||||
|
|
||||||
|
|
||||||
|
## 人均效率
|
||||||
|
| 指标 | 2025 Q3 | 2024 | 2023 | 2022 | 2021 | 2020 | 2019 | 2018 | 2017 | 2016 | 2015 |
|
||||||
|
|:---|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|
|
||||||
|
| 员工人数 | - | 131,988 | - | - | - | - | - | - | - | - | - |
|
||||||
|
| 人均创收(万) | - | 274.28 | - | - | - | - | - | - | - | - | - |
|
||||||
|
| 人均创利(万) | - | 38.45 | - | - | - | - | - | - | - | - | - |
|
||||||
|
| 人均薪酬(万) | - | 19.32 | - | - | - | - | - | - | - | - | - |
|
||||||
|
|
||||||
|
|
||||||
|
## 市场表现
|
||||||
|
| 指标 | 2025 Q3 | 2024 | 2023 | 2022 | 2021 | 2020 | 2019 | 2018 | 2017 | 2016 | 2015 |
|
||||||
|
|:---|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|
|
||||||
|
| 股价 | 402.00 | 266.00 | 163.26 | 393.42 | 588.00 | 351.11 | 106.40 | 73.80 | - | - | - |
|
||||||
|
| 市值(亿) | 18,338 | 11,713 | 7,182 | 9,609 | 13,705 | 8,179 | 2,350 | 1,620 | - | - | - |
|
||||||
|
| PE | 36.14 | 26.55 | 23.37 | 60.32 | 245.47 | 179.35 | 69.37 | 41.77 | - | - | - |
|
||||||
|
| PB | 6.32 | 4.94 | 3.98 | 6.40 | 18.74 | 13.33 | 6.36 | 5.01 | - | - | - |
|
||||||
|
| 股东户数 | 226,368 | 212,061 | 260,992 | 183,317 | 141,963 | 133,060 | 76,710 | 82,514 | - | - | - |
|
||||||
|
|
||||||
13
data/CN/600519.SH/balance_sheet.csv
Normal file
13
data/CN/600519.SH/balance_sheet.csv
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
ts_code,ann_date,f_ann_date,date,report_type,comp_type,end_type,total_share,cap_rese,undistr_porfit,surplus_rese,special_rese,money_cap,trad_asset,notes_receiv,accounts_receiv,oth_receiv,prepayment,div_receiv,int_receiv,inventories,amor_exp,nca_within_1y,sett_rsrv,loanto_oth_bank_fi,premium_receiv,reinsur_receiv,reinsur_res_receiv,pur_resale_fa,oth_cur_assets,current_assets,fa_avail_for_sale,htm_invest,lt_eqt_invest,invest_real_estate,time_deposits,oth_assets,lt_rec,fix_assets,cip,const_materials,fixed_assets_disp,produc_bio_assets,oil_and_gas_assets,intan_assets,r_and_d,goodwill,lt_amor_exp,defer_tax_assets,decr_in_disbur,oth_nca,total_nca,cash_reser_cb,depos_in_oth_bfi,prec_metals,deriv_assets,rr_reins_une_prem,rr_reins_outstd_cla,rr_reins_lins_liab,rr_reins_lthins_liab,refund_depos,ph_pledge_loans,refund_cap_depos,indep_acct_assets,client_depos,client_prov,transac_seat_fee,invest_as_receiv,total_assets,lt_borr,st_borr,cb_borr,depos_ib_deposits,loan_oth_bank,trading_fl,notes_payable,acct_payable,adv_receipts,sold_for_repur_fa,comm_payable,payroll_payable,taxes_payable,int_payable,div_payable,oth_payable,acc_exp,deferred_inc,st_bonds_payable,payable_to_reinsurer,rsrv_insur_cont,acting_trading_sec,acting_uw_sec,non_cur_liab_due_1y,oth_cur_liab,current_liabilities,bond_payable,lt_payable,specific_payables,estimated_liab,defer_tax_liab,defer_inc_non_cur_liab,oth_ncl,total_ncl,depos_oth_bfi,deriv_liab,depos,agency_bus_liab,oth_liab,prem_receiv_adva,depos_received,ph_invest,reser_une_prem,reser_outstd_claims,reser_lins_liab,reser_lthins_liab,indept_acc_liab,pledge_borr,indem_payable,policy_div_payable,total_liabilities,treasury_share,ordin_risk_reser,forex_differ,invest_loss_unconf,minority_int,total_equity,total_hldr_eqy_inc_min_int,total_liab_hldr_eqy,lt_payroll_payable,oth_comp_income,oth_eqt_tools,oth_eqt_tools_p_shr,lending_funds,acc_receivable,st_fin_payable,payables,hfs_assets,hfs_sales,cost_fin_assets,fair_value_fin_assets,contract_assets,contract_liab,accounts_receiv_bill,accounts_pay,oth_rcv_total,fix_assets_total,cip_total,oth_pay_total,long_pay_total,debt_invest,oth_debt_invest,update_flag
|
||||||
|
600519.SH,20251030,20251030,20250930,1,1,3,1252270215.0,1374964415.72,210875009053.38,48503784606.05,,51753057846.45,,5209529939.88,25531737.62,,21229757.91,,,55858862716.48,,4686422347.31,,135402538025.64,,,,3505663836.03,53251632.86,256587161700.86,,,,3818474.9,,,,21170758112.81,3534669471.18,,,,,8649225375.62,165998778.47,,137287075.5,5811949314.43,2724893752.7,181022050.45,48151023229.0,,,,,,,,,,,,,,,,,304738184929.86,,,,14473441763.35,,,,2822271882.72,,,,471949375.75,6840000739.89,,,,,,,,,,,57447774.54,974593908.67,38763379268.53,,,,,64664514.62,,,269780788.48,,,,,,,,,,,,,,,,,39033160057.01,6000465970.56,1061529724.0,,,8635060486.62,257069964386.23,265705024872.85,304738184929.86,,-1055242.36,,,,,,,,,,,,7749027043.43,5235061677.5,2822271882.72,71073860.68,21170758112.81,3534669471.18,5374646780.18,,1010008247.97,496798634.84,1
|
||||||
|
600519.SH,20250403,20250403,20241231,1,1,4,1256197800.0,1374964415.72,182787415205.05,46635793479.39,,59295822956.89,248513280.0,1984407967.5,18974192.75,29955673.47,26975033.2,,,54343285157.47,,1210959803.42,,127187293298.17,,,,7220310691.1,160176582.69,251726674636.66,,,,7625167.83,,,,21871446747.14,2149619937.05,,,,,8850205831.0,98522878.42,,152105949.85,5520006868.83,2381228475.45,232395817.46,47217905282.04,,,,,,,,,,,,,,,,,298944579918.7,,,,23102858820.97,,,,3514969230.31,,,,5824371399.07,7717686541.38,,,5429006700.86,,,,,,,,111951112.2,1222693799.51,56515990618.96,,,,,103367763.38,,,417274179.14,,,,,,,,,,,,,,,,,56933264798.1,,1061529724.0,,,8905330721.13,233105984399.47,242011315120.6,298944579918.7,,-9916224.69,,,,,,,,,,,,9592453014.66,2003382160.25,3514969230.31,29955673.47,21871446747.14,2149619937.05,5429006700.86,,1515174439.92,,0
|
||||||
|
600519.SH,20241026,20241026,20240930,1,1,3,1256197800.0,1374964415.72,192903581645.13,41119548595.8,,60084745614.27,200794360.04,1149046136.5,10131702.74,,41754330.78,,,48224880009.62,,154135489.78,,122685688179.71,,,,5785433457.13,19751378.42,238419577361.93,,,,4384742.38,,,,20237604798.2,2878910487.96,,,,,8668801938.29,160771184.78,,154464372.98,5907973419.43,2579164247.78,213888818.21,48351145595.76,,,,,,,,,,,,,,,,,286770722957.69,,,,12434986061.3,,,,2652185045.16,,,,446945580.18,6342664524.46,,57000000.0,,,,,,,,,47926667.37,1235273121.23,38723890549.12,,,,,74818111.11,,,358668170.4,,,,,,,,,,,,,,,,,39082558719.52,,1061529724.0,,,9978709237.89,237709455000.28,247688164238.17,286770722957.69,,-6367180.37,,,,,,,,,,,,9930767399.77,1159177839.24,2652185045.16,63216702.94,20237604798.2,2878910487.96,5633142149.65,,3227025895.78,,0
|
||||||
|
600519.SH,20240403,20240403,20231231,1,1,4,1256197800.0,1374964415.72,172983178300.09,38998763095.13,,69070136376.12,400712059.93,13933440.0,60373410.41,27502107.3,34585111.79,,,46435185061.53,,,,105553836462.58,,,,3504849885.05,71403906.57,225172517821.28,,,,4138545.33,,,,19909280655.97,2137464700.45,,,,,8572267313.84,218015555.49,,160058930.14,4645887425.1,2130818189.27,109563497.23,47527142270.97,,,,,,,,,,,,,,,,,272699660092.25,,,,12034492909.95,,,,3093091103.67,,,,5401921213.77,6949663893.87,,,5213133685.87,,,,,,,,57054879.48,1822498012.3,48697611501.2,,,,,78943062.19,,,345579296.23,,,,,,,,,,,,,,,,,49043190797.43,,1061529724.0,,,7987897687.39,215668571607.43,223656469294.82,272699660092.25,,-6061727.51,,,,,,,,,,,,14125755802.29,74306850.41,3093091103.67,27502107.3,19909280655.97,2137464700.45,5213133685.87,,5323002071.02,,1
|
||||||
|
600519.SH,20230331,20230331,20221231,1,1,4,1256197800.0,1374964415.72,161301978184.73,32522779178.88,,58274318733.23,,105453212.0,20937144.0,31818622.84,897377162.27,,,38824374236.24,,2123601333.33,,116172711554.59,,,,,160843674.42,216611435672.92,,,,5335046.99,,,,19742622547.86,2208329892.95,,,,,7083177226.45,190536632.6,,146455346.9,3458931368.11,4134744407.92,,37753369322.33,,,,,,,,,,,,,,,,,254364804995.25,,,,12874043355.42,,,,2408371053.69,,,,4782311242.41,6896555423.83,,,4543842833.87,,,,,,,,109351155.28,1979272808.9,49065668798.38,,,,,,,,334447942.79,,,,,,,,,,,,,,,,,49400116741.17,,1061529724.0,,,7458015858.08,197506672396.0,204964688254.08,254364804995.25,,-10776907.33,,,,,,,,,,,,15471920924.98,126390356.0,2408371053.69,31818622.84,19742622547.86,2208329892.95,4543842833.87,,380685319.09,,0
|
||||||
|
600519.SH,20220331,20220331,20211231,1,1,4,1256197800.0,1374964415.72,160716861920.19,25142832818.16,,51810243607.11,,,,33158974.32,389109841.28,,,33394365084.83,,,,135067287778.03,,,,,71527560.74,220765692846.31,,,,5242431.75,,,,17472173182.85,2321988541.82,,,,,6208358330.24,,,139342455.82,2237206443.84,3425175000.0,2059761333.33,34402502313.59,,,,,,,,,,,,,,,,,255168195159.9,,,,21763575647.32,,,,2009832495.56,,,,3677845718.53,11979802144.01,,,4124404781.29,,,,,,,,104319886.87,1535976293.22,57914222254.82,,,,,,,,296466199.74,,,,,,,,,,,,,,,,,58210688454.56,,1061529724.0,,,7418137908.05,189539368797.29,196957506705.34,255168195159.9,,-13017880.78,,,,,,,,,,,,12718465288.02,,2009832495.56,33158974.32,17472173182.85,2321988541.82,4124404781.29,,170468623.71,,0
|
||||||
|
600519.SH,20210331,20210331,20201231,1,1,4,1256197800.0,1374964415.72,137594403807.99,20174922608.93,,36091090060.9,,1532728979.67,,34488582.19,898436259.15,,,28869087678.06,,,,118199586541.06,,,,,26736855.91,185652154956.94,,,,,,,,16225082847.29,2447444843.03,,,,,4817170981.91,,,147721526.43,1123225086.37,2953036834.8,,27743655570.52,,,,,,,,,,,,,,,,,213395810527.46,,,,14241859949.77,,,,1342267668.12,,,,2981125503.86,8919821015.58,,,3257245259.42,,,,,,,,,1609801368.51,45673669912.95,,,,,1457513.23,,,1457513.23,,,,,,,,,,,,,,,,,45675127426.18,,927577822.67,,,6397948013.72,161322735087.56,167720683101.28,213395810527.46,,-5331367.75,,,,,,,,,,,,13321549147.69,1532728979.67,1342267668.12,34488582.19,16225082847.29,2447444843.03,3257245259.42,,20143397.78,,1
|
||||||
|
600519.SH,20200422,20200422,20191231,1,1,4,1256197800.0,1374964415.72,115892337407.39,16595699037.02,,13251817237.85,,1463000645.08,,76540490.99,1549477339.41,,,25284920806.33,,,,117377810563.27,,,,,20904926.15,159024472009.08,,,,,,,,15144182726.19,2518938271.72,,,,,4728027345.7,,,158284338.19,1099946947.57,48750000.0,,24017900033.42,,,,,,,,,,,,,,,,,183042372042.5,,,,11048756010.02,,,,1513676611.44,13740329698.82,,,2445071026.57,8755949266.98,11081.87,446880000.0,3142625517.14,,,,,,,,,,41093299212.84,,,,,72692601.01,,,72692601.01,,,,,,,,,,,,,,,,,41165991813.85,,898349936.77,,,5866030353.54,136010349875.11,141876380228.65,183042372042.5,,-7198721.79,,,,,,,,,,,,,1463000645.08,1513676611.44,76540490.99,15144182726.19,2518938271.72,3589516599.01,,,,0
|
||||||
|
600519.SH,20190329,20190329,20181231,1,1,4,1256197800.0,1374964415.72,95981943953.56,13444221244.84,,112074791420.06,,563739710.0,,50000548.65,1182378508.06,,343889944.47,23506950842.22,,,,,,,,,140084334.11,137861835307.57,29000000.0,,,,,,,15248556585.02,1954322968.68,,,,,3499175374.52,,,168414678.77,1049294821.45,36075000.0,,21984839428.44,,,,,,,,,,,,,,,,,159846674736.01,,,,11473011885.36,,,,1178296416.59,13576516813.44,,,2034514658.91,10771075966.85,42770451.84,,3362000620.49,,,,,,,,,,42438186813.48,,,,,,,,,,,,,,,,,,,,,,,,,42438186813.48,,788302643.63,,,4569923590.48,112838564332.05,117408487922.53,159846674736.01,,-7065725.7,,,,,,,,,,,,,563739710.0,1178296416.59,393890493.12,15248556585.02,1954322968.68,3404771072.33,,,,0
|
||||||
|
600519.SH,20180328,20180328,20171231,1,1,4,1256197800.0,1374964415.72,80011307450.33,8215595509.69,,87868869913.34,,1221706039.0,,31323463.35,790807322.07,,241458615.89,22057481376.46,,,,,,,,,37539231.49,112249185961.6,29000000.0,,,,,,,15244096632.02,2016405005.77,,,,,3458622239.38,,,177859674.54,1401797361.77,33150000.0,,22360930913.48,,,,,,,,,,,,,,,,,134610116875.08,,,,10462613754.14,,,,992055910.47,14429106902.38,,,1901644193.64,7726135741.9,23414593.67,,3039948303.8,,,,,,,,,,38574919400.0,,,15570000.0,,,,,15570000.0,,,,,,,,,,,,,,,,,38590489400.0,,600859229.62,,,4568104646.12,91451522828.96,96019627475.08,134610116875.08,,-7401576.4,,,,,,,,,,,,,1221706039.0,992055910.47,272782079.24,15244096632.02,2016405005.77,3063362897.47,15570000.0,,,0
|
||||||
|
600519.SH,20170415,20170415,20161231,1,1,4,1256197800.0,1374964415.72,62717808036.61,7135649963.12,,66854962118.22,,817627172.0,,77227565.37,1046100696.92,,140904856.88,20622251825.55,,,,390000000.0,,,,,231474570.63,90180548805.57,29000000.0,,,,,,,14453177439.34,2745579995.68,,,,,3531740625.6,,,188118776.51,1745539120.68,60833517.03,,22753989474.84,,,,,,,,,,,,,,,,,112934538280.41,,,,10778818332.13,,,,1040608203.18,17541082237.01,,,1628507252.03,4272289194.57,34481635.33,,1724638571.44,,,,,,,,,,37020425425.69,,,15570000.0,,,,,15570000.0,,,,,,,,,,,,,,,,,37035995425.69,,420758409.36,,,3004405071.47,72894137783.25,75898542854.72,112934538280.41,,-11240841.56,,,,,,,,,,,,,817627172.0,1040608203.18,218132422.25,14453177439.34,2745579995.68,1759120206.77,15570000.0,,,0
|
||||||
|
600519.SH,20160324,20160324,20151231,1,1,4,1256197800.0,1374964415.72,54878964497.77,6210524497.54,,36800749895.06,,8578935406.82,230768.89,48219018.75,1477734859.9,,85347051.47,18013297022.7,,,,,,,,,,65004514023.59,29000000.0,,,,,,,11415953189.72,4895150716.51,260855.92,682594.04,,,3582462431.04,,,198603537.81,1155336074.14,19500000.0,,21296949399.18,,,,,,,,,,,,,,,,,86301463422.77,,,,5967622299.13,,,,880976072.09,8261582073.04,,,975477747.06,2515516156.83,27409447.4,,1423139205.93,,,,,,,,,,20051723001.48,,,15570000.0,,,,,15570000.0,,,,,,,,,,,,,,,,,20067293001.48,,218361303.43,,,2308191982.3,63925978438.99,66234170421.29,86301463422.77,,-13034075.47,,,,,,,,,,,,,8579166175.71,880976072.09,133566070.22,11416635783.76,4895411572.43,1450548653.33,15570000.0,,,1
|
||||||
|
13
data/CN/600519.SH/cash_flow.csv
Normal file
13
data/CN/600519.SH/cash_flow.csv
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
ts_code,ann_date,f_ann_date,date,comp_type,report_type,end_type,net_profit,finan_exp,c_fr_sale_sg,recp_tax_rends,n_depos_incr_fi,n_incr_loans_cb,n_inc_borr_oth_fi,prem_fr_orig_contr,n_incr_insured_dep,n_reinsur_prem,n_incr_disp_tfa,ifc_cash_incr,n_incr_disp_faas,n_incr_loans_oth_bank,n_cap_incr_repur,c_fr_oth_operate_a,c_inf_fr_operate_a,c_paid_goods_s,c_paid_to_for_empl,c_paid_for_taxes,n_incr_clt_loan_adv,n_incr_dep_cbob,c_pay_claims_orig_inco,pay_handling_chrg,pay_comm_insur_plcy,oth_cash_pay_oper_act,st_cash_out_act,net_cash_flow,oth_recp_ral_inv_act,c_disp_withdrwl_invest,c_recp_return_invest,n_recp_disp_fiolta,n_recp_disp_sobu,stot_inflows_inv_act,c_pay_acq_const_fiolta,c_paid_invest,n_disp_subs_oth_biz,oth_pay_ral_inv_act,n_incr_pledge_loan,stot_out_inv_act,n_cashflow_inv_act,c_recp_borrow,proc_issue_bonds,oth_cash_recp_ral_fnc_act,stot_cash_in_fnc_act,free_cashflow,c_prepay_amt_borr,c_pay_dist_dpcp_int_exp,incl_dvd_profit_paid_sc_ms,oth_cashpay_ral_fnc_act,stot_cashout_fnc_act,n_cash_flows_fnc_act,eff_fx_flu_cash,n_incr_cash_cash_equ,c_cash_equ_beg_period,c_cash_equ_end_period,c_recp_cap_contrib,incl_cash_rec_saims,uncon_invest_loss,prov_depr_assets,depreciation,amort_intang_assets,lt_amort_deferred_exp,decr_deferred_exp,incr_acc_exp,loss_disp_fiolta,loss_scr_fa,loss_fv_chg,invest_loss,decr_def_inc_tax_assets,incr_def_inc_tax_liab,decr_inventories,decr_oper_payable,incr_oper_payable,others,im_net_cashflow_oper_act,conv_debt_into_cap,conv_copbonds_due_within_1y,fa_fnc_leases,im_n_incr_cash_equ,net_dism_capital_add,net_cash_rece_sec,credit_impa_loss,use_right_asset_dep,oth_loss_asset,end_bal_cash,beg_bal_cash,end_bal_cash_equ,beg_bal_cash_equ,update_flag
|
||||||
|
600519.SH,20251030,20251030,20250930,1,1,3,,,138791719991.59,,-8659745768.25,,,,,,,2171830654.51,,,,4429717886.39,136733522764.24,8595277757.58,12393481128.92,59108713942.04,358885355.55,12507272127.36,,105733217.59,,7567357079.93,98536720608.97,38196802155.27,24708323.39,13105136000.0,80202855.44,87042.0,,13210134220.83,2282862269.89,16345831315.16,,4808731.52,,18633502316.57,-5423368095.74,,,,,33738068687.0576,,37212595804.69,2541434067.5,6031207701.59,43243803506.28,-43243803506.28,2742531.2,-10467626915.55,169970089257.83,159502462342.28,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
|
||||||
|
600519.SH,20250403,20250403,20241231,1,1,4,89334728025.9,14474584.09,182645203339.89,,11060205782.1,,,,,,,3122827833.43,,,,3258097705.14,200086334660.56,10824874163.03,15352541000.17,77055621533.11,262376929.65,-4585245646.29,,97061751.28,,9015412761.18,107622642492.13,92463692168.43,5532536.42,8550000000.0,92382151.66,715708.44,,8648630396.52,4678712053.56,5745136000.0,,9984973.67,,10433833027.23,-1785202630.71,,,,,56965618673.6519,,70951027702.94,2164148570.54,116478781.87,71067506484.81,-71067506484.81,-1082747.55,19609900305.36,150360188952.47,169970089257.83,,,,,1721165327.14,249170059.35,20191550.34,,,-388852.05,7287333.87,-60980724.35,-9130340.37,-874119443.73,24424701.19,-7908100095.94,1761268977.59,8065959951.08,,92463692168.43,,,,19609900305.36,,,23248436.03,94492678.29,,164297949257.83,147360188952.47,5672140000.0,3000000000.0,1
|
||||||
|
600519.SH,20241026,20241026,20240930,1,1,3,,,129685318970.82,2818171.29,394283234.48,,,,,,,2181721943.36,,,,2374170205.15,134638312525.1,8148825214.67,12669415741.48,56721478607.21,464241534.03,5154820988.02,,66013822.7,,6992130399.54,90216926307.65,44421386217.45,5532536.42,6200000000.0,68399488.96,75010.5,,6274007035.88,2874366279.39,4000000000.0,,5049812.44,,6879416091.83,-605409055.95,,,,,26947775900.0195,,38942461843.34,156098570.54,46854621.47,38989316464.81,-38989316464.81,-65439.09,4826595257.6,150360188952.47,155186784210.07,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
|
||||||
|
600519.SH,20240403,20240403,20231231,1,1,4,77521476277.8,12624628.35,163699909417.62,1500047.04,-810223002.76,,,,,,,3018786023.42,,,,2346196470.63,168256168955.95,11029476036.21,13845293907.26,66683472509.22,-2051930316.19,1570003429.01,,142896151.21,,7943709518.14,101662921234.86,66593247721.09,4605886.63,7549947301.15,140715000.0,24948352.95,,7720216540.73,2619755888.79,14817852800.0,,7021867.1,,17444630555.89,-9724414015.16,,,,,77775322924.6562,,58754786730.01,2204530367.41,134315261.93,58889101991.94,-58889101991.94,1718255.65,-2018550030.36,152378738982.83,150360188952.47,,,,,1651428992.2,196656866.73,16886608.86,,,479736.97,-1632253.14,-3151962.5,-34025967.82,-1050934956.22,-83685028.8,-7610810825.29,-3465130974.53,-591505967.47,,66593247721.09,,,,-2018550030.36,,,-37871293.26,72443839.21,,147360188952.47,152378738982.83,3000000000.0,,1
|
||||||
|
600519.SH,20230331,20230331,20221231,1,1,4,65375136766.75,12023204.77,140691678592.0,33191912.56,-8916033228.67,,,,,,,3247615476.04,,,,2759422171.88,137815874923.81,8357859151.03,11752241598.62,62043324506.36,723778672.0,13037761321.9,,79226410.98,,5123087432.89,101117279093.78,36698595830.03,4971762.18,,5880000.0,355149.0,,11206911.18,5306546416.54,210000000.0,,31486829.54,,5548033246.08,-5536826334.9,,,,,62574291590.3602,,57370196191.46,2618815078.45,54332788.37,57424528979.83,-57424528979.83,911088.01,-26261848396.69,178640587379.52,152378738982.83,,,,,1443574818.5,156016278.9,11487619.04,,,-213235.69,20780992.88,,-63840000.0,-1221724924.27,,-5430009151.41,-15051874095.8,-8644820580.52,,36698595830.03,,,,-26261848396.69,,,14686546.25,77371590.63,,152378738982.83,178640587379.52,,,1
|
||||||
|
600519.SH,20220331,20220331,20211231,1,1,4,55720529956.46,13529867.76,119320536796.65,,7511166145.93,,,,,,,3145747032.91,,,,1643536862.48,131620986837.97,7745959630.9,10061366201.66,44609684025.28,484244272.0,559089326.28,,163462728.48,,4368504506.0,67592310690.6,64028676147.37,9983452.63,6079930.68,860000.0,2463474.29,,19386857.6,3408784532.01,2150000000.0,,23048029.93,,5581832561.94,-5562445704.34,,,,,46165171072.2219,,26476019839.37,2240195683.97,88121549.59,26564141388.96,-26564141388.96,-2026542.6,31900062511.47,146740524868.05,178640587379.52,,,,,1344833911.39,124084418.97,10687874.77,,,,11920829.77,2244726.29,-58255937.39,-1113981357.47,-1457513.23,-4525277406.77,504305749.89,11880880539.56,,64028676147.37,,,,31900062511.47,,,13022441.19,101608046.18,,178640587379.52,146740524868.05,,,1
|
||||||
|
600519.SH,20210331,20210331,20201231,1,1,4,49523329882.4,,107024384560.17,,3189100199.87,,,,,,,3075945383.34,,,,221421226.63,113510851370.01,7230646129.19,8161813197.26,41622706350.37,2978755728.0,-2506406682.56,,107241768.26,,4047026186.46,61841782676.98,51669068693.03,6675319.03,314906521.48,,495904.85,,322077745.36,2089769498.78,20000000.0,,17535402.3,,2127304901.08,-1805227155.72,,,,,49690759472.5839,,24091029750.51,2704262179.11,36507157.75,24127536908.26,-24127536908.26,380639.36,25736685268.41,121003839599.64,146740524868.05,,,,,1195956468.6,110349099.0,10562811.76,,,,100113.92,-4897994.43,-305631.46,-23278138.8,-71235087.78,-3584166871.73,-504008375.44,4945290607.14,,51669068693.03,,,,25736685268.41,,,71371809.85,,,146740524868.05,121003839599.64,,,1
|
||||||
|
600519.SH,20200422,20200422,20191231,1,1,4,43970000792.51,,94980138631.64,,-437417306.8,,,,,,,3667633965.97,,,,1234081863.41,99444437154.22,5521948744.75,7669863126.24,39841352755.42,13000000.0,-4503181198.43,,175423942.78,,5315417150.9,54233824521.66,45210612632.56,7321070.4,,,38080.0,,7359150.4,3148864661.38,,,24180232.27,,3173044893.65,-3165685743.25,,,,833000000.0,-79056107120.0982,,20117402829.22,1853543015.02,,20117402829.22,-19284402829.22,27240.01,22760551300.1,98243288299.54,121003839599.64,833000000.0,833000000.0,,5313489.8,1149884850.35,83262106.36,10331490.16,,,32123.57,478391.99,14018472.46,,-50890686.63,-3504618.12,-1777969964.11,3424860902.28,-1615204718.06,,45210612632.56,,,,22760551300.1,,,,,,121003839599.64,98243288299.54,,,1
|
||||||
|
600519.SH,20190329,20190329,20181231,1,1,4,37829617756.81,,84268695732.62,,1010398131.22,,,,,,,3444983166.57,,,,621558368.29,89345635398.7,5298518032.55,6653137733.66,32032178125.92,3000000.0,920713957.76,,117086309.02,,2935766833.07,47960400991.98,41385234406.72,11244181.3,,,,,11244181.3,1606750226.28,,,33456659.58,,1640206885.86,-1628962704.56,,,,,40235854299.3852,,16441093160.06,2624173549.23,,16441093160.06,-16441093160.06,29006.86,23315207548.96,74928080750.58,98243288299.54,,,,1289685.01,1084662728.58,80431667.22,10331100.62,,,,1808930.93,,,352502540.32,,-1449469465.76,525665014.45,2948394448.54,,41385234406.72,,,,23315207548.96,,,,,,98243288299.54,74928080750.58,,,0
|
||||||
|
600519.SH,20180328,20180328,20171231,1,1,4,29006423236.0,,64421479343.02,,-316204577.99,,,,,,,2722025536.31,,,,542162210.47,67369462511.81,4875768504.16,5489606122.48,23065648503.05,-28393350.8,8727170068.53,,146330216.72,,2940296363.54,45216426427.68,22153036084.13,21430672.95,,,16450.0,,21447122.95,1125017192.45,,,17075145.1,,1142092337.55,-1120645214.6,,,,6000000.0,29606965018.1472,,8905177880.8,379363405.61,,8905177880.8,-8899177880.8,72948.86,12133285937.59,62794794812.99,74928080750.58,6000000.0,6000000.0,,-8053703.95,1035052733.45,80522705.77,10259101.97,,,,3291895.5,,,343741758.91,,-1435229550.91,-458728523.99,-6424243568.62,,22153036084.13,,,,12133285937.59,,,,,,74928080750.58,62794794812.99,,,0
|
||||||
|
600519.SH,20170415,20170415,20161231,1,1,4,17930643109.88,,61012964102.54,,4811196033.0,,,,,,,1265842778.44,,,,189142723.95,67279145637.93,2773020403.27,4674154236.66,17510516331.2,42393350.8,2340362436.74,,115962455.33,,2371486776.88,29827895990.88,37451249647.05,5562351.19,,,92084.5,,5654435.69,1019178136.92,,,88977102.97,,1108155239.89,-1102500804.2,,,,16000000.0,39906310883.5675,,8350512252.23,532067286.55,,8350512252.23,-8334512252.23,72317.8,28014308908.42,34780485904.57,62794794812.99,16000000.0,16000000.0,,12327496.22,842728072.04,80457895.99,11008704.17,,,,1869869.13,,,-590203046.54,,-2608954802.85,7669650565.84,14101721783.17,,37451249647.05,,,,28014308908.42,,,,,,62794794812.99,34780485904.57,,,0
|
||||||
|
600519.SH,20160324,20160324,20151231,1,1,4,16454996625.22,,37083071835.58,,2011171589.94,,,,,,,766016183.29,,,,153647241.24,40013906850.05,2967732630.37,4536877341.1,14003048933.21,-11600000.0,-848231824.96,,62297196.96,,1867442431.65,22577566708.33,17436340141.72,33357886.05,60050000.0,3869172.05,8772937.39,,106049995.49,2061470481.32,25050000.0,,68319778.76,,2154840260.08,-2048790264.59,,,22000000.0,22000000.0,16532758779.4344,55917672.0,5554101966.61,513009332.72,,5610019638.61,-5588019638.61,-16273531.71,9783256706.81,24997229197.76,34780485904.57,,,,-540313.39,761458678.29,79883270.42,6804749.02,,,,-17419.86,,-3869276.9,-333734968.43,,-3030932654.85,-6705177839.34,10207469291.54,,17436340141.72,,,,9783256706.81,,,,,,34780485904.57,24997229197.76,,,0
|
||||||
|
13
data/CN/600519.SH/income_statement.csv
Normal file
13
data/CN/600519.SH/income_statement.csv
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
ts_code,ann_date,f_ann_date,date,report_type,comp_type,end_type,basic_eps,diluted_eps,total_revenue,revenue,int_income,prem_earned,comm_income,n_commis_income,n_oth_income,n_oth_b_income,prem_income,out_prem,une_prem_reser,reins_income,n_sec_tb_income,n_sec_uw_income,n_asset_mg_income,oth_b_income,fv_value_chg_gain,invest_income,ass_invest_income,forex_gain,total_cogs,oper_cost,int_exp,comm_exp,biz_tax_surchg,sell_exp,admin_exp,fin_exp,assets_impair_loss,prem_refund,compens_payout,reser_insur_liab,div_payt,reins_exp,oper_exp,compens_payout_refu,insur_reser_refu,reins_cost_refund,other_bus_cost,operate_profit,non_oper_income,non_oper_exp,nca_disploss,total_profit,income_tax,n_income,net_income,minority_gain,oth_compr_income,t_compr_income,compr_inc_attr_p,compr_inc_attr_m_s,ebit,ebitda,insurance_exp,undist_profit,distable_profit,rd_exp,fin_exp_int_exp,fin_exp_int_inc,transfer_surplus_rese,transfer_housing_imprest,transfer_oth,adj_lossgain,withdra_legal_surplus,withdra_legal_pubfund,withdra_biz_devfund,withdra_rese_fund,withdra_oth_ersu,workers_welfare,distr_profit_shrhder,prfshare_payable_dvd,comshare_payable_dvd,capit_comstock_div,continued_net_profit,update_flag
|
||||||
|
600519.SH,20251030,20251030,20250930,1,1,3,51.53,51.53,130903889634.88,128453707655.86,2450181979.02,,,,,,,,,,,,,,6956011.89,59165.27,,,41446175513.84,11183972073.77,136006174.86,55753.36,20645707926.55,4478672252.48,5503383668.62,-634730437.77,,,,,,,,,,,,89489694566.48,39970046.24,126220158.04,,89403444454.68,22504639708.51,66898804746.17,64626746712.18,2272058033.99,7966781.33,66906771527.5,64635607694.51,2271163832.99,88847437026.1,,,,,113086640.98,6505588.51,644763065.59,,,,,,,,,,,,,,,66898804746.17,1
|
||||||
|
600519.SH,20250403,20250403,20241231,1,1,4,68.64,68.64,174144069958.25,170899152276.34,3244917681.91,,,,,,,,,,,,,,60980724.35,9130340.37,,,54547219888.6,13789482367.98,105127802.03,94078.17,26926161474.99,5639300059.49,9315650060.38,-1470219863.34,,,,,,,,,,,,119688579453.23,70936575.97,120937834.74,,119638578194.46,30303850168.56,89334728025.9,86228146421.62,3106581604.28,-3854497.18,89330873528.72,86224291924.44,3106581604.28,118147859673.12,120232879288.24,,,,218375472.87,14474584.09,1476991223.18,,,,,,,,,,,,,,,89334728025.9,1
|
||||||
|
600519.SH,20241026,20241026,20240930,1,1,3,48.42,48.42,123122542625.45,120776131874.69,2346410750.76,,,,,,,,,,,,,,40768101.0,8019358.73,,,39192736850.97,10228077394.34,72011709.35,212030.22,19911791735.67,4235182341.09,5767525028.76,-1172804656.48,,,,,,,,,,,,83996733560.98,54052930.61,1902888.56,,84048883603.03,21017421363.48,63031462239.55,60827552118.51,2203910121.04,-305452.86,63031156786.69,60827246665.65,2203910121.04,82775149003.59,,,,,140401034.71,7226289.08,1170528993.99,,,,,,,,,,,,,,,63031462239.55,1
|
||||||
|
600519.SH,20240403,20240403,20231231,1,1,4,59.49,59.49,150560330316.45,147693604994.14,2866725322.31,,,,,,,,,,,,,,3151962.5,34025967.82,,,46923018175.28,11867273851.78,113500129.93,68578.57,22234175898.6,4648613585.82,9729389252.31,-1789503701.48,,,,,,,,,,,,103708655208.38,86779655.95,132881174.52,,103662553689.81,26141077412.01,77521476277.8,74734071550.75,2787404727.05,4715179.82,77526191457.62,74738786730.57,2787404727.05,101882453313.55,103819869620.55,,,,157371873.01,12624628.35,1942301920.98,,,,,,,,,,,,,,,77521476277.8,1
|
||||||
|
600519.SH,20230331,20230331,20221231,1,1,4,49.93,49.93,127553959355.97,124099843771.99,3454115583.98,,,,,,,,,,,,,,,63840000.0,,,39762996163.1,10093468616.63,105584206.24,143141.51,18495818534.22,3297724190.94,9012191073.63,-1391805826.72,,,,,,,,,,,,87879521782.39,70852285.4,248884319.61,,87701489748.18,22326352981.43,65375136766.75,62716443738.27,2658693028.48,2240973.45,65377377740.2,62718684711.72,2658693028.48,86423662719.98,88112113027.05,,,,135185680.4,12023204.77,1475422303.64,,,,,,,,,,,,,,,65375136766.75,1
|
||||||
|
600519.SH,20220331,20220331,20211231,1,1,4,41.76,41.76,109464278563.89,106190154843.76,3274123720.13,,,,,,,,,,,,,,-2244726.29,58255937.39,,,34789924908.66,8983377809.96,173897197.98,115082.12,15304469070.03,2737369434.78,8450274065.03,-934523406.02,,,,,,,,,,,,74750880777.52,68989219.74,291838102.5,,74528031894.76,18807501938.3,55720529956.46,52460144378.16,3260385578.3,-7686513.03,55712843443.43,52452457865.13,3260385578.3,73760346160.4,75341560411.71,,,,61923213.59,13529867.76,944578412.02,,,,,,,,,,,,,,,55720529956.46,0
|
||||||
|
600519.SH,20210331,20210331,20201231,1,1,4,37.17,37.17,97993240501.21,94915380916.72,3077859584.49,,,,,,,,,,,,,,4897994.43,305631.46,,,31376502397.41,8154001476.28,111128537.31,105888.96,13886517290.78,2547745650.95,6789844289.39,-234610582.44,,,,,,,,,,,,66635079882.38,11051136.15,449189027.42,,66196941991.11,16673612108.71,49523329882.4,46697285429.81,2826044452.59,1867354.04,49525197236.44,46699152783.85,2826044452.59,66395265674.05,67712134053.41,,,,50398036.33,,278697733.32,,,,,,,,,,,,,,,49523329882.4,1
|
||||||
|
600519.SH,20200422,20200422,20191231,1,1,4,32.8,32.8,88854337488.76,85429573467.25,3424471568.68,,292452.83,,,,,,,,,,,,-14018472.46,,,,29817566523.17,7430013945.12,145752825.87,73178.4,12733292400.79,3278990982.26,6167982844.22,7458015.66,,,,,,,,,,,,59041489276.14,9454451.03,268391929.45,,58782551797.72,14812551005.21,43970000792.51,41206471014.43,2763529778.08,-132996.09,43969867796.42,41206338018.34,2763529778.08,59062997887.83,60306476334.7,,,,48688841.05,,20667205.74,,,,,,,,,,,,,,,43970000792.51,0
|
||||||
|
600519.SH,20190329,20190329,20181231,1,1,4,28.02,28.02,77199384110.22,73638872388.03,3559634363.7,,877358.49,,,,,,,,,,,,,,,,25866030564.04,6522921833.77,136317779.84,124387.35,11288926846.97,2572076872.16,5325940762.24,-3521209.23,1289685.01,,,,,,,,,,,51342987681.18,11619526.11,527003759.82,,50827603447.47,12997985690.66,37829617756.81,35203625263.22,2625992493.59,335850.7,37829953607.51,35203961113.92,2625992493.59,51339541471.95,52514966968.37,,,,21953605.93,,14410823.72,,,,,,,,,,,,,,,37829617756.81,0
|
||||||
|
600519.SH,20180328,20180328,20171231,1,1,4,21.56,21.56,61062756866.16,58217861314.17,2844310646.33,,584905.66,,,,,,,,,,,,,,,,22122749332.71,5940436371.97,135187797.06,75378.0,8404214470.69,2986068544.99,4720542820.14,-55722346.19,-8053703.95,,,,,,,,,,,38940007533.45,12201990.51,212137381.36,,38740072142.6,9733648906.6,29006423236.0,27079360255.74,1927062980.26,3839265.16,29010262501.16,27083199520.9,1927062980.26,38873575353.49,39999409894.68,,,,,,,,,,,,,,,,,,,,,29006423236.0,0
|
||||||
|
600519.SH,20170415,20170415,20161231,1,1,4,13.31,13.31,40155084412.93,38862189993.84,1292722909.66,,171509.43,,,,,,,,,,,,,,,,15889459243.51,3410104085.97,122961049.54,73593.72,6508926343.26,1681052022.9,4187189840.42,-33175188.52,12327496.22,,,,,,,,,,,24265625169.42,8553926.06,316298138.37,1960971.07,23957880957.11,6027237847.23,17930643109.88,16718362734.16,1212280375.72,1793233.91,17932436343.79,16720155968.07,1212280375.72,24243509814.67,25177704486.87,,,,,,,,,,,,,,,,,,,,,,0
|
||||||
|
600519.SH,20160324,20160324,20151231,1,1,4,12.34,12.34,33446859045.58,32659583725.28,786545320.3,,730000.0,,,,,,,,,,,,,3869276.9,,,11291736359.61,2538337449.06,74159619.28,62172.83,3449170637.4,1484961519.21,3812852076.19,-67266800.97,-540313.39,,,,,,,,,,,22158991962.87,4823183.32,162100184.85,188439.42,22001714961.34,5546718336.12,16454996625.22,15503090276.38,951906348.84,-12415031.48,16442581593.74,15490675244.9,951906348.84,22087565885.0,22935712582.73,,,,,,,,,,,,,,,,,,,,,,0
|
||||||
|
750
data/CN/600519.SH/report.html
Normal file
750
data/CN/600519.SH/report.html
Normal file
@ -0,0 +1,750 @@
|
|||||||
|
<html><head><title>Financial Report</title><style>
|
||||||
|
.fin-table { width: 100%; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 13px; }
|
||||||
|
.fin-table th { background-color: #f8f9fa; padding: 8px; border-bottom: 2px solid #ddd; text-align: right; }
|
||||||
|
.fin-table td { padding: 6px 8px; border-bottom: 1px solid #eee; text-align: right; }
|
||||||
|
.fin-table .row-header { text-align: left !important; font-weight: 500; color: #666; width: 150px; }
|
||||||
|
.group-header { background-color: #f0f0f5 !important; font-weight: bold; text-align: left !important; color: #333; }
|
||||||
|
.hover-row:hover { background-color: #e6e6fa !important; }
|
||||||
|
.text-green { color: #008000; }
|
||||||
|
.bg-green { background-color: #d1e7dd; color: #0f5132; }
|
||||||
|
.text-red { color: #dc3545; }
|
||||||
|
.bg-red { background-color: #f8d7da; color: #842029; }
|
||||||
|
.text-blue-i { color: #0d6efd; font-style: italic; }
|
||||||
|
.italic { font-style: italic; }
|
||||||
|
.bg-khaki { background-color: #F0E68C; }
|
||||||
|
.info-table { width: 100%; margin-bottom: 15px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 13px; }
|
||||||
|
.info-table td { padding: 5px 10px; border: 1px solid #eee; }
|
||||||
|
.info-label { background-color: #f8f9fa; font-weight: bold; width: 100px; color: #666; }
|
||||||
|
</style></head><body>
|
||||||
|
<h1>Financial Report</h1>
|
||||||
|
<table class='info-table'>
|
||||||
|
<tr>
|
||||||
|
<td class='info-label'>代码</td><td class='info-label'>简称</td><td class='info-label'>日期</td><td class='info-label'>上市日期</td><td class='info-label'>PE</td><td class='info-label'>PB</td><td class='info-label'>股息率(%)</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>600519.SH</td><td>贵州茅台</td><td>2025-12-14</td><td>2001-08-27</td><td>20.63</td><td>6.92</td><td>3.64%</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div style='overflow-x: auto;'>
|
||||||
|
<table class='fin-table'>
|
||||||
|
<thead><tr><th class='row-header'>指标</th>
|
||||||
|
<th>2025 Q3</th>
|
||||||
|
<th>2024</th>
|
||||||
|
<th>2023</th>
|
||||||
|
<th>2022</th>
|
||||||
|
<th>2021</th>
|
||||||
|
<th>2020</th>
|
||||||
|
<th>2019</th>
|
||||||
|
<th>2018</th>
|
||||||
|
<th>2017</th>
|
||||||
|
<th>2016</th>
|
||||||
|
<th>2015</th>
|
||||||
|
</tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td colspan='12' class='group-header'>主要指标</td></tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>ROE</td>
|
||||||
|
<td class='bg-green'>25.14%</td>
|
||||||
|
<td class='bg-green'>36.99%</td>
|
||||||
|
<td class='bg-green'>34.65%</td>
|
||||||
|
<td class='bg-green'>31.75%</td>
|
||||||
|
<td class='bg-green'>27.68%</td>
|
||||||
|
<td class='bg-green'>28.95%</td>
|
||||||
|
<td class='bg-green'>30.30%</td>
|
||||||
|
<td class='bg-green'>31.20%</td>
|
||||||
|
<td class='bg-green'>29.61%</td>
|
||||||
|
<td class='bg-green'>22.94%</td>
|
||||||
|
<td class='bg-green'>24.25%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>ROA</td>
|
||||||
|
<td class='bg-green'>21.21%</td>
|
||||||
|
<td class='bg-green'>28.84%</td>
|
||||||
|
<td class='bg-green'>27.41%</td>
|
||||||
|
<td class='bg-green'>24.66%</td>
|
||||||
|
<td class='bg-green'>20.56%</td>
|
||||||
|
<td class='bg-green'>21.88%</td>
|
||||||
|
<td class='bg-green'>22.51%</td>
|
||||||
|
<td class='bg-green'>22.02%</td>
|
||||||
|
<td class='bg-green'>20.12%</td>
|
||||||
|
<td class='bg-green'>14.80%</td>
|
||||||
|
<td class='bg-green'>17.96%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>ROCE/ROIC</td>
|
||||||
|
<td class='bg-green'>34.56%</td>
|
||||||
|
<td class='bg-green'>50.68%</td>
|
||||||
|
<td class='bg-green'>47.24%</td>
|
||||||
|
<td class='bg-green'>43.76%</td>
|
||||||
|
<td class='bg-green'>38.92%</td>
|
||||||
|
<td class='bg-green'>41.16%</td>
|
||||||
|
<td class='bg-green'>43.43%</td>
|
||||||
|
<td class='bg-green'>45.50%</td>
|
||||||
|
<td class='bg-green'>42.51%</td>
|
||||||
|
<td class='bg-green'>33.26%</td>
|
||||||
|
<td class='bg-green'>34.55%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>毛利率</td>
|
||||||
|
<td class='bg-green'>91.46%</td>
|
||||||
|
<td class='bg-green'>92.08%</td>
|
||||||
|
<td class='bg-green'>92.12%</td>
|
||||||
|
<td class='bg-green'>92.09%</td>
|
||||||
|
<td class='bg-green'>91.79%</td>
|
||||||
|
<td class='bg-green'>91.68%</td>
|
||||||
|
<td class='bg-green'>91.64%</td>
|
||||||
|
<td class='bg-green'>91.55%</td>
|
||||||
|
<td class='bg-green'>90.27%</td>
|
||||||
|
<td class='bg-green'>91.51%</td>
|
||||||
|
<td class='bg-green'>92.41%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>净利润率</td>
|
||||||
|
<td class='bg-green'>49.37%</td>
|
||||||
|
<td class='bg-green'>49.52%</td>
|
||||||
|
<td class='bg-green'>49.64%</td>
|
||||||
|
<td class='bg-green'>49.17%</td>
|
||||||
|
<td class='bg-green'>47.92%</td>
|
||||||
|
<td class='bg-green'>47.65%</td>
|
||||||
|
<td class='bg-green'>46.38%</td>
|
||||||
|
<td class='bg-green'>45.60%</td>
|
||||||
|
<td class='bg-green'>44.35%</td>
|
||||||
|
<td class='bg-green'>41.63%</td>
|
||||||
|
<td class='bg-green'>46.35%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>收入</td>
|
||||||
|
<td class=''>1,309.04</td>
|
||||||
|
<td class=''>1,741.44</td>
|
||||||
|
<td class=''>1,505.60</td>
|
||||||
|
<td class=''>1,275.54</td>
|
||||||
|
<td class=''>1,094.64</td>
|
||||||
|
<td class=''>979.93</td>
|
||||||
|
<td class=''>888.54</td>
|
||||||
|
<td class=''>771.99</td>
|
||||||
|
<td class=''>610.63</td>
|
||||||
|
<td class=''>401.55</td>
|
||||||
|
<td class=''>334.47</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>收入增速</td>
|
||||||
|
<td class='text-blue-i'>6.32%</td>
|
||||||
|
<td class='bg-green italic'>15.66%</td>
|
||||||
|
<td class='bg-green italic'>18.04%</td>
|
||||||
|
<td class='bg-green italic'>16.53%</td>
|
||||||
|
<td class='text-blue-i'>11.71%</td>
|
||||||
|
<td class='text-blue-i'>10.29%</td>
|
||||||
|
<td class='bg-green italic'>15.10%</td>
|
||||||
|
<td class='bg-green italic'>26.43%</td>
|
||||||
|
<td class='bg-green italic'>52.07%</td>
|
||||||
|
<td class='bg-green italic'>20.06%</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>净利润</td>
|
||||||
|
<td class=''>646.27</td>
|
||||||
|
<td class=''>862.28</td>
|
||||||
|
<td class=''>747.34</td>
|
||||||
|
<td class=''>627.16</td>
|
||||||
|
<td class=''>524.60</td>
|
||||||
|
<td class=''>466.97</td>
|
||||||
|
<td class=''>412.06</td>
|
||||||
|
<td class=''>352.04</td>
|
||||||
|
<td class=''>270.79</td>
|
||||||
|
<td class=''>167.18</td>
|
||||||
|
<td class=''>155.03</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>净利润增速</td>
|
||||||
|
<td class='text-blue-i'>6.25%</td>
|
||||||
|
<td class='bg-green italic'>15.38%</td>
|
||||||
|
<td class='bg-green italic'>19.16%</td>
|
||||||
|
<td class='bg-green italic'>19.55%</td>
|
||||||
|
<td class='text-blue-i'>12.34%</td>
|
||||||
|
<td class='text-blue-i'>13.33%</td>
|
||||||
|
<td class='bg-green italic'>17.05%</td>
|
||||||
|
<td class='bg-green italic'>30.00%</td>
|
||||||
|
<td class='bg-green italic'>61.97%</td>
|
||||||
|
<td class='text-blue-i'>7.84%</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>经营净现金流</td>
|
||||||
|
<td class=''>381.97</td>
|
||||||
|
<td class=''>924.64</td>
|
||||||
|
<td class=''>665.93</td>
|
||||||
|
<td class=''>366.99</td>
|
||||||
|
<td class=''>640.29</td>
|
||||||
|
<td class=''>516.69</td>
|
||||||
|
<td class=''>452.11</td>
|
||||||
|
<td class=''>413.85</td>
|
||||||
|
<td class=''>221.53</td>
|
||||||
|
<td class=''>374.51</td>
|
||||||
|
<td class=''>174.36</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>资本开支</td>
|
||||||
|
<td class=''>22.83</td>
|
||||||
|
<td class=''>46.79</td>
|
||||||
|
<td class=''>26.20</td>
|
||||||
|
<td class=''>53.07</td>
|
||||||
|
<td class=''>34.09</td>
|
||||||
|
<td class=''>20.90</td>
|
||||||
|
<td class=''>31.49</td>
|
||||||
|
<td class=''>16.07</td>
|
||||||
|
<td class=''>11.25</td>
|
||||||
|
<td class=''>10.19</td>
|
||||||
|
<td class=''>20.61</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>自由现金流</td>
|
||||||
|
<td class=''>359.14</td>
|
||||||
|
<td class='bg-green'>877.85</td>
|
||||||
|
<td class=''>639.73</td>
|
||||||
|
<td class=''>313.92</td>
|
||||||
|
<td class='bg-green'>606.20</td>
|
||||||
|
<td class='bg-green'>495.79</td>
|
||||||
|
<td class='bg-green'>420.62</td>
|
||||||
|
<td class='bg-green'>397.78</td>
|
||||||
|
<td class=''>210.28</td>
|
||||||
|
<td class='bg-green'>364.32</td>
|
||||||
|
<td class=''>153.75</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>分红</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>总资产</td>
|
||||||
|
<td class=''>3,047.38</td>
|
||||||
|
<td class=''>2,989.45</td>
|
||||||
|
<td class=''>2,727.00</td>
|
||||||
|
<td class=''>2,543.65</td>
|
||||||
|
<td class=''>2,551.68</td>
|
||||||
|
<td class=''>2,133.96</td>
|
||||||
|
<td class=''>1,830.42</td>
|
||||||
|
<td class=''>1,598.47</td>
|
||||||
|
<td class=''>1,346.10</td>
|
||||||
|
<td class=''>1,129.35</td>
|
||||||
|
<td class=''>863.01</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>净资产</td>
|
||||||
|
<td class=''>2,570.70</td>
|
||||||
|
<td class=''>2,331.06</td>
|
||||||
|
<td class=''>2,156.69</td>
|
||||||
|
<td class=''>1,975.07</td>
|
||||||
|
<td class=''>1,895.39</td>
|
||||||
|
<td class=''>1,613.23</td>
|
||||||
|
<td class=''>1,360.10</td>
|
||||||
|
<td class=''>1,128.39</td>
|
||||||
|
<td class=''>914.52</td>
|
||||||
|
<td class=''>728.94</td>
|
||||||
|
<td class=''>639.26</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>商誉</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr><td colspan='12' class='group-header'>费用指标</td></tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>销售费用率</td>
|
||||||
|
<td class=''>3.42%</td>
|
||||||
|
<td class=''>3.24%</td>
|
||||||
|
<td class=''>3.09%</td>
|
||||||
|
<td class=''>2.59%</td>
|
||||||
|
<td class=''>2.50%</td>
|
||||||
|
<td class=''>2.60%</td>
|
||||||
|
<td class=''>3.69%</td>
|
||||||
|
<td class=''>3.33%</td>
|
||||||
|
<td class=''>4.89%</td>
|
||||||
|
<td class=''>4.19%</td>
|
||||||
|
<td class=''>4.44%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>管理费用率</td>
|
||||||
|
<td class=''>4.20%</td>
|
||||||
|
<td class=''>5.35%</td>
|
||||||
|
<td class=''>6.46%</td>
|
||||||
|
<td class=''>7.07%</td>
|
||||||
|
<td class=''>7.72%</td>
|
||||||
|
<td class=''>6.93%</td>
|
||||||
|
<td class=''>6.94%</td>
|
||||||
|
<td class=''>6.90%</td>
|
||||||
|
<td class=''>7.73%</td>
|
||||||
|
<td class=''>10.43%</td>
|
||||||
|
<td class=''>11.40%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>研发费用率</td>
|
||||||
|
<td class=''>0.09%</td>
|
||||||
|
<td class=''>0.13%</td>
|
||||||
|
<td class=''>0.10%</td>
|
||||||
|
<td class=''>0.11%</td>
|
||||||
|
<td class=''>0.06%</td>
|
||||||
|
<td class=''>0.05%</td>
|
||||||
|
<td class=''>0.05%</td>
|
||||||
|
<td class=''>0.03%</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>其他费用率</td>
|
||||||
|
<td class=''>34.37%</td>
|
||||||
|
<td class=''>33.85%</td>
|
||||||
|
<td class=''>32.83%</td>
|
||||||
|
<td class=''>33.16%</td>
|
||||||
|
<td class=''>33.59%</td>
|
||||||
|
<td class=''>34.45%</td>
|
||||||
|
<td class=''>34.58%</td>
|
||||||
|
<td class=''>35.69%</td>
|
||||||
|
<td class=''>33.30%</td>
|
||||||
|
<td class=''>35.26%</td>
|
||||||
|
<td class=''>30.22%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>折旧费用占比</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td class=''>0.99%</td>
|
||||||
|
<td class=''>1.10%</td>
|
||||||
|
<td class=''>1.13%</td>
|
||||||
|
<td class=''>1.23%</td>
|
||||||
|
<td class=''>1.22%</td>
|
||||||
|
<td class=''>1.29%</td>
|
||||||
|
<td class=''>1.41%</td>
|
||||||
|
<td class=''>1.70%</td>
|
||||||
|
<td class=''>2.10%</td>
|
||||||
|
<td class=''>2.28%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>所得税率</td>
|
||||||
|
<td class=''>25.17%</td>
|
||||||
|
<td class=''>25.33%</td>
|
||||||
|
<td class=''>25.22%</td>
|
||||||
|
<td class=''>25.46%</td>
|
||||||
|
<td class=''>25.24%</td>
|
||||||
|
<td class=''>25.19%</td>
|
||||||
|
<td class=''>25.20%</td>
|
||||||
|
<td class=''>25.57%</td>
|
||||||
|
<td class=''>25.13%</td>
|
||||||
|
<td class=''>25.16%</td>
|
||||||
|
<td class=''>25.21%</td>
|
||||||
|
</tr>
|
||||||
|
<tr><td colspan='12' class='group-header'>资产占比</td></tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>现金占比</td>
|
||||||
|
<td class=''>16.98%</td>
|
||||||
|
<td class=''>19.84%</td>
|
||||||
|
<td class=''>25.33%</td>
|
||||||
|
<td class=''>22.91%</td>
|
||||||
|
<td class=''>20.30%</td>
|
||||||
|
<td class=''>16.91%</td>
|
||||||
|
<td class=''>7.24%</td>
|
||||||
|
<td class='bg-red'>70.11%</td>
|
||||||
|
<td class='bg-red'>65.28%</td>
|
||||||
|
<td class='bg-red'>59.20%</td>
|
||||||
|
<td class='bg-red'>42.64%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>库存占比</td>
|
||||||
|
<td class=''>18.33%</td>
|
||||||
|
<td class=''>18.18%</td>
|
||||||
|
<td class=''>17.03%</td>
|
||||||
|
<td class=''>15.26%</td>
|
||||||
|
<td class=''>13.09%</td>
|
||||||
|
<td class=''>13.53%</td>
|
||||||
|
<td class=''>13.81%</td>
|
||||||
|
<td class=''>14.71%</td>
|
||||||
|
<td class=''>16.39%</td>
|
||||||
|
<td class=''>18.26%</td>
|
||||||
|
<td class=''>20.87%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>应收款占比</td>
|
||||||
|
<td class=''>0.01%</td>
|
||||||
|
<td class=''>0.01%</td>
|
||||||
|
<td class=''>0.02%</td>
|
||||||
|
<td class=''>0.01%</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>预付款占比</td>
|
||||||
|
<td class=''>0.01%</td>
|
||||||
|
<td class=''>0.01%</td>
|
||||||
|
<td class=''>0.01%</td>
|
||||||
|
<td class=''>0.35%</td>
|
||||||
|
<td class=''>0.15%</td>
|
||||||
|
<td class=''>0.42%</td>
|
||||||
|
<td class=''>0.85%</td>
|
||||||
|
<td class=''>0.74%</td>
|
||||||
|
<td class=''>0.59%</td>
|
||||||
|
<td class=''>0.93%</td>
|
||||||
|
<td class=''>1.71%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>固定资产占比</td>
|
||||||
|
<td class=''>6.95%</td>
|
||||||
|
<td class=''>7.32%</td>
|
||||||
|
<td class=''>7.30%</td>
|
||||||
|
<td class=''>7.76%</td>
|
||||||
|
<td class=''>6.85%</td>
|
||||||
|
<td class=''>7.60%</td>
|
||||||
|
<td class=''>8.27%</td>
|
||||||
|
<td class=''>9.54%</td>
|
||||||
|
<td class=''>11.32%</td>
|
||||||
|
<td class=''>12.80%</td>
|
||||||
|
<td class=''>13.23%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>长期投资占比</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>商誉占比</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>其他资产占比</td>
|
||||||
|
<td class='bg-khaki'>57.72%</td>
|
||||||
|
<td class='bg-khaki'>54.65%</td>
|
||||||
|
<td class='bg-khaki'>50.31%</td>
|
||||||
|
<td class='bg-khaki'>53.70%</td>
|
||||||
|
<td class='bg-khaki'>59.61%</td>
|
||||||
|
<td class='bg-khaki'>61.53%</td>
|
||||||
|
<td class='bg-khaki'>69.83%</td>
|
||||||
|
<td class='bg-khaki'>4.90%</td>
|
||||||
|
<td class='bg-khaki'>6.43%</td>
|
||||||
|
<td class='bg-khaki'>8.82%</td>
|
||||||
|
<td class='bg-khaki'>21.54%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>应付款占比</td>
|
||||||
|
<td class=''>0.93%</td>
|
||||||
|
<td class=''>1.18%</td>
|
||||||
|
<td class=''>1.13%</td>
|
||||||
|
<td class=''>0.95%</td>
|
||||||
|
<td class=''>0.79%</td>
|
||||||
|
<td class=''>0.63%</td>
|
||||||
|
<td class=''>0.83%</td>
|
||||||
|
<td class=''>0.74%</td>
|
||||||
|
<td class=''>0.74%</td>
|
||||||
|
<td class=''>0.92%</td>
|
||||||
|
<td class=''>1.02%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>预收款占比</td>
|
||||||
|
<td class=''>2.54%</td>
|
||||||
|
<td class=''>3.21%</td>
|
||||||
|
<td class=''>5.18%</td>
|
||||||
|
<td class=''>6.08%</td>
|
||||||
|
<td class=''>4.98%</td>
|
||||||
|
<td class=''>6.24%</td>
|
||||||
|
<td class=''>7.51%</td>
|
||||||
|
<td class=''>8.49%</td>
|
||||||
|
<td class=''>10.72%</td>
|
||||||
|
<td class=''>15.53%</td>
|
||||||
|
<td class=''>9.57%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>短期借款占比</td>
|
||||||
|
<td class=''>0.02%</td>
|
||||||
|
<td class=''>0.04%</td>
|
||||||
|
<td class=''>0.02%</td>
|
||||||
|
<td class=''>0.04%</td>
|
||||||
|
<td class=''>0.04%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>长期借款占比</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>运营资产占比</td>
|
||||||
|
<td class=''>14.88%</td>
|
||||||
|
<td class=''>13.81%</td>
|
||||||
|
<td class=''>10.75%</td>
|
||||||
|
<td class=''>8.59%</td>
|
||||||
|
<td class=''>7.47%</td>
|
||||||
|
<td class=''>7.08%</td>
|
||||||
|
<td class=''>6.33%</td>
|
||||||
|
<td class=''>6.22%</td>
|
||||||
|
<td class=''>5.52%</td>
|
||||||
|
<td class=''>2.73%</td>
|
||||||
|
<td class=''>11.99%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>有息负债率</td>
|
||||||
|
<td class=''>0.02%</td>
|
||||||
|
<td class=''>0.04%</td>
|
||||||
|
<td class=''>0.02%</td>
|
||||||
|
<td class=''>0.04%</td>
|
||||||
|
<td class=''>0.04%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
<td class=''>0.00%</td>
|
||||||
|
</tr>
|
||||||
|
<tr><td colspan='12' class='group-header'>周转能力</td></tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>存货周转天数</td>
|
||||||
|
<td class=''>1,823</td>
|
||||||
|
<td class=''>1,438</td>
|
||||||
|
<td class=''>1,428</td>
|
||||||
|
<td class=''>1,403</td>
|
||||||
|
<td class=''>1,356</td>
|
||||||
|
<td class=''>1,292</td>
|
||||||
|
<td class=''>1,242</td>
|
||||||
|
<td class=''>1,315</td>
|
||||||
|
<td class=''>1,355</td>
|
||||||
|
<td class=''>2,207</td>
|
||||||
|
<td class=''>2,590</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>应收款周转天数</td>
|
||||||
|
<td class=''>0</td>
|
||||||
|
<td class=''>0</td>
|
||||||
|
<td class=''>0</td>
|
||||||
|
<td class=''>0</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td class=''>0</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>应付款周转天数</td>
|
||||||
|
<td class=''>92</td>
|
||||||
|
<td class=''>93</td>
|
||||||
|
<td class=''>95</td>
|
||||||
|
<td class=''>87</td>
|
||||||
|
<td class=''>81</td>
|
||||||
|
<td class=''>60</td>
|
||||||
|
<td class=''>74</td>
|
||||||
|
<td class=''>65</td>
|
||||||
|
<td class=''>60</td>
|
||||||
|
<td class=''>111</td>
|
||||||
|
<td class=''>126</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>固定资产周转率</td>
|
||||||
|
<td class=''>6.18</td>
|
||||||
|
<td class=''>7.96</td>
|
||||||
|
<td class=''>7.56</td>
|
||||||
|
<td class=''>6.46</td>
|
||||||
|
<td class=''>6.27</td>
|
||||||
|
<td class=''>6.04</td>
|
||||||
|
<td class=''>5.87</td>
|
||||||
|
<td class=''>5.06</td>
|
||||||
|
<td class=''>4.01</td>
|
||||||
|
<td class=''>2.78</td>
|
||||||
|
<td class=''>2.93</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>总资产周转率</td>
|
||||||
|
<td class=''>0.43</td>
|
||||||
|
<td class=''>0.58</td>
|
||||||
|
<td class=''>0.55</td>
|
||||||
|
<td class=''>0.50</td>
|
||||||
|
<td class=''>0.43</td>
|
||||||
|
<td class=''>0.46</td>
|
||||||
|
<td class=''>0.49</td>
|
||||||
|
<td class=''>0.48</td>
|
||||||
|
<td class=''>0.45</td>
|
||||||
|
<td class=''>0.36</td>
|
||||||
|
<td class=''>0.39</td>
|
||||||
|
</tr>
|
||||||
|
<tr><td colspan='12' class='group-header'>人均效率</td></tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>员工人数</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td class=''>34,750</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>人均创收(万)</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td class=''>501.13</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>人均创利(万)</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td class=''>248.14</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>人均薪酬(万)</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td class=''>44.18</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
<td>-</td>
|
||||||
|
</tr>
|
||||||
|
<tr><td colspan='12' class='group-header'>市场表现</td></tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>股价</td>
|
||||||
|
<td class=''>1443.99</td>
|
||||||
|
<td class=''>1524.00</td>
|
||||||
|
<td class=''>1726.00</td>
|
||||||
|
<td class=''>1727.00</td>
|
||||||
|
<td class=''>2050.00</td>
|
||||||
|
<td class=''>1998.00</td>
|
||||||
|
<td class=''>1183.00</td>
|
||||||
|
<td class=''>590.01</td>
|
||||||
|
<td class=''>697.49</td>
|
||||||
|
<td class=''>334.15</td>
|
||||||
|
<td class=''>218.19</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>市值(亿)</td>
|
||||||
|
<td class=''>18,083</td>
|
||||||
|
<td class=''>19,144</td>
|
||||||
|
<td class=''>21,682</td>
|
||||||
|
<td class=''>21,695</td>
|
||||||
|
<td class=''>25,752</td>
|
||||||
|
<td class=''>25,099</td>
|
||||||
|
<td class=''>14,861</td>
|
||||||
|
<td class=''>7,412</td>
|
||||||
|
<td class=''>8,762</td>
|
||||||
|
<td class=''>4,198</td>
|
||||||
|
<td class=''>2,741</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>PE</td>
|
||||||
|
<td class=''>20.97</td>
|
||||||
|
<td class=''>25.62</td>
|
||||||
|
<td class=''>34.57</td>
|
||||||
|
<td class=''>41.35</td>
|
||||||
|
<td class=''>55.15</td>
|
||||||
|
<td class=''>60.91</td>
|
||||||
|
<td class=''>42.21</td>
|
||||||
|
<td class=''>27.37</td>
|
||||||
|
<td class=''>52.41</td>
|
||||||
|
<td class=''>27.08</td>
|
||||||
|
<td class=''>17.86</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>PB</td>
|
||||||
|
<td class=''>7.77</td>
|
||||||
|
<td class=''>9.22</td>
|
||||||
|
<td class=''>11.19</td>
|
||||||
|
<td class=''>12.11</td>
|
||||||
|
<td class=''>14.77</td>
|
||||||
|
<td class=''>16.91</td>
|
||||||
|
<td class=''>11.86</td>
|
||||||
|
<td class=''>7.24</td>
|
||||||
|
<td class=''>10.39</td>
|
||||||
|
<td class=''>6.12</td>
|
||||||
|
<td class=''>4.58</td>
|
||||||
|
</tr>
|
||||||
|
<tr class='hover-row'>
|
||||||
|
<td class='row-header'>股东户数</td>
|
||||||
|
<td class=''>220,658</td>
|
||||||
|
<td class=''>201,582</td>
|
||||||
|
<td class=''>150,025</td>
|
||||||
|
<td class=''>145,225</td>
|
||||||
|
<td class=''>175,267</td>
|
||||||
|
<td class=''>114,267</td>
|
||||||
|
<td class=''>89,062</td>
|
||||||
|
<td class=''>88,932</td>
|
||||||
|
<td class=''>63,980</td>
|
||||||
|
<td class=''>53,437</td>
|
||||||
|
<td class=''>46,869</td>
|
||||||
|
</tr>
|
||||||
|
</tbody></table></div></body></html>
|
||||||
87
data/CN/600519.SH/report.md
Normal file
87
data/CN/600519.SH/report.md
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
# 贵州茅台 (600519.SH) - Financial Report
|
||||||
|
*Report generated on: 2025-12-14*
|
||||||
|
|
||||||
|
| 代码 | 简称 | 上市日期 | PE | PB | 股息率(%) |
|
||||||
|
|:---|:---|:---|:---|:---|:---|
|
||||||
|
| 600519.SH | 贵州茅台 | 2001-08-27 | 20.63 | 6.92 | 3.64% |
|
||||||
|
|
||||||
|
|
||||||
|
## 主要指标
|
||||||
|
| 指标 | 2025 Q3 | 2024 | 2023 | 2022 | 2021 | 2020 | 2019 | 2018 | 2017 | 2016 | 2015 |
|
||||||
|
|:---|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|
|
||||||
|
| ROE | 25.14% | 36.99% | 34.65% | 31.75% | 27.68% | 28.95% | 30.30% | 31.20% | 29.61% | 22.94% | 24.25% |
|
||||||
|
| ROA | 21.21% | 28.84% | 27.41% | 24.66% | 20.56% | 21.88% | 22.51% | 22.02% | 20.12% | 14.80% | 17.96% |
|
||||||
|
| ROCE/ROIC | 34.56% | 50.68% | 47.24% | 43.76% | 38.92% | 41.16% | 43.43% | 45.50% | 42.51% | 33.26% | 34.55% |
|
||||||
|
| 毛利率 | 91.46% | 92.08% | 92.12% | 92.09% | 91.79% | 91.68% | 91.64% | 91.55% | 90.27% | 91.51% | 92.41% |
|
||||||
|
| 净利润率 | 49.37% | 49.52% | 49.64% | 49.17% | 47.92% | 47.65% | 46.38% | 45.60% | 44.35% | 41.63% | 46.35% |
|
||||||
|
| 收入(亿) | 1,309.04 | 1,741.44 | 1,505.60 | 1,275.54 | 1,094.64 | 979.93 | 888.54 | 771.99 | 610.63 | 401.55 | 334.47 |
|
||||||
|
| 收入增速 | 6.32% | 15.66% | 18.04% | 16.53% | 11.71% | 10.29% | 15.10% | 26.43% | 52.07% | 20.06% | - |
|
||||||
|
| 净利润(亿) | 646.27 | 862.28 | 747.34 | 627.16 | 524.60 | 466.97 | 412.06 | 352.04 | 270.79 | 167.18 | 155.03 |
|
||||||
|
| 净利润增速 | 6.25% | 15.38% | 19.16% | 19.55% | 12.34% | 13.33% | 17.05% | 30.00% | 61.97% | 7.84% | - |
|
||||||
|
| 经营净现金流(亿) | 381.97 | 924.64 | 665.93 | 366.99 | 640.29 | 516.69 | 452.11 | 413.85 | 221.53 | 374.51 | 174.36 |
|
||||||
|
| 资本开支(亿) | 22.83 | 46.79 | 26.20 | 53.07 | 34.09 | 20.90 | 31.49 | 16.07 | 11.25 | 10.19 | 20.61 |
|
||||||
|
| 自由现金流(亿) | 359.14 | 877.85 | 639.73 | 313.92 | 606.20 | 495.79 | 420.62 | 397.78 | 210.28 | 364.32 | 153.75 |
|
||||||
|
| 分红(亿) | - | - | - | - | - | - | - | - | - | - | - |
|
||||||
|
| 总资产(亿) | 3,047.38 | 2,989.45 | 2,727.00 | 2,543.65 | 2,551.68 | 2,133.96 | 1,830.42 | 1,598.47 | 1,346.10 | 1,129.35 | 863.01 |
|
||||||
|
| 净资产(亿) | 2,570.70 | 2,331.06 | 2,156.69 | 1,975.07 | 1,895.39 | 1,613.23 | 1,360.10 | 1,128.39 | 914.52 | 728.94 | 639.26 |
|
||||||
|
| 商誉(亿) | - | - | - | - | - | - | - | - | - | - | - |
|
||||||
|
|
||||||
|
|
||||||
|
## 费用指标
|
||||||
|
| 指标 | 2025 Q3 | 2024 | 2023 | 2022 | 2021 | 2020 | 2019 | 2018 | 2017 | 2016 | 2015 |
|
||||||
|
|:---|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|
|
||||||
|
| 销售费用率 | 3.42% | 3.24% | 3.09% | 2.59% | 2.50% | 2.60% | 3.69% | 3.33% | 4.89% | 4.19% | 4.44% |
|
||||||
|
| 管理费用率 | 4.20% | 5.35% | 6.46% | 7.07% | 7.72% | 6.93% | 6.94% | 6.90% | 7.73% | 10.43% | 11.40% |
|
||||||
|
| 研发费用率 | 0.09% | 0.13% | 0.10% | 0.11% | 0.06% | 0.05% | 0.05% | 0.03% | - | - | - |
|
||||||
|
| 其他费用率 | 34.37% | 33.85% | 32.83% | 33.16% | 33.59% | 34.45% | 34.58% | 35.69% | 33.30% | 35.26% | 30.22% |
|
||||||
|
| 折旧费用占比 | - | 0.99% | 1.10% | 1.13% | 1.23% | 1.22% | 1.29% | 1.41% | 1.70% | 2.10% | 2.28% |
|
||||||
|
| 所得税率 | 25.17% | 25.33% | 25.22% | 25.46% | 25.24% | 25.19% | 25.20% | 25.57% | 25.13% | 25.16% | 25.21% |
|
||||||
|
|
||||||
|
|
||||||
|
## 资产占比
|
||||||
|
| 指标 | 2025 Q3 | 2024 | 2023 | 2022 | 2021 | 2020 | 2019 | 2018 | 2017 | 2016 | 2015 |
|
||||||
|
|:---|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|
|
||||||
|
| 现金占比 | 16.98% | 19.84% | 25.33% | 22.91% | 20.30% | 16.91% | 7.24% | 70.11% | 65.28% | 59.20% | 42.64% |
|
||||||
|
| 库存占比 | 18.33% | 18.18% | 17.03% | 15.26% | 13.09% | 13.53% | 13.81% | 14.71% | 16.39% | 18.26% | 20.87% |
|
||||||
|
| 应收款占比 | 0.01% | 0.01% | 0.02% | 0.01% | - | - | - | - | - | - | 0.00% |
|
||||||
|
| 预付款占比 | 0.01% | 0.01% | 0.01% | 0.35% | 0.15% | 0.42% | 0.85% | 0.74% | 0.59% | 0.93% | 1.71% |
|
||||||
|
| 固定资产占比 | 6.95% | 7.32% | 7.30% | 7.76% | 6.85% | 7.60% | 8.27% | 9.54% | 11.32% | 12.80% | 13.23% |
|
||||||
|
| 长期投资占比 | - | - | - | - | - | - | - | - | - | - | - |
|
||||||
|
| 商誉占比 | - | - | - | - | - | - | - | - | - | - | - |
|
||||||
|
| 其他资产占比 | 57.72% | 54.65% | 50.31% | 53.70% | 59.61% | 61.53% | 69.83% | 4.90% | 6.43% | 8.82% | 21.54% |
|
||||||
|
| 应付款占比 | 0.93% | 1.18% | 1.13% | 0.95% | 0.79% | 0.63% | 0.83% | 0.74% | 0.74% | 0.92% | 1.02% |
|
||||||
|
| 预收款占比 | 2.54% | 3.21% | 5.18% | 6.08% | 4.98% | 6.24% | 7.51% | 8.49% | 10.72% | 15.53% | 9.57% |
|
||||||
|
| 短期借款占比 | 0.02% | 0.04% | 0.02% | 0.04% | 0.04% | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% |
|
||||||
|
| 长期借款占比 | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% |
|
||||||
|
| 运营资产占比 | 14.88% | 13.81% | 10.75% | 8.59% | 7.47% | 7.08% | 6.33% | 6.22% | 5.52% | 2.73% | 11.99% |
|
||||||
|
| 有息负债率 | 0.02% | 0.04% | 0.02% | 0.04% | 0.04% | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% |
|
||||||
|
|
||||||
|
|
||||||
|
## 周转能力
|
||||||
|
| 指标 | 2025 Q3 | 2024 | 2023 | 2022 | 2021 | 2020 | 2019 | 2018 | 2017 | 2016 | 2015 |
|
||||||
|
|:---|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|
|
||||||
|
| 存货周转天数 | 1,823 | 1,438 | 1,428 | 1,403 | 1,356 | 1,292 | 1,242 | 1,315 | 1,355 | 2,207 | 2,590 |
|
||||||
|
| 应收款周转天数 | 0 | 0 | 0 | 0 | - | - | - | - | - | - | 0 |
|
||||||
|
| 应付款周转天数 | 92 | 93 | 95 | 87 | 81 | 60 | 74 | 65 | 60 | 111 | 126 |
|
||||||
|
| 固定资产周转率 | 6.18 | 7.96 | 7.56 | 6.46 | 6.27 | 6.04 | 5.87 | 5.06 | 4.01 | 2.78 | 2.93 |
|
||||||
|
| 总资产周转率 | 0.43 | 0.58 | 0.55 | 0.50 | 0.43 | 0.46 | 0.49 | 0.48 | 0.45 | 0.36 | 0.39 |
|
||||||
|
|
||||||
|
|
||||||
|
## 人均效率
|
||||||
|
| 指标 | 2025 Q3 | 2024 | 2023 | 2022 | 2021 | 2020 | 2019 | 2018 | 2017 | 2016 | 2015 |
|
||||||
|
|:---|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|
|
||||||
|
| 员工人数 | - | 34,750 | - | - | - | - | - | - | - | - | - |
|
||||||
|
| 人均创收(万) | - | 501.13 | - | - | - | - | - | - | - | - | - |
|
||||||
|
| 人均创利(万) | - | 248.14 | - | - | - | - | - | - | - | - | - |
|
||||||
|
| 人均薪酬(万) | - | 44.18 | - | - | - | - | - | - | - | - | - |
|
||||||
|
|
||||||
|
|
||||||
|
## 市场表现
|
||||||
|
| 指标 | 2025 Q3 | 2024 | 2023 | 2022 | 2021 | 2020 | 2019 | 2018 | 2017 | 2016 | 2015 |
|
||||||
|
|:---|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|
|
||||||
|
| 股价 | 1443.99 | 1524.00 | 1726.00 | 1727.00 | 2050.00 | 1998.00 | 1183.00 | 590.01 | 697.49 | 334.15 | 218.19 |
|
||||||
|
| 市值(亿) | 18,083 | 19,144 | 21,682 | 21,695 | 25,752 | 25,099 | 14,861 | 7,412 | 8,762 | 4,198 | 2,741 |
|
||||||
|
| PE | 20.97 | 25.62 | 34.57 | 41.35 | 55.15 | 60.91 | 42.21 | 27.37 | 52.41 | 27.08 | 17.86 |
|
||||||
|
| PB | 7.77 | 9.22 | 11.19 | 12.11 | 14.77 | 16.91 | 11.86 | 7.24 | 10.39 | 6.12 | 4.58 |
|
||||||
|
| 股东户数 | 220,658 | 201,582 | 150,025 | 145,225 | 175,267 | 114,267 | 89,062 | 88,932 | 63,980 | 53,437 | 46,869 |
|
||||||
|
|
||||||
11
data/US/AAPL/balance_sheet.csv
Normal file
11
data/US/AAPL/balance_sheet.csv
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
date,reportedCurrency,totalAssets,current_assets,cashAndCashEquivalentsAtCarryingValue,cashAndShortTermInvestments,inventory,currentNetReceivables,totalNonCurrentAssets,propertyPlantEquipment,accumulatedDepreciationAmortizationPPE,intangibleAssets,intangibleAssetsExcludingGoodwill,goodwill,investments,longTermInvestments,shortTermInvestments,otherCurrentAssets,otherNonCurrentAssets,total_liabilities,current_liabilities,currentAccountsPayable,deferredRevenue,currentDebt,shortTermDebt,totalNonCurrentLiabilities,capitalLeaseObligations,longTermDebt,currentLongTermDebt,longTermDebtNoncurrent,shortLongTermDebtTotal,otherCurrentLiabilities,otherNonCurrentLiabilities,total_equity,treasuryStock,retainedEarnings,commonStock,commonStockSharesOutstanding
|
||||||
|
2025-09-30,USD,359241000000,147957000000,35934000000,35934000000,5718000000,72957000000,211284000000,61039000000,None,None,None,None,None,77723000000,18763000000,14585000000,None,285508000000,165631000000,69860000000,None,None,20329000000,119877000000,None,78328000000,20329000000,None,98657000000,66387000000,41549000000,73733000000,None,-14264000000,93568000000,15004697000
|
||||||
|
2024-09-30,USD,364980000000,152987000000,29943000000,29943000000,7286000000,66243000000,211993000000,55914000000,None,None,None,None,None,91479000000,35228000000,14287000000,None,308030000000,176392000000,68960000000,None,None,22511000000,131638000000,None,85750000000,20879000000,None,119059000000,50071000000,36634000000,56950000000,None,-19154000000,83276000000,15408095000
|
||||||
|
2023-09-30,USD,352583000000,143566000000,29965000000,29965000000,6331000000,29508000000,209017000000,43715000000,None,None,None,None,None,100544000000,31590000000,14695000000,None,290437000000,145308000000,62611000000,None,None,15807000000,145129000000,12842000000,95281000000,15807000000,None,111947000000,58829000000,49848000000,62146000000,None,-214000000,73812000000,15812547000
|
||||||
|
2022-09-30,USD,352755000000,135405000000,23646000000,23646000000,4946000000,28184000000,217350000000,42117000000,72340000000,None,None,None,None,120805000000,24658000000,21223000000,None,302083000000,153982000000,64115000000,None,None,21110000000,148101000000,12411000000,98959000000,21110000000,None,120881000000,60845000000,49142000000,50672000000,None,-3068000000,64849000000,16325819000
|
||||||
|
2021-09-30,USD,351002000000,134836000000,34940000000,34940000000,6580000000,26278000000,216166000000,39440000000,70283000000,None,None,None,None,127877000000,27699000000,14111000000,None,287912000000,125481000000,54763000000,None,None,15613000000,162431000000,11803000000,109106000000,15613000000,None,124719000000,47493000000,28636000000,63090000000,None,5562000000,57365000000,16864919000
|
||||||
|
2020-09-30,USD,323888000000,143713000000,38016000000,38016000000,4061000000,16120000000,180175000000,36766000000,66760000000,None,None,None,None,100887000000,52927000000,11264000000,None,258549000000,105392000000,42296000000,None,None,13769000000,153157000000,9842000000,98667000000,13769000000,None,112436000000,42684000000,26320000000,65339000000,None,14966000000,50779000000,17528214000
|
||||||
|
2019-09-30,USD,338516000000,162819000000,48844000000,48844000000,4106000000,22926000000,175697000000,37378000000,58579000000,None,None,None,None,105341000000,51713000000,12352000000,None,248028000000,105718000000,46236000000,None,None,16240000000,142310000000,None,91807000000,16240000000,None,108047000000,37720000000,20958000000,90488000000,None,45898000000,45174000000,18595652000
|
||||||
|
2018-09-30,USD,365725000000,131339000000,25913000000,25913000000,3956000000,23186000000,234386000000,41304000000,49099000000,None,None,None,None,170799000000,40388000000,12087000000,None,258578000000,116866000000,55888000000,None,None,20748000000,141712000000,None,93735000000,20748000000,None,114483000000,32687000000,11165000000,107147000000,None,70400000000,40201000000,20000436000
|
||||||
|
2017-09-30,USD,375319000000,128645000000,20289000000,20289000000,4855000000,2093000000,246674000000,33783000000,41293000000,2298000000,2298000000,5717000000,None,194714000000,53892000000,13936000000,None,241272000000,100814000000,49049000000,None,None,18473000000,140458000000,None,97207000000,18473000000,None,115680000000,25744000000,40415000000,134047000000,0,98330000000,35867000000,21006768000
|
||||||
|
2016-09-30,USD,321686000000,106869000000,20484000000,20484000000,2132000000,527000000,214817000000,27010000000,34235000000,3206000000,3206000000,5414000000,None,170430000000,46671000000,8283000000,None,193437000000,79006000000,37294000000,None,None,11605000000,114431000000,None,75427000000,11605000000,None,87032000000,22027000000,36074000000,128249000000,None,96364000000,31251000000,22001124000
|
||||||
|
11
data/US/AAPL/cash_flow.csv
Normal file
11
data/US/AAPL/cash_flow.csv
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
date,reportedCurrency,net_cash_flow,paymentsForOperatingActivities,proceedsFromOperatingActivities,changeInOperatingLiabilities,changeInOperatingAssets,depreciation,capitalExpenditures,changeInReceivables,changeInInventory,profitLoss,cashflowFromInvestment,cashflowFromFinancing,proceedsFromRepaymentsOfShortTermDebt,paymentsForRepurchaseOfCommonStock,paymentsForRepurchaseOfEquity,paymentsForRepurchaseOfPreferredStock,dividendPayout,dividendPayoutCommonStock,dividendPayoutPreferredStock,proceedsFromIssuanceOfCommonStock,proceedsFromIssuanceOfLongTermDebtAndCapitalSecuritiesNet,proceedsFromIssuanceOfPreferredStock,proceedsFromRepurchaseOfEquity,proceedsFromSaleOfTreasuryStock,changeInCashAndCashEquivalents,changeInExchangeRate,netIncome
|
||||||
|
2025-09-30,USD,111482000000,None,None,None,None,11698000000,12715000000,None,1400000000,None,15195000000,-120686000000,None,None,None,None,15421000000,15421000000,None,None,None,None,-90711000000,None,None,None,112010000000
|
||||||
|
2024-09-30,USD,118254000000,None,None,None,None,11445000000,9447000000,None,-1046000000,None,2935000000,-121983000000,None,None,None,None,15234000000,15234000000,None,None,None,None,-94949000000,None,None,None,93736000000
|
||||||
|
2023-09-30,USD,110543000000,None,None,None,None,11519000000,10959000000,-417000000,-1618000000,None,3705000000,-108488000000,None,None,None,None,15025000000,15025000000,None,None,None,None,-77550000000,None,5760000000,None,96995000000
|
||||||
|
2022-09-30,USD,122151000000,None,None,None,None,11104000000,10708000000,-9343000000,1484000000,None,-22354000000,-110749000000,None,None,None,None,14841000000,14841000000,None,None,None,None,-89402000000,None,-10952000000,None,99803000000
|
||||||
|
2021-09-30,USD,104038000000,None,None,None,None,11284000000,11085000000,-14028000000,-2642000000,None,-14545000000,-93353000000,None,None,None,None,14467000000,14467000000,None,None,None,None,-85971000000,None,-3860000000,None,94680000000
|
||||||
|
2020-09-30,USD,80674000000,None,None,None,None,11056000000,7309000000,8470000000,-127000000,None,-4289000000,-86820000000,None,None,None,None,14081000000,14081000000,None,None,None,None,-72358000000,None,-10435000000,None,57411000000
|
||||||
|
2019-09-30,USD,69391000000,None,None,None,None,12547000000,10495000000,3176000000,-289000000,None,45896000000,-90976000000,None,None,None,None,14119000000,14119000000,None,None,None,None,-66897000000,None,24311000000,None,55256000000
|
||||||
|
2018-09-30,USD,77434000000,None,None,None,None,10903000000,13313000000,-13332000000,828000000,None,16066000000,-87876000000,None,None,None,None,13712000000,13712000000,None,None,None,None,-72738000000,None,5624000000,None,59531000000
|
||||||
|
2017-09-30,USD,63598000000,None,None,None,None,10157000000,12451000000,-6347000000,-2723000000,None,-46446000000,-17347000000,None,None,None,None,12769000000,12769000000,None,None,None,None,-32900000000,None,-195000000,None,48351000000
|
||||||
|
2016-09-30,USD,65824000000,None,None,None,None,10505000000,12734000000,1044000000,217000000,None,-45977000000,-20483000000,None,None,None,None,12150000000,12150000000,None,None,None,None,-29722000000,None,-636000000,None,45687000000
|
||||||
|
11
data/US/AAPL/income_statement.csv
Normal file
11
data/US/AAPL/income_statement.csv
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
date,reportedCurrency,grossProfit,revenue,costOfRevenue,costofGoodsAndServicesSold,operatingIncome,sellingGeneralAndAdministrative,researchAndDevelopment,operatingExpenses,investmentIncomeNet,netInterestIncome,interestIncome,interestExpense,nonInterestIncome,otherNonOperatingIncome,depreciation,depreciationAndAmortization,incomeBeforeTax,incomeTaxExpense,interestAndDebtExpense,netIncomeFromContinuingOperations,comprehensiveIncomeNetOfTax,ebit,ebitda,net_income
|
||||||
|
2025-09-30,USD,195201000000,416161000000,220960000000,220960000000,133050000000,27601000000,34550000000,62151000000,None,None,None,None,None,None,None,11698000000,132729000000,20719000000,None,112010000000,None,132729000000,144427000000,112010000000
|
||||||
|
2024-09-30,USD,180683000000,391035000000,210352000000,210352000000,123216000000,26097000000,31370000000,57467000000,None,0,0,0,None,None,None,11445000000,123485000000,29749000000,None,93736000000,None,123216000000,134661000000,93736000000
|
||||||
|
2023-09-30,USD,169148000000,383285000000,214137000000,214137000000,114301000000,24932000000,29915000000,54847000000,None,-183000000,3750000000,3933000000,None,-382000000,None,11519000000,113736000000,16741000000,None,96995000000,None,114301000000,125820000000,96995000000
|
||||||
|
2022-09-30,USD,170782000000,394328000000,223546000000,223546000000,119437000000,25094000000,26251000000,51573000000,None,-106000000,2825000000,2931000000,None,334000000,None,11104000000,119103000000,19300000000,None,99803000000,None,119437000000,130541000000,99803000000
|
||||||
|
2021-09-30,USD,152836000000,365817000000,212981000000,212981000000,108949000000,21973000000,21914000000,43887000000,None,198000000,2843000000,2645000000,None,258000000,None,11284000000,109207000000,14527000000,None,94680000000,None,111852000000,123136000000,94680000000
|
||||||
|
2020-09-30,USD,104956000000,274515000000,169559000000,169559000000,66288000000,19916000000,18752000000,38668000000,None,890000000,3763000000,2873000000,None,803000000,None,11056000000,67091000000,9680000000,None,57411000000,None,69964000000,81020000000,57411000000
|
||||||
|
2019-09-30,USD,98392000000,260174000000,161782000000,161782000000,63930000000,18245000000,16217000000,34462000000,None,1385000000,4961000000,3576000000,None,1807000000,None,12547000000,65737000000,10481000000,None,55256000000,None,69313000000,81860000000,55256000000
|
||||||
|
2018-09-30,USD,101839000000,265595000000,163756000000,163756000000,70898000000,16705000000,14236000000,30941000000,None,2446000000,5686000000,3240000000,None,2005000000,None,10903000000,72903000000,13372000000,None,59531000000,None,76143000000,87046000000,59531000000
|
||||||
|
2017-09-30,USD,88186000000,229234000000,141048000000,141048000000,61344000000,15261000000,11581000000,26842000000,None,2878000000,5201000000,2323000000,None,2745000000,None,10157000000,64089000000,15738000000,None,48351000000,None,66412000000,76569000000,48351000000
|
||||||
|
2016-09-30,USD,84263000000,215639000000,131376000000,131376000000,60024000000,14194000000,10045000000,24239000000,None,2543000000,3999000000,1456000000,None,1348000000,None,10505000000,61372000000,15685000000,None,45687000000,None,62828000000,73333000000,45687000000
|
||||||
|
4
data/US/AAPL/report.md
Normal file
4
data/US/AAPL/report.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# Financial Analysis Report: US AAPL
|
||||||
|
|
||||||
|
|
||||||
|
<table><thead><tr><th>year</th><th>revenue</th><th>net_income</th><th>ROE</th><th>NetMargin</th><th>DebtToEquity</th><th>CurrentRatio</th></tr></thead><tbody><tr><td style=''>2025</td><td style=''>416,161,000,000</td><td style=''>112,010,000,000</td><td style='background-color: #d1e7dd;'>151.91%</td><td style='background-color: #d1e7dd;'>26.92%</td><td style='background-color: #f8d7da;'>3.87</td><td style='background-color: #f8d7da;'>0.89</td></tr><tr><td style=''>2024</td><td style=''>391,035,000,000</td><td style=''>93,736,000,000</td><td style='background-color: #d1e7dd;'>164.59%</td><td style='background-color: #d1e7dd;'>23.97%</td><td style='background-color: #f8d7da;'>5.41</td><td style='background-color: #f8d7da;'>0.87</td></tr><tr><td style=''>2023</td><td style=''>383,285,000,000</td><td style=''>96,995,000,000</td><td style='background-color: #d1e7dd;'>156.08%</td><td style='background-color: #d1e7dd;'>25.31%</td><td style='background-color: #f8d7da;'>4.67</td><td style='background-color: #f8d7da;'>0.99</td></tr><tr><td style=''>2022</td><td style=''>394,328,000,000</td><td style=''>99,803,000,000</td><td style='background-color: #d1e7dd;'>196.96%</td><td style='background-color: #d1e7dd;'>25.31%</td><td style='background-color: #f8d7da;'>5.96</td><td style='background-color: #f8d7da;'>0.88</td></tr><tr><td style=''>2021</td><td style=''>365,817,000,000</td><td style=''>94,680,000,000</td><td style='background-color: #d1e7dd;'>150.07%</td><td style='background-color: #d1e7dd;'>25.88%</td><td style='background-color: #f8d7da;'>4.56</td><td style=''>1.07</td></tr><tr><td style=''>2020</td><td style=''>274,515,000,000</td><td style=''>57,411,000,000</td><td style='background-color: #d1e7dd;'>87.87%</td><td style='background-color: #d1e7dd;'>20.91%</td><td style='background-color: #f8d7da;'>3.96</td><td style=''>1.36</td></tr><tr><td style=''>2019</td><td style=''>260,174,000,000</td><td style=''>55,256,000,000</td><td style='background-color: #d1e7dd;'>61.06%</td><td style='background-color: #d1e7dd;'>21.24%</td><td style='background-color: #f8d7da;'>2.74</td><td style=''>1.54</td></tr><tr><td style=''>2018</td><td style=''>265,595,000,000</td><td style=''>59,531,000,000</td><td style='background-color: #d1e7dd;'>55.56%</td><td style='background-color: #d1e7dd;'>22.41%</td><td style='background-color: #f8d7da;'>2.41</td><td style=''>1.12</td></tr><tr><td style=''>2017</td><td style=''>229,234,000,000</td><td style=''>48,351,000,000</td><td style='background-color: #d1e7dd;'>36.07%</td><td style='background-color: #d1e7dd;'>21.09%</td><td style=''>1.80</td><td style=''>1.28</td></tr><tr><td style=''>2016</td><td style=''>215,639,000,000</td><td style=''>45,687,000,000</td><td style='background-color: #d1e7dd;'>35.62%</td><td style='background-color: #d1e7dd;'>21.19%</td><td style=''>1.51</td><td style=''>1.35</td></tr></tbody></table>
|
||||||
98
main.py
Normal file
98
main.py
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
sys.path.append(os.path.join(os.path.dirname(__file__), 'src'))
|
||||||
|
|
||||||
|
from fetchers.factory import FetcherFactory
|
||||||
|
from storage.file_io import DataStorage
|
||||||
|
from analysis.calculator import FinancialCalculator
|
||||||
|
from reporting.markdown_generator import MarkdownReporter
|
||||||
|
from reporting.html_generator import HtmlReporter
|
||||||
|
|
||||||
|
def run_analysis(market, symbol):
|
||||||
|
load_dotenv()
|
||||||
|
tushare_token = os.getenv('TUSHARE_TOKEN')
|
||||||
|
av_key = os.getenv('ALPHA_VANTAGE_KEY')
|
||||||
|
|
||||||
|
print(f"\nProcessing {market} stock: {symbol}...")
|
||||||
|
# 1. Fetch Data
|
||||||
|
try:
|
||||||
|
fetcher = FetcherFactory.get_fetcher(market, tushare_token, av_key)
|
||||||
|
|
||||||
|
print("Fetching Income Statement...")
|
||||||
|
df_inc = fetcher.get_income_statement(symbol)
|
||||||
|
print("Fetching Balance Sheet...")
|
||||||
|
df_bal = fetcher.get_balance_sheet(symbol)
|
||||||
|
print("Fetching Cash Flow...")
|
||||||
|
df_cf = fetcher.get_cash_flow(symbol)
|
||||||
|
print("Fetching Market Metrics...")
|
||||||
|
metrics = fetcher.get_market_metrics(symbol)
|
||||||
|
print(f"Metrics: {metrics}")
|
||||||
|
|
||||||
|
# 1.1 Fetch Historical Metrics
|
||||||
|
historical_metrics_df = None
|
||||||
|
if not df_inc.empty:
|
||||||
|
# Tushare dates are often YYYYMMDD. Align format.
|
||||||
|
dates = df_inc['date'].tolist() if 'date' in df_inc.columns else []
|
||||||
|
# Also combine from bal/cf if needed? usually inc covers reporting periods.
|
||||||
|
if dates and hasattr(fetcher, 'get_historical_metrics'):
|
||||||
|
print(f"Fetching Historical Market Metrics for {len(dates)} periods...")
|
||||||
|
historical_metrics_df = fetcher.get_historical_metrics(symbol, dates)
|
||||||
|
|
||||||
|
# 2. Save Data
|
||||||
|
storage = DataStorage()
|
||||||
|
storage.save_data(df_inc, market, symbol, "income_statement")
|
||||||
|
storage.save_data(df_bal, market, symbol, "balance_sheet")
|
||||||
|
storage.save_data(df_cf, market, symbol, "cash_flow")
|
||||||
|
|
||||||
|
# 3. Calculate Indicators
|
||||||
|
print("Calculating Financial Indicators...")
|
||||||
|
calculator = FinancialCalculator()
|
||||||
|
df_analysis = calculator.process_data(df_inc, df_bal, df_cf, metrics, market, historical_metrics_df)
|
||||||
|
|
||||||
|
if df_analysis.empty:
|
||||||
|
print("Not enough data to calculate indicators.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# 4. Generate Reports
|
||||||
|
print("Generating Reports...")
|
||||||
|
md_reporter = MarkdownReporter()
|
||||||
|
html_reporter = HtmlReporter()
|
||||||
|
|
||||||
|
md_content = md_reporter.generate_report(df_analysis, market, symbol, metrics)
|
||||||
|
html_content = html_reporter.generate_report(df_analysis, market, symbol, metrics)
|
||||||
|
|
||||||
|
output_dir = os.path.join("data", market, symbol)
|
||||||
|
md_path = os.path.join(output_dir, "report.md")
|
||||||
|
html_path = os.path.join(output_dir, "report.html")
|
||||||
|
|
||||||
|
with open(md_path, "w", encoding='utf-8') as f:
|
||||||
|
f.write(md_content)
|
||||||
|
|
||||||
|
with open(html_path, "w", encoding='utf-8') as f:
|
||||||
|
f.write(html_content)
|
||||||
|
|
||||||
|
print(f"\nAnalysis completed! Reports saved to:")
|
||||||
|
print(f" - Markdown: {md_path}")
|
||||||
|
print(f" - HTML: {html_path}")
|
||||||
|
print("-" * 50)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error occurred: {str(e)}")
|
||||||
|
import traceback
|
||||||
|
traceback.print_exc()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) > 2:
|
||||||
|
market = sys.argv[1]
|
||||||
|
symbol = sys.argv[2]
|
||||||
|
run_analysis(market, symbol)
|
||||||
|
else:
|
||||||
|
print("Usage: python main.py <MARKET> <SYMBOL>")
|
||||||
|
# Default test cases if run without args (for manual testing)
|
||||||
|
print("Running default test cases:")
|
||||||
|
# Test CN
|
||||||
|
run_analysis('CN', '600519.SH')
|
||||||
|
# Test US
|
||||||
|
run_analysis('US', 'AAPL')
|
||||||
5
requirements.txt
Normal file
5
requirements.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
pandas
|
||||||
|
requests
|
||||||
|
tushare
|
||||||
|
alpha_vantage
|
||||||
|
python-dotenv
|
||||||
BIN
src/analysis/__pycache__/calculator.cpython-312.pyc
Normal file
BIN
src/analysis/__pycache__/calculator.cpython-312.pyc
Normal file
Binary file not shown.
BIN
src/analysis/__pycache__/calculator.cpython-313.pyc
Normal file
BIN
src/analysis/__pycache__/calculator.cpython-313.pyc
Normal file
Binary file not shown.
344
src/analysis/calculator.py
Normal file
344
src/analysis/calculator.py
Normal file
@ -0,0 +1,344 @@
|
|||||||
|
import pandas as pd
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
class FinancialCalculator:
|
||||||
|
def process_data(self, df_inc: pd.DataFrame, df_bal: pd.DataFrame, df_cf: pd.DataFrame, market_metrics: dict, market: str, historical_metrics: pd.DataFrame = None) -> pd.DataFrame:
|
||||||
|
"""
|
||||||
|
Input DFs are expected to be raw API output (with some renaming from Fetcher, but we can re-map here for safety).
|
||||||
|
Output: A DataFrame where index is Years (descending), columns are all calculated indicators.
|
||||||
|
"""
|
||||||
|
# 1. Standardize and Merge
|
||||||
|
# We need a robust date/year index.
|
||||||
|
# Tushare: end_date (YYYYMMDD). AV: fiscalDateEnding (YYYY-MM-DD).
|
||||||
|
# Fetchers already normalize some cols, but let's map extensively.
|
||||||
|
|
||||||
|
df_inc = self._map_columns(df_inc, 'income', market)
|
||||||
|
df_bal = self._map_columns(df_bal, 'balance', market)
|
||||||
|
df_cf = self._map_columns(df_cf, 'cashflow', market)
|
||||||
|
|
||||||
|
# Merge on 'date_str' (normalized YYYY-MM-DD or YYYYMMDD string)
|
||||||
|
# We need to create a unified key. Fetchers return 'date' column.
|
||||||
|
# Let's clean 'date' to string.
|
||||||
|
for df in [df_inc, df_bal, df_cf]:
|
||||||
|
if not df.empty and 'date' in df.columns:
|
||||||
|
df['date_str'] = df['date'].astype(str).str.replace('-', '') # Standardize to YYYYMMDD
|
||||||
|
|
||||||
|
# Start with Income Statement as base (usually most critical for periods)
|
||||||
|
if df_inc.empty:
|
||||||
|
return pd.DataFrame()
|
||||||
|
|
||||||
|
df_merged = pd.merge(df_inc, df_bal, on='date_str', how='outer', suffixes=('', '_bal'))
|
||||||
|
df_merged = pd.merge(df_merged, df_cf, on='date_str', how='outer', suffixes=('', '_cf'))
|
||||||
|
|
||||||
|
if df_merged.empty:
|
||||||
|
return pd.DataFrame()
|
||||||
|
|
||||||
|
# Sort desc
|
||||||
|
df_merged = df_merged.sort_values('date_str', ascending=False)
|
||||||
|
|
||||||
|
# 2. Calculate Indicators
|
||||||
|
# Helper for safer division
|
||||||
|
def safe_div(a, b):
|
||||||
|
return a / b.replace(0, np.nan)
|
||||||
|
|
||||||
|
# --- Major Indicators ---
|
||||||
|
# Revenue, NetIncome (mapped)
|
||||||
|
# Growth Rates (YoY) - Note: Data is desc, so shift(-1) is previous year
|
||||||
|
# Helper for YoY Growth
|
||||||
|
def calc_yoy_growth(df, col):
|
||||||
|
growths = []
|
||||||
|
for idx, row in df.iterrows():
|
||||||
|
try:
|
||||||
|
curr_date = str(row['date_str'])
|
||||||
|
# target prev year date: 20250930 -> 20240930
|
||||||
|
target_date = str(int(curr_date) - 10000)
|
||||||
|
|
||||||
|
# Find matching row
|
||||||
|
match = df[df['date_str'] == target_date]
|
||||||
|
if not match.empty and col in row and pd.notna(row[col]):
|
||||||
|
prev_val = match.iloc[0].get(col)
|
||||||
|
curr_val = row[col]
|
||||||
|
if prev_val and prev_val != 0:
|
||||||
|
growths.append((curr_val - prev_val) / abs(prev_val))
|
||||||
|
else:
|
||||||
|
growths.append(np.nan)
|
||||||
|
else:
|
||||||
|
# Fallback: if no match found (e.g. historical annuals might be contiguous),
|
||||||
|
# check if next row is exact 1 year prior?
|
||||||
|
# Actually strict matching is safer to avoid Q3 vs FY comparison issues user reported.
|
||||||
|
growths.append(np.nan)
|
||||||
|
except:
|
||||||
|
growths.append(np.nan)
|
||||||
|
return growths
|
||||||
|
|
||||||
|
if 'revenue' in df_merged.columns:
|
||||||
|
df_merged['RevenueGrowth'] = calc_yoy_growth(df_merged, 'revenue')
|
||||||
|
if 'net_income' in df_merged.columns:
|
||||||
|
df_merged['NetIncomeGrowth'] = calc_yoy_growth(df_merged, 'net_income')
|
||||||
|
|
||||||
|
# Margins
|
||||||
|
if 'gross_profit' in df_merged.columns and 'revenue' in df_merged.columns:
|
||||||
|
df_merged['GrossMargin'] = safe_div(df_merged['gross_profit'], df_merged['revenue'])
|
||||||
|
if 'net_income' in df_merged.columns and 'revenue' in df_merged.columns:
|
||||||
|
df_merged['NetMargin'] = safe_div(df_merged['net_income'], df_merged['revenue'])
|
||||||
|
|
||||||
|
# Returns
|
||||||
|
# ROE
|
||||||
|
if 'net_income' in df_merged.columns and 'total_equity' in df_merged.columns:
|
||||||
|
df_merged['ROE'] = safe_div(df_merged['net_income'], df_merged['total_equity'])
|
||||||
|
|
||||||
|
# ROA
|
||||||
|
if 'net_income' in df_merged.columns and 'total_assets' in df_merged.columns:
|
||||||
|
df_merged['ROA'] = safe_div(df_merged['net_income'], df_merged['total_assets'])
|
||||||
|
|
||||||
|
# ROIC
|
||||||
|
if 'short_term_debt' in df_merged.columns and 'long_term_debt' in df_merged.columns:
|
||||||
|
df_merged['InterestBearingDebt'] = df_merged['short_term_debt'].fillna(0) + df_merged['long_term_debt'].fillna(0)
|
||||||
|
if 'total_equity' in df_merged.columns:
|
||||||
|
df_merged['InvestedCapital'] = df_merged['total_equity'] + df_merged['InterestBearingDebt']
|
||||||
|
if 'ebit' in df_merged.columns:
|
||||||
|
df_merged['ROIC'] = safe_div(df_merged['ebit'], df_merged['InvestedCapital'])
|
||||||
|
|
||||||
|
# Cash Flow
|
||||||
|
if 'capex' in df_merged.columns:
|
||||||
|
df_merged['Capex'] = df_merged['capex'].abs()
|
||||||
|
if 'ocf' in df_merged.columns:
|
||||||
|
df_merged['FCF'] = df_merged['ocf'] - df_merged['Capex']
|
||||||
|
|
||||||
|
# --- Expenses ---
|
||||||
|
|
||||||
|
# --- Expenses ---
|
||||||
|
if 'selling_exp' in df_merged.columns and 'revenue' in df_merged.columns:
|
||||||
|
df_merged['SellingRatio'] = safe_div(df_merged['selling_exp'], df_merged['revenue'])
|
||||||
|
if 'admin_exp' in df_merged.columns and 'revenue' in df_merged.columns:
|
||||||
|
df_merged['AdminRatio'] = safe_div(df_merged['admin_exp'], df_merged['revenue'])
|
||||||
|
if 'rd_exp' in df_merged.columns and 'revenue' in df_merged.columns:
|
||||||
|
df_merged['RDRatio'] = safe_div(df_merged['rd_exp'], df_merged['revenue'])
|
||||||
|
# Tax Rate
|
||||||
|
if 'income_tax' in df_merged.columns and 'total_profit' in df_merged.columns:
|
||||||
|
df_merged['TaxRate'] = safe_div(df_merged['income_tax'], df_merged['total_profit'])
|
||||||
|
|
||||||
|
# Other Expense Ratio (GrossMargin - Selling - Admin - RD - NetMargin)
|
||||||
|
if 'GrossMargin' in df_merged.columns and 'NetMargin' in df_merged.columns:
|
||||||
|
other_ratio = df_merged['GrossMargin'] - df_merged['NetMargin']
|
||||||
|
if 'SellingRatio' in df_merged.columns: other_ratio = other_ratio - df_merged['SellingRatio'].fillna(0)
|
||||||
|
if 'AdminRatio' in df_merged.columns: other_ratio = other_ratio - df_merged['AdminRatio'].fillna(0)
|
||||||
|
if 'RDRatio' in df_merged.columns: other_ratio = other_ratio - df_merged['RDRatio'].fillna(0)
|
||||||
|
df_merged['OtherExpenseRatio'] = other_ratio
|
||||||
|
|
||||||
|
# Depreciation Expense Ratio
|
||||||
|
if 'depreciation' in df_merged.columns and 'revenue' in df_merged.columns:
|
||||||
|
# depreciation might be negative in some sources? Usually positive expense.
|
||||||
|
# safe_div logic check
|
||||||
|
df_merged['DepreciationRatio'] = safe_div(df_merged['depreciation'].abs(), df_merged['revenue'])
|
||||||
|
|
||||||
|
if 'total_assets' in df_merged.columns:
|
||||||
|
assets = df_merged['total_assets']
|
||||||
|
# Restore missing ratios
|
||||||
|
if 'cash' in df_merged.columns: df_merged['CashRatio'] = safe_div(df_merged['cash'], assets)
|
||||||
|
if 'inventory' in df_merged.columns: df_merged['InventoryRatio'] = safe_div(df_merged['inventory'], assets)
|
||||||
|
if 'receivables' in df_merged.columns: df_merged['ReceivablesRatio'] = safe_div(df_merged['receivables'], assets)
|
||||||
|
if 'accounts_payable' in df_merged.columns: df_merged['PayablesRatio'] = safe_div(df_merged['accounts_payable'], assets)
|
||||||
|
|
||||||
|
# Prepayment
|
||||||
|
if 'prepayment' in df_merged.columns: df_merged['PrepaymentRatio'] = safe_div(df_merged['prepayment'], assets)
|
||||||
|
|
||||||
|
# Fixed Assets
|
||||||
|
if 'fixed_assets' in df_merged.columns: df_merged['FixedAssetsRatio'] = safe_div(df_merged['fixed_assets'], assets)
|
||||||
|
|
||||||
|
# Long Term Investment
|
||||||
|
if 'lt_invest' in df_merged.columns: df_merged['LongTermInvestmentRatio'] = safe_div(df_merged['lt_invest'], assets)
|
||||||
|
|
||||||
|
# Goodwill
|
||||||
|
if 'goodwill' in df_merged.columns: df_merged['GoodwillRatio'] = safe_div(df_merged['goodwill'], assets)
|
||||||
|
|
||||||
|
# Other Assets: User requested specific residual formula
|
||||||
|
# 1 - Cash - Inventory - Receivables - Prepayment - FixedAssets - LTInvest - Goodwill
|
||||||
|
# Use fillna(0) to ensure subtraction works
|
||||||
|
known_assets_ratio = (
|
||||||
|
df_merged.get('CashRatio', 0).fillna(0) +
|
||||||
|
df_merged.get('InventoryRatio', 0).fillna(0) +
|
||||||
|
df_merged.get('ReceivablesRatio', 0).fillna(0) +
|
||||||
|
df_merged.get('PrepaymentRatio', 0).fillna(0) +
|
||||||
|
df_merged.get('FixedAssetsRatio', 0).fillna(0) +
|
||||||
|
df_merged.get('LongTermInvestmentRatio', 0).fillna(0) +
|
||||||
|
df_merged.get('GoodwillRatio', 0).fillna(0)
|
||||||
|
)
|
||||||
|
df_merged['OtherAssetsRatio'] = 1 - known_assets_ratio
|
||||||
|
|
||||||
|
# Advance Receipts (adv_receipts + contract_liab)
|
||||||
|
adv = df_merged.get('adv_receipts', 0).fillna(0) + df_merged.get('contract_liab', 0).fillna(0)
|
||||||
|
df_merged['AdvanceReceiptsRatio'] = safe_div(adv, assets)
|
||||||
|
|
||||||
|
# Debts
|
||||||
|
# Handle potential column name collision from merge (prioritize Balance Sheet source)
|
||||||
|
st_col = 'short_term_debt_bal' if 'short_term_debt_bal' in df_merged.columns else 'short_term_debt'
|
||||||
|
lt_col = 'long_term_debt_bal' if 'long_term_debt_bal' in df_merged.columns else 'long_term_debt'
|
||||||
|
|
||||||
|
st_debt = df_merged.get(st_col, 0).fillna(0)
|
||||||
|
lt_debt = df_merged.get(lt_col, 0).fillna(0)
|
||||||
|
|
||||||
|
df_merged['ShortTermDebtRatio'] = safe_div(st_debt, assets)
|
||||||
|
df_merged['LongTermDebtRatio'] = safe_div(lt_debt, assets)
|
||||||
|
|
||||||
|
# Interest Bearing Debt Ratio
|
||||||
|
df_merged['InterestBearingDebtRatio'] = safe_div(st_debt + lt_debt, assets)
|
||||||
|
|
||||||
|
# Operating Assets Ratio (New user-defined formula)
|
||||||
|
# InventoryRatio + ReceivablesRatio + PrepaymentRatio - PayablesRatio - AdvanceReceiptsRatio
|
||||||
|
inv_ratio = df_merged.get('InventoryRatio', 0).fillna(0)
|
||||||
|
rec_ratio = df_merged.get('ReceivablesRatio', 0).fillna(0)
|
||||||
|
prep_ratio = df_merged.get('PrepaymentRatio', 0).fillna(0)
|
||||||
|
pay_ratio = df_merged.get('PayablesRatio', 0).fillna(0)
|
||||||
|
adv_ratio = df_merged.get('AdvanceReceiptsRatio', 0).fillna(0)
|
||||||
|
df_merged['OperatingAssetsRatio'] = inv_ratio + rec_ratio + prep_ratio - pay_ratio - adv_ratio
|
||||||
|
|
||||||
|
# --- Turnover (Days) ---
|
||||||
|
if 'cogs' in df_merged.columns:
|
||||||
|
if 'inventory' in df_merged.columns:
|
||||||
|
df_merged['InventoryDays'] = safe_div(df_merged['inventory'] * 365, df_merged['cogs'])
|
||||||
|
if 'accounts_payable' in df_merged.columns:
|
||||||
|
df_merged['PayablesDays'] = safe_div(df_merged['accounts_payable'] * 365, df_merged['cogs'])
|
||||||
|
if 'revenue' in df_merged.columns:
|
||||||
|
if 'receivables' in df_merged.columns:
|
||||||
|
df_merged['ReceivablesDays'] = safe_div(df_merged['receivables'] * 365, df_merged['revenue'])
|
||||||
|
if 'fixed_assets' in df_merged.columns:
|
||||||
|
df_merged['FixedAssetsTurnover'] = safe_div(df_merged['revenue'], df_merged['fixed_assets'])
|
||||||
|
if 'total_assets' in df_merged.columns:
|
||||||
|
df_merged['TotalAssetTurnover'] = safe_div(df_merged['revenue'], df_merged['total_assets'])
|
||||||
|
|
||||||
|
# --- Market Metrics ---
|
||||||
|
if historical_metrics is not None and not historical_metrics.empty and not df_merged.empty:
|
||||||
|
# Merge historical metrics
|
||||||
|
# historical_metrics likely has ['date_str', 'Price', 'PE', 'PB', 'MarketCap', 'Shareholders']
|
||||||
|
# We merge on date_str.
|
||||||
|
# Use distinct suffixes to avoid collision if columns exist?
|
||||||
|
df_merged = pd.merge(df_merged, historical_metrics, on='date_str', how='left', suffixes=('', '_hist'))
|
||||||
|
|
||||||
|
# Fill missing with latest metrics for the first row if historical missing (e.g. today's report? usually historical covers it)
|
||||||
|
# Or prioritize historical.
|
||||||
|
# Columns in historical: Price, PE, PB, MarketCap, Shareholders.
|
||||||
|
# If they exist in df_merged after merge, good.
|
||||||
|
# Ensure 'Employees' is still filled from market_metrics (stock_company is usually single latest)
|
||||||
|
# df_merged.loc[df_merged.index[0], 'Employees'] = market_metrics.get('employee_count') # MOVED to Annual Logic below
|
||||||
|
|
||||||
|
# If historical is missing for latest date (e.g. slight mismatch), fallback to snapshot?
|
||||||
|
if pd.isna(df_merged.iloc[0].get('Price')):
|
||||||
|
df_merged.loc[df_merged.index[0], 'Price'] = market_metrics.get('price')
|
||||||
|
if pd.isna(df_merged.iloc[0].get('PE')):
|
||||||
|
df_merged.loc[df_merged.index[0], 'PE'] = market_metrics.get('pe')
|
||||||
|
# ... checks for others if needed.
|
||||||
|
|
||||||
|
# Shareholders fallback
|
||||||
|
if pd.isna(df_merged.iloc[0].get('Shareholders')):
|
||||||
|
df_merged.loc[df_merged.index[0], 'Shareholders'] = market_metrics.get('total_share_holders')
|
||||||
|
|
||||||
|
elif not df_merged.empty: # Fallback to existing logic (snapshot only)
|
||||||
|
df_merged.loc[df_merged.index[0], 'Price'] = market_metrics.get('price')
|
||||||
|
df_merged.loc[df_merged.index[0], 'MarketCap'] = market_metrics.get('market_cap')
|
||||||
|
df_merged.loc[df_merged.index[0], 'PE'] = market_metrics.get('pe')
|
||||||
|
df_merged.loc[df_merged.index[0], 'PB'] = market_metrics.get('pb')
|
||||||
|
# df_merged.loc[df_merged.index[0], 'Employees'] <-- Removed
|
||||||
|
df_merged.loc[df_merged.index[0], 'Shareholders'] = market_metrics.get('total_share_holders')
|
||||||
|
|
||||||
|
# --- Employees & Per-Employee Metrics ---
|
||||||
|
# Logic: Employee count usually comes from the latest Annual Report.
|
||||||
|
# Assign to the most recent '1231' row.
|
||||||
|
if not df_merged.empty:
|
||||||
|
# Find rows ending with 1231
|
||||||
|
annual_idxs = df_merged.index[df_merged['date_str'].astype(str).str.endswith('1231')]
|
||||||
|
if len(annual_idxs) > 0:
|
||||||
|
target_idx = annual_idxs[0] # The latest annual report in the sorted list
|
||||||
|
|
||||||
|
emps = market_metrics.get('employee_count', 0)
|
||||||
|
if emps > 0:
|
||||||
|
df_merged.loc[target_idx, 'Employees'] = emps
|
||||||
|
if 'revenue' in df_merged.columns:
|
||||||
|
df_merged.loc[target_idx, 'RevenuePerEmp'] = df_merged.loc[target_idx, 'revenue'] / emps
|
||||||
|
if 'net_income' in df_merged.columns:
|
||||||
|
df_merged.loc[target_idx, 'ProfitPerEmp'] = df_merged.loc[target_idx, 'net_income'] / emps
|
||||||
|
if 'cash_paid_for_employees' in df_merged.columns:
|
||||||
|
df_merged.loc[target_idx, 'AvgWage'] = df_merged.loc[target_idx, 'cash_paid_for_employees'] / emps
|
||||||
|
|
||||||
|
# Filter out auxiliary comparison periods (e.g. Q3 last year used only for growth calc)
|
||||||
|
# Keep: Latest Period AND Annual Reports
|
||||||
|
if not df_merged.empty:
|
||||||
|
latest_date = df_merged['date_str'].iloc[0]
|
||||||
|
# condition: is latest OR is annual (ends with 1231)
|
||||||
|
condition = (df_merged['date_str'] == latest_date) | (df_merged['date_str'].astype(str).str.endswith('1231'))
|
||||||
|
df_merged = df_merged[condition]
|
||||||
|
|
||||||
|
return df_merged
|
||||||
|
|
||||||
|
def _map_columns(self, df: pd.DataFrame, type: str, market: str) -> pd.DataFrame:
|
||||||
|
df = df.copy()
|
||||||
|
if df.empty: return df
|
||||||
|
cols = df.columns
|
||||||
|
|
||||||
|
mapping = {}
|
||||||
|
if market == 'CN':
|
||||||
|
# Tushare mapping
|
||||||
|
mapping = {
|
||||||
|
# Income
|
||||||
|
'total_revenue': 'revenue', 'oper_cost': 'cogs', 'total_cogs': 'total_costs',
|
||||||
|
'sell_exp': 'selling_exp', 'admin_exp': 'admin_exp', 'fin_exp': 'fin_exp', 'rd_exp': 'rd_exp',
|
||||||
|
'total_profit': 'total_profit', 'income_tax': 'income_tax', 'n_income_attr_p': 'net_income', 'net_profit_attr_p': 'net_income',
|
||||||
|
# Balance
|
||||||
|
'money_cap': 'cash', 'accounts_receiv': 'receivables', 'inventories': 'inventory',
|
||||||
|
'fix_assets': 'fixed_assets', 'total_assets': 'total_assets', 'goodwill': 'goodwill',
|
||||||
|
'prepayment': 'prepayment', 'lt_eqt_invest': 'lt_invest', 'oth_assets': 'other_assets', 'trad_asset': 'trading_assets',
|
||||||
|
# Updated per user request and CSV validation: st_borr, lt_borr
|
||||||
|
'st_borr': 'short_term_debt', 'non_cur_liab_due_1y': 'short_term_debt_part',
|
||||||
|
'lt_borr': 'long_term_debt', 'bonds_payable': 'long_term_debt_bonds',
|
||||||
|
'total_liab': 'total_liabilities', 'total_hldr_eqy_exc_min_int': 'total_equity', 'total_share_holder_equity': 'total_equity',
|
||||||
|
'adv_receipts': 'adv_receipts', 'contract_liab': 'contract_liab',
|
||||||
|
'acct_payable': 'accounts_payable',
|
||||||
|
# Cash
|
||||||
|
'net_cash_flow': 'ocf', 'n_cashflow_act': 'ocf', 'c_pay_acq_const_fiolta': 'capex', 'c_paid_div_prof_int': 'dividends',
|
||||||
|
'c_paid_to_for_empl': 'cash_paid_for_employees'
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
# Alpha Vantage mapping
|
||||||
|
mapping = {
|
||||||
|
# Income
|
||||||
|
'totalRevenue': 'revenue', 'costOfRevenue': 'cogs', 'grossProfit': 'gross_profit',
|
||||||
|
'sellingGeneralAndAdministrative': 'operating_expenses',
|
||||||
|
'researchAndDevelopment': 'rd_exp', 'interestExpense': 'fin_exp',
|
||||||
|
'incomeBeforeTax': 'total_profit', 'incomeTaxExpense': 'income_tax', 'netIncome': 'net_income',
|
||||||
|
'ebit': 'ebit',
|
||||||
|
# Balance
|
||||||
|
'cashAndCashEquivalentsAtCarryingValue': 'cash', 'currentNetReceivables': 'receivables', 'inventory': 'inventory',
|
||||||
|
'propertyPlantEquipment': 'fixed_assets', 'totalAssets': 'total_assets', 'goodwill': 'goodwill',
|
||||||
|
'otherCurrentAssets': 'prepayment', 'longTermInvestments': 'lt_invest', 'otherNonCurrentAssets': 'other_assets',
|
||||||
|
'shortTermDebt': 'short_term_debt', 'currentLongTermDebt': 'short_term_debt_part',
|
||||||
|
'longTermDebt': 'long_term_debt', 'totalLiabilities': 'total_liabilities', 'totalShareholderEquity': 'total_equity',
|
||||||
|
'currentAccountsPayable': 'accounts_payable', 'deferredRevenue': 'adv_receipts',
|
||||||
|
# Cash
|
||||||
|
'net_cash_flow': 'ocf', 'operatingCashflow': 'ocf', 'capitalExpenditures': 'capex', 'dividendPayout': 'dividends'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Filter mapping keys that exist in df
|
||||||
|
actual_map = {k: v for k, v in mapping.items() if k in cols}
|
||||||
|
df = df.rename(columns=actual_map)
|
||||||
|
|
||||||
|
# Remove duplicate columns (e.g. if 'revenue' existed and we renamed 'total_revenue' to 'revenue')
|
||||||
|
df = df.loc[:, ~df.columns.duplicated()]
|
||||||
|
|
||||||
|
# Post-processing
|
||||||
|
if 'short_term_debt' not in df.columns: df['short_term_debt'] = 0
|
||||||
|
if 'short_term_debt_part' in df.columns:
|
||||||
|
df['short_term_debt'] = df['short_term_debt'].fillna(0) + df['short_term_debt_part'].fillna(0)
|
||||||
|
|
||||||
|
if 'long_term_debt' not in df.columns: df['long_term_debt'] = 0
|
||||||
|
if 'long_term_debt_bonds' in df.columns:
|
||||||
|
df['long_term_debt'] = df['long_term_debt'].fillna(0) + df['long_term_debt_bonds'].fillna(0)
|
||||||
|
|
||||||
|
# Gross Profit
|
||||||
|
if 'gross_profit' not in df.columns and 'revenue' in df.columns and 'cogs' in df.columns:
|
||||||
|
df['gross_profit'] = df['revenue'] - df['cogs']
|
||||||
|
|
||||||
|
# EBIT
|
||||||
|
if 'ebit' not in df.columns and 'total_profit' in df.columns and 'fin_exp' in df.columns:
|
||||||
|
df['ebit'] = df['total_profit'] + df['fin_exp']
|
||||||
|
|
||||||
|
return df
|
||||||
BIN
src/fetchers/__pycache__/alpha_vantage_fetcher.cpython-312.pyc
Normal file
BIN
src/fetchers/__pycache__/alpha_vantage_fetcher.cpython-312.pyc
Normal file
Binary file not shown.
BIN
src/fetchers/__pycache__/alpha_vantage_fetcher.cpython-313.pyc
Normal file
BIN
src/fetchers/__pycache__/alpha_vantage_fetcher.cpython-313.pyc
Normal file
Binary file not shown.
BIN
src/fetchers/__pycache__/base.cpython-312.pyc
Normal file
BIN
src/fetchers/__pycache__/base.cpython-312.pyc
Normal file
Binary file not shown.
BIN
src/fetchers/__pycache__/base.cpython-313.pyc
Normal file
BIN
src/fetchers/__pycache__/base.cpython-313.pyc
Normal file
Binary file not shown.
BIN
src/fetchers/__pycache__/factory.cpython-312.pyc
Normal file
BIN
src/fetchers/__pycache__/factory.cpython-312.pyc
Normal file
Binary file not shown.
BIN
src/fetchers/__pycache__/factory.cpython-313.pyc
Normal file
BIN
src/fetchers/__pycache__/factory.cpython-313.pyc
Normal file
Binary file not shown.
BIN
src/fetchers/__pycache__/tushare_fetcher.cpython-312.pyc
Normal file
BIN
src/fetchers/__pycache__/tushare_fetcher.cpython-312.pyc
Normal file
Binary file not shown.
BIN
src/fetchers/__pycache__/tushare_fetcher.cpython-313.pyc
Normal file
BIN
src/fetchers/__pycache__/tushare_fetcher.cpython-313.pyc
Normal file
Binary file not shown.
130
src/fetchers/alpha_vantage_fetcher.py
Normal file
130
src/fetchers/alpha_vantage_fetcher.py
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
import requests
|
||||||
|
import pandas as pd
|
||||||
|
from .base import DataFetcher
|
||||||
|
|
||||||
|
class AlphaVantageFetcher(DataFetcher):
|
||||||
|
BASE_URL = "https://www.alphavantage.co/query"
|
||||||
|
|
||||||
|
def __init__(self, api_key: str):
|
||||||
|
super().__init__(api_key)
|
||||||
|
|
||||||
|
def _fetch_data(self, function: str, symbol: str) -> pd.DataFrame:
|
||||||
|
params = {
|
||||||
|
"function": function,
|
||||||
|
"symbol": symbol,
|
||||||
|
"apikey": self.api_key
|
||||||
|
}
|
||||||
|
try:
|
||||||
|
response = requests.get(self.BASE_URL, params=params)
|
||||||
|
data = response.json()
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error requesting {function}: {e}")
|
||||||
|
return pd.DataFrame()
|
||||||
|
|
||||||
|
# Alpha Vantage returns keys like "annualReports" and "quarterlyReports"
|
||||||
|
# We need Last 10 Annual + Latest Quarterly
|
||||||
|
|
||||||
|
df_annual = pd.DataFrame()
|
||||||
|
df_quarterly = pd.DataFrame()
|
||||||
|
|
||||||
|
if "annualReports" in data:
|
||||||
|
df_annual = pd.DataFrame(data["annualReports"])
|
||||||
|
if "fiscalDateEnding" in df_annual.columns:
|
||||||
|
df_annual = df_annual.sort_values("fiscalDateEnding", ascending=False).head(10)
|
||||||
|
|
||||||
|
if "quarterlyReports" in data:
|
||||||
|
df_quarterly = pd.DataFrame(data["quarterlyReports"])
|
||||||
|
if "fiscalDateEnding" in df_quarterly.columns:
|
||||||
|
df_quarterly = df_quarterly.sort_values("fiscalDateEnding", ascending=False).head(1)
|
||||||
|
|
||||||
|
if df_annual.empty and df_quarterly.empty:
|
||||||
|
print(f"Error fetching {function} for {symbol}: {data.keys() if isinstance(data, dict) else data}")
|
||||||
|
return pd.DataFrame()
|
||||||
|
|
||||||
|
# Combine: Prioritize Annual Reports if dates match
|
||||||
|
# Logic: 10 Annuals + Latest Quarter IF it's newer.
|
||||||
|
# If we concat [df_annual, df_quarterly] and drop_duplicates(keep='first'),
|
||||||
|
# checking fiscalDateEnding:
|
||||||
|
# If Q-Date > A-Date: Q is kept (unique).
|
||||||
|
# If Q-Date == A-Date: A is kept (first).
|
||||||
|
combined = pd.concat([df_annual, df_quarterly])
|
||||||
|
|
||||||
|
if "fiscalDateEnding" in combined.columns:
|
||||||
|
combined = combined.drop_duplicates(subset=["fiscalDateEnding"], keep='first')
|
||||||
|
combined = combined.sort_values("fiscalDateEnding", ascending=False)
|
||||||
|
|
||||||
|
return combined
|
||||||
|
|
||||||
|
def get_market_metrics(self, symbol: str) -> dict:
|
||||||
|
# 1. Get Overview for PE, PB, MarketCap, Employees
|
||||||
|
overview_data = {}
|
||||||
|
try:
|
||||||
|
params = {"function": "OVERVIEW", "symbol": symbol, "apikey": self.api_key}
|
||||||
|
r = requests.get(self.BASE_URL, params=params)
|
||||||
|
overview_data = r.json()
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error fetching OVERVIEW for {symbol}: {e}")
|
||||||
|
|
||||||
|
# 2. Get Global Quote for latest Price
|
||||||
|
price = 0.0
|
||||||
|
try:
|
||||||
|
params = {"function": "GLOBAL_QUOTE", "symbol": symbol, "apikey": self.api_key}
|
||||||
|
r = requests.get(self.BASE_URL, params=params)
|
||||||
|
quote_data = r.json()
|
||||||
|
if "Global Quote" in quote_data and "05. price" in quote_data["Global Quote"]:
|
||||||
|
price = float(quote_data["Global Quote"]["05. price"])
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error fetching GLOBAL_QUOTE for {symbol}: {e}")
|
||||||
|
|
||||||
|
return {
|
||||||
|
"price": price,
|
||||||
|
"market_cap": float(overview_data.get("MarketCapitalization", 0) or 0),
|
||||||
|
"pe": float(overview_data.get("PERatio", 0) or 0),
|
||||||
|
"pb": float(overview_data.get("PriceToBookRatio", 0) or 0),
|
||||||
|
"employee_count": int(overview_data.get("FullTimeEmployees", 0) or 0),
|
||||||
|
"total_share_holders": 0 # Not typically provided in basic AV Overview
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_income_statement(self, symbol: str) -> pd.DataFrame:
|
||||||
|
df = self._fetch_data("INCOME_STATEMENT", symbol)
|
||||||
|
cols_map = {
|
||||||
|
"fiscalDateEnding": "date",
|
||||||
|
"totalRevenue": "revenue",
|
||||||
|
"netIncome": "net_income"
|
||||||
|
}
|
||||||
|
df = df.rename(columns=cols_map)
|
||||||
|
|
||||||
|
# Convert numeric columns for analysis, keep others as is
|
||||||
|
for col in ["revenue", "net_income"]:
|
||||||
|
if col in df.columns:
|
||||||
|
df[col] = pd.to_numeric(df[col], errors='coerce')
|
||||||
|
return df
|
||||||
|
|
||||||
|
def get_balance_sheet(self, symbol: str) -> pd.DataFrame:
|
||||||
|
df = self._fetch_data("BALANCE_SHEET", symbol)
|
||||||
|
cols_map = {
|
||||||
|
"fiscalDateEnding": "date",
|
||||||
|
"totalShareholderEquity": "total_equity",
|
||||||
|
"totalLiabilities": "total_liabilities",
|
||||||
|
"totalCurrentAssets": "current_assets",
|
||||||
|
"totalCurrentLiabilities": "current_liabilities"
|
||||||
|
}
|
||||||
|
df = df.rename(columns=cols_map)
|
||||||
|
|
||||||
|
for col in ["total_equity", "total_liabilities", "current_assets", "current_liabilities"]:
|
||||||
|
if col in df.columns:
|
||||||
|
df[col] = pd.to_numeric(df[col], errors='coerce')
|
||||||
|
return df
|
||||||
|
|
||||||
|
def get_cash_flow(self, symbol: str) -> pd.DataFrame:
|
||||||
|
df = self._fetch_data("CASH_FLOW", symbol)
|
||||||
|
cols_map = {
|
||||||
|
"fiscalDateEnding": "date",
|
||||||
|
"operatingCashflow": "net_cash_flow",
|
||||||
|
"depreciationDepletionAndAmortization": "depreciation"
|
||||||
|
}
|
||||||
|
df = df.rename(columns=cols_map)
|
||||||
|
|
||||||
|
if "net_cash_flow" in df.columns:
|
||||||
|
df["net_cash_flow"] = pd.to_numeric(df["net_cash_flow"], errors='coerce')
|
||||||
|
return df
|
||||||
31
src/fetchers/base.py
Normal file
31
src/fetchers/base.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
from abc import ABC, abstractmethod
|
||||||
|
import pandas as pd
|
||||||
|
|
||||||
|
class DataFetcher(ABC):
|
||||||
|
def __init__(self, api_key: str):
|
||||||
|
self.api_key = api_key
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_income_statement(self, symbol: str) -> pd.DataFrame:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_balance_sheet(self, symbol: str) -> pd.DataFrame:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_cash_flow(self, symbol: str) -> pd.DataFrame:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_market_metrics(self, symbol: str) -> dict:
|
||||||
|
"""
|
||||||
|
Returns a dictionary containing:
|
||||||
|
- price
|
||||||
|
- market_cap (value)
|
||||||
|
- pe
|
||||||
|
- pb
|
||||||
|
- total_share_holders (int)
|
||||||
|
- employee_count (int)
|
||||||
|
"""
|
||||||
|
pass
|
||||||
18
src/fetchers/factory.py
Normal file
18
src/fetchers/factory.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
from .tushare_fetcher import TushareFetcher
|
||||||
|
from .alpha_vantage_fetcher import AlphaVantageFetcher
|
||||||
|
from .base import DataFetcher
|
||||||
|
|
||||||
|
class FetcherFactory:
|
||||||
|
@staticmethod
|
||||||
|
def get_fetcher(market: str, tushare_token: str = None, av_key: str = None) -> DataFetcher:
|
||||||
|
market = market.upper()
|
||||||
|
if market in ['CN', 'HK']:
|
||||||
|
if not tushare_token:
|
||||||
|
raise ValueError("Tushare token is required for CN/HK markets")
|
||||||
|
return TushareFetcher(tushare_token)
|
||||||
|
elif market in ['US', 'JP']:
|
||||||
|
if not av_key:
|
||||||
|
raise ValueError("Alpha Vantage key is required for US/JP markets")
|
||||||
|
return AlphaVantageFetcher(av_key)
|
||||||
|
else:
|
||||||
|
raise ValueError(f"Unsupported market: {market}")
|
||||||
259
src/fetchers/tushare_fetcher.py
Normal file
259
src/fetchers/tushare_fetcher.py
Normal file
@ -0,0 +1,259 @@
|
|||||||
|
import tushare as ts
|
||||||
|
import pandas as pd
|
||||||
|
from .base import DataFetcher
|
||||||
|
import time
|
||||||
|
|
||||||
|
class TushareFetcher(DataFetcher):
|
||||||
|
def __init__(self, api_key: str):
|
||||||
|
super().__init__(api_key)
|
||||||
|
ts.set_token(self.api_key)
|
||||||
|
self.pro = ts.pro_api()
|
||||||
|
|
||||||
|
def _get_ts_code(self, symbol: str) -> str:
|
||||||
|
# Tushare requires suffix: .SH, .SZ for CN; .HK for HK
|
||||||
|
# Input might be bare code '600519' or '00700'
|
||||||
|
# Simple heuristic: if 5 digits, likelihood HK (but could be others).
|
||||||
|
# Better: User passes full code or we default.
|
||||||
|
# Implementation assumes user provides Tushare compatible code or we try to guess.
|
||||||
|
# For now, return as is if it has suffix, otherwise guess based on length?
|
||||||
|
# A safer bet is to require the user to pass '600519.SH' or '00700.HK'
|
||||||
|
return symbol
|
||||||
|
|
||||||
|
def _filter_data(self, df: pd.DataFrame) -> pd.DataFrame:
|
||||||
|
"""
|
||||||
|
Filter logic:
|
||||||
|
1. Sort by end_date (desc).
|
||||||
|
2. Remove duplicates (keep first/latest announcement).
|
||||||
|
3. Select Latest Quarter.
|
||||||
|
4. Select last 10 Annual Reports (end_date ends with '1231').
|
||||||
|
5. Combine and return.
|
||||||
|
"""
|
||||||
|
if df.empty or 'end_date' not in df.columns:
|
||||||
|
return df
|
||||||
|
|
||||||
|
# Ensure sorted by date descending
|
||||||
|
# Tushare often has 'ann_date' (announcement date) and 'end_date' (report period).
|
||||||
|
# We sort by end_date mostly.
|
||||||
|
# Note: If multiple records exist for same end_date (revisions), the API generally puts latest revision first if we sort properly?
|
||||||
|
# Default behavior: sort by end_date desc.
|
||||||
|
df = df.sort_values(by='end_date', ascending=False)
|
||||||
|
|
||||||
|
# Deduplicate: one record per end_date
|
||||||
|
df = df.drop_duplicates(subset=['end_date'], keep='first')
|
||||||
|
|
||||||
|
if df.empty:
|
||||||
|
return df
|
||||||
|
|
||||||
|
# 1. Latest Quarter (The most recent record)
|
||||||
|
latest_record = df.iloc[[0]]
|
||||||
|
|
||||||
|
# 2. Comparable Period Last Year (for Growth Rate)
|
||||||
|
# If latest is 20240930, we need 20230930.
|
||||||
|
try:
|
||||||
|
latest_date_str = str(latest_record['end_date'].values[0])
|
||||||
|
last_year_date_str = str(int(latest_date_str) - 10000)
|
||||||
|
comparable_record = df[df['end_date'].astype(str) == last_year_date_str]
|
||||||
|
except:
|
||||||
|
comparable_record = pd.DataFrame()
|
||||||
|
|
||||||
|
# 3. Annual Reports (end_date ends with '1231')
|
||||||
|
# Tushare dates are YYYYMMDD string or int. Cast to str to be safe.
|
||||||
|
is_annual = df['end_date'].astype(str).str.endswith('1231')
|
||||||
|
annual_records = df[is_annual].head(10)
|
||||||
|
|
||||||
|
# 4. Combine
|
||||||
|
combined = pd.concat([latest_record, comparable_record, annual_records])
|
||||||
|
|
||||||
|
# 5. Deduplicate again (in case latest IS an annual report)
|
||||||
|
combined = combined.drop_duplicates(subset=['end_date'])
|
||||||
|
|
||||||
|
# 5. Final Sort
|
||||||
|
combined = combined.sort_values(by='end_date', ascending=False)
|
||||||
|
|
||||||
|
return combined
|
||||||
|
|
||||||
|
def get_income_statement(self, symbol: str) -> pd.DataFrame:
|
||||||
|
ts_code = self._get_ts_code(symbol)
|
||||||
|
if ts_code.endswith('.HK'):
|
||||||
|
df = self.pro.hk_income(ts_code=ts_code)
|
||||||
|
# HK mapping might differ slightly, checking common fields
|
||||||
|
# HK Tushare usually has 'revenue', 'net_profit_attr_p'
|
||||||
|
rename_map = {
|
||||||
|
'end_date': 'date',
|
||||||
|
'revenue': 'revenue',
|
||||||
|
'net_profit_attr_p': 'net_income' # HK specific
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
df = self.pro.income(ts_code=ts_code)
|
||||||
|
rename_map = {
|
||||||
|
'end_date': 'date',
|
||||||
|
'revenue': 'revenue',
|
||||||
|
'n_income_attr_p': 'net_income'
|
||||||
|
}
|
||||||
|
|
||||||
|
df = self._filter_data(df)
|
||||||
|
|
||||||
|
# Rename columns but keep all data
|
||||||
|
df = df.rename(columns=rename_map)
|
||||||
|
return df
|
||||||
|
|
||||||
|
def get_balance_sheet(self, symbol: str) -> pd.DataFrame:
|
||||||
|
ts_code = self._get_ts_code(symbol)
|
||||||
|
if ts_code.endswith('.HK'):
|
||||||
|
df = self.pro.hk_balancesheet(ts_code=ts_code)
|
||||||
|
# HK mapping
|
||||||
|
rename_map = {
|
||||||
|
'end_date': 'date',
|
||||||
|
'total_share_holder_equity': 'total_equity', # verify this field name for HK
|
||||||
|
'total_liab': 'total_liabilities',
|
||||||
|
'total_cur_asset': 'current_assets',
|
||||||
|
'total_cur_liab': 'current_liabilities'
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
df = self.pro.balancesheet(ts_code=ts_code)
|
||||||
|
rename_map = {
|
||||||
|
'end_date': 'date',
|
||||||
|
'total_hldr_eqy_exc_min_int': 'total_equity',
|
||||||
|
'total_liab': 'total_liabilities',
|
||||||
|
'total_cur_assets': 'current_assets',
|
||||||
|
'total_cur_liab': 'current_liabilities'
|
||||||
|
}
|
||||||
|
|
||||||
|
df = self._filter_data(df)
|
||||||
|
|
||||||
|
df = df.rename(columns=rename_map)
|
||||||
|
return df
|
||||||
|
|
||||||
|
def get_cash_flow(self, symbol: str) -> pd.DataFrame:
|
||||||
|
ts_code = self._get_ts_code(symbol)
|
||||||
|
if ts_code.endswith('.HK'):
|
||||||
|
df = self.pro.hk_cashflow(ts_code=ts_code)
|
||||||
|
else:
|
||||||
|
df = self.pro.cashflow(ts_code=ts_code)
|
||||||
|
|
||||||
|
df = self._filter_data(df)
|
||||||
|
|
||||||
|
df = df.rename(columns={
|
||||||
|
'end_date': 'date',
|
||||||
|
'n_cashflow_act': 'net_cash_flow',
|
||||||
|
'depr_fa_coga_dpba': 'depreciation'
|
||||||
|
})
|
||||||
|
return df
|
||||||
|
|
||||||
|
def get_market_metrics(self, symbol: str) -> dict:
|
||||||
|
ts_code = self._get_ts_code(symbol)
|
||||||
|
metrics = {
|
||||||
|
"price": 0.0,
|
||||||
|
"market_cap": 0.0,
|
||||||
|
"pe": 0.0,
|
||||||
|
"pb": 0.0,
|
||||||
|
"total_share_holders": 0,
|
||||||
|
"employee_count": 0
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 1. Daily Basic (Price, PE, PB, Market Cap)
|
||||||
|
# Fetch latest available
|
||||||
|
df_daily = self.pro.daily_basic(ts_code=ts_code, limit=1)
|
||||||
|
# If empty (limit=1 might return empty if today is holiday?), try range.
|
||||||
|
# Tushare daily_basic usually returns latest if no date specified?
|
||||||
|
# Actually limit=1 without date might work? Or need start_date/end_date.
|
||||||
|
# Let's try fetching without date args, Tushare usually requires date or returns range.
|
||||||
|
# Easier: Fetch for specific recent date? Or just query last 10 days and take head(1).
|
||||||
|
# To be safe, let's just try no args (latest).
|
||||||
|
if df_daily.empty:
|
||||||
|
# Fallback: get trade cal and find last trade date?
|
||||||
|
# Simplified: user wants "latest".
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
row = df_daily.iloc[0]
|
||||||
|
metrics["price"] = row.get('close', 0.0)
|
||||||
|
metrics["pe"] = row.get('pe', 0.0)
|
||||||
|
metrics["pb"] = row.get('pb', 0.0)
|
||||||
|
# total_mv is usually in ten thousands? Or standard?
|
||||||
|
# Tushare doc: total_mv is "Total Market Value (10k)".
|
||||||
|
# User wants units? We'll normalize to raw value or 10k later.
|
||||||
|
# Let's keep it as is (10k units) and note it, or convert to full value.
|
||||||
|
# AlphaVantage returns full value. Let's convert Tushare to full value to standardize?
|
||||||
|
# Wait, user asked for "Market Cap (Yi Yuan)".
|
||||||
|
# Tushare total_mv is 10k CNY. So 10000 -> 1 Yi.
|
||||||
|
# Let's store raw 10k value * 10000 = full value.
|
||||||
|
metrics["market_cap"] = row.get('total_mv', 0.0) * 10000
|
||||||
|
metrics["dividend_yield"] = row.get('dv_ttm', 0.0)
|
||||||
|
|
||||||
|
# 1.5 Stock Basic (Name, List Date)
|
||||||
|
df_basic = self.pro.stock_basic(ts_code=ts_code, fields='name,list_date')
|
||||||
|
if not df_basic.empty:
|
||||||
|
metrics['name'] = df_basic.iloc[0]['name']
|
||||||
|
metrics['list_date'] = df_basic.iloc[0]['list_date']
|
||||||
|
|
||||||
|
# 2. Stock Company (Employees)
|
||||||
|
df_comp = self.pro.stock_company(ts_code=ts_code, fields='employees')
|
||||||
|
if not df_comp.empty:
|
||||||
|
metrics["employee_count"] = int(df_comp.iloc[0].get('employees', 0) or 0)
|
||||||
|
|
||||||
|
# 3. Shareholder Number (Latest)
|
||||||
|
# Tushare interface: stk_holdernumber
|
||||||
|
df_holder = self.pro.stk_holdernumber(ts_code=ts_code, limit=1)
|
||||||
|
if not df_holder.empty:
|
||||||
|
metrics["total_share_holders"] = int(df_holder.iloc[0].get('holder_num', 0) or 0)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error fetching market metrics for {symbol}: {e}")
|
||||||
|
|
||||||
|
return metrics
|
||||||
|
|
||||||
|
def get_historical_metrics(self, symbol: str, dates: list) -> pd.DataFrame:
|
||||||
|
"""
|
||||||
|
Fetch historical market metrics (Price, PE, PB, MarketCap, Shareholders) for specific dates.
|
||||||
|
Optimized to fetch data in bulk ranges to reduce API calls.
|
||||||
|
"""
|
||||||
|
ts_code = self._get_ts_code(symbol)
|
||||||
|
results = []
|
||||||
|
|
||||||
|
if not dates:
|
||||||
|
return pd.DataFrame()
|
||||||
|
|
||||||
|
# Deduplicate and sort dates
|
||||||
|
unique_dates = sorted(list(set([str(d).replace('-', '') for d in dates])), reverse=True)
|
||||||
|
|
||||||
|
try:
|
||||||
|
import datetime
|
||||||
|
min_date = min(unique_dates)
|
||||||
|
max_date = max(unique_dates)
|
||||||
|
|
||||||
|
# 1. Bulk fetch daily basic metrics for the entire date range
|
||||||
|
df_daily = self.pro.daily_basic(ts_code=ts_code, start_date=min_date, end_date=max_date)
|
||||||
|
if not df_daily.empty:
|
||||||
|
df_daily = df_daily.sort_values('trade_date', ascending=False)
|
||||||
|
|
||||||
|
# 2. Bulk fetch shareholder data for the entire date range
|
||||||
|
df_holder = self.pro.stk_holdernumber(ts_code=ts_code, start_date=min_date, end_date=max_date)
|
||||||
|
if not df_holder.empty:
|
||||||
|
df_holder = df_holder.sort_values('end_date', ascending=False)
|
||||||
|
|
||||||
|
for date_str in unique_dates:
|
||||||
|
metrics = {'date_str': date_str}
|
||||||
|
|
||||||
|
# Find closest daily metric data (on or before the target date)
|
||||||
|
if not df_daily.empty:
|
||||||
|
closest_daily = df_daily[df_daily['trade_date'] <= date_str]
|
||||||
|
if not closest_daily.empty:
|
||||||
|
row = closest_daily.iloc[0]
|
||||||
|
metrics['Price'] = row.get('close')
|
||||||
|
metrics['PE'] = row.get('pe')
|
||||||
|
metrics['PB'] = row.get('pb')
|
||||||
|
metrics['MarketCap'] = row.get('total_mv', 0) * 10000
|
||||||
|
|
||||||
|
# Find closest shareholder data
|
||||||
|
if not df_holder.empty:
|
||||||
|
closest_holder = df_holder[df_holder['end_date'] <= date_str]
|
||||||
|
if not closest_holder.empty:
|
||||||
|
metrics['Shareholders'] = closest_holder.iloc[0].get('holder_num')
|
||||||
|
|
||||||
|
results.append(metrics)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error fetching historical metrics for {symbol}: {e}")
|
||||||
|
|
||||||
|
return pd.DataFrame(results)
|
||||||
BIN
src/reporting/__pycache__/html_generator.cpython-313.pyc
Normal file
BIN
src/reporting/__pycache__/html_generator.cpython-313.pyc
Normal file
Binary file not shown.
BIN
src/reporting/__pycache__/markdown_generator.cpython-312.pyc
Normal file
BIN
src/reporting/__pycache__/markdown_generator.cpython-312.pyc
Normal file
Binary file not shown.
BIN
src/reporting/__pycache__/markdown_generator.cpython-313.pyc
Normal file
BIN
src/reporting/__pycache__/markdown_generator.cpython-313.pyc
Normal file
Binary file not shown.
254
src/reporting/html_generator.py
Normal file
254
src/reporting/html_generator.py
Normal file
@ -0,0 +1,254 @@
|
|||||||
|
import pandas as pd
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
class HtmlReporter:
|
||||||
|
def generate_report(self, df: pd.DataFrame, market: str, symbol: str, metrics: dict = {}) -> str:
|
||||||
|
if df.empty:
|
||||||
|
return f"No breakdown data available for {market} {symbol}"
|
||||||
|
|
||||||
|
# 1. Transpose Data for Presentation (Years as Columns)
|
||||||
|
# Ensure df is sorted desc by date
|
||||||
|
df = df.sort_values('date_str', ascending=False)
|
||||||
|
|
||||||
|
# Prepare header (Years/Quarters)
|
||||||
|
# Format date_str: YYYYMMDD -> YYYY-MM-DD or 2025 Q3?
|
||||||
|
# Simple heuristic: if month is 03/06/09/12, map to Q.
|
||||||
|
# But for annuals, we just show Year.
|
||||||
|
# User said: "Latest year... check which quarter".
|
||||||
|
headers = []
|
||||||
|
for d in df['date_str']:
|
||||||
|
s = str(d)
|
||||||
|
if len(s) == 8:
|
||||||
|
year = s[:4]
|
||||||
|
month = s[4:6]
|
||||||
|
if month == '12':
|
||||||
|
headers.append(year)
|
||||||
|
elif month in ['03', '01', '02']: headers.append(f"{year} Q1")
|
||||||
|
elif month in ['06', '04', '05']: headers.append(f"{year} Q2")
|
||||||
|
elif month in ['09', '07', '08']: headers.append(f"{year} Q3")
|
||||||
|
else: headers.append(f"{year} {month}")
|
||||||
|
else:
|
||||||
|
headers.append(s) # Fallback
|
||||||
|
|
||||||
|
# 2. Define Indicator Groups and Labels
|
||||||
|
# Mapping: Internal Col Name -> Display Name
|
||||||
|
indicators = {
|
||||||
|
"主要指标": [
|
||||||
|
('ROE', 'ROE', 'percent'),
|
||||||
|
('ROA', 'ROA', 'percent'),
|
||||||
|
('ROIC', 'ROCE/ROIC', 'percent'),
|
||||||
|
('GrossMargin', '毛利率', 'percent'),
|
||||||
|
('NetMargin', '净利润率', 'percent'),
|
||||||
|
('revenue', '收入', 'currency_yi'),
|
||||||
|
('RevenueGrowth', '收入增速', 'percent_color'),
|
||||||
|
('net_income', '净利润', 'currency_yi'),
|
||||||
|
('NetIncomeGrowth', '净利润增速', 'percent_color'),
|
||||||
|
('ocf', '经营净现金流', 'currency_yi_color'),
|
||||||
|
('Capex', '资本开支', 'currency_yi'),
|
||||||
|
('FCF', '自由现金流', 'currency_yi_compare'),
|
||||||
|
# Dividends/Buybacks might be missing
|
||||||
|
('dividends', '分红', 'currency_yi'),
|
||||||
|
('total_assets', '总资产', 'currency_yi'),
|
||||||
|
('total_equity', '净资产', 'currency_yi'),
|
||||||
|
('goodwill', '商誉', 'currency_yi')
|
||||||
|
],
|
||||||
|
"费用指标": [
|
||||||
|
('SellingRatio', '销售费用率', 'percent'),
|
||||||
|
('AdminRatio', '管理费用率', 'percent'),
|
||||||
|
('RDRatio', '研发费用率', 'percent'),
|
||||||
|
('OtherExpenseRatio', '其他费用率', 'percent'),
|
||||||
|
('DepreciationRatio', '折旧费用占比', 'percent'),
|
||||||
|
('TaxRate', '所得税率', 'percent'),
|
||||||
|
],
|
||||||
|
"资产占比": [
|
||||||
|
('CashRatio', '现金占比', 'percent_alert_30'),
|
||||||
|
('InventoryRatio', '库存占比', 'percent'),
|
||||||
|
('ReceivablesRatio', '应收款占比', 'percent'),
|
||||||
|
('PrepaymentRatio', '预付款占比', 'percent'),
|
||||||
|
('FixedAssetsRatio', '固定资产占比', 'percent'),
|
||||||
|
('LongTermInvestmentRatio', '长期投资占比', 'percent'),
|
||||||
|
('GoodwillRatio', '商誉占比', 'percent'),
|
||||||
|
('OtherAssetsRatio', '其他资产占比', 'percent'),
|
||||||
|
('PayablesRatio', '应付款占比', 'percent'),
|
||||||
|
('AdvanceReceiptsRatio', '预收款占比', 'percent'),
|
||||||
|
('ShortTermDebtRatio', '短期借款占比', 'percent'),
|
||||||
|
('LongTermDebtRatio', '长期借款占比', 'percent'),
|
||||||
|
('OperatingAssetsRatio', '运营资产占比', 'percent'),
|
||||||
|
('InterestBearingDebtRatio', '有息负债率', 'percent'),
|
||||||
|
],
|
||||||
|
"周转能力": [
|
||||||
|
('InventoryDays', '存货周转天数', 'int'),
|
||||||
|
('ReceivablesDays', '应收款周转天数', 'int_alert_90'), # >90 Red
|
||||||
|
('PayablesDays', '应付款周转天数', 'int'),
|
||||||
|
('FixedAssetsTurnover', '固定资产周转率', 'float'),
|
||||||
|
('TotalAssetTurnover', '总资产周转率', 'float'),
|
||||||
|
],
|
||||||
|
"人均效率": [
|
||||||
|
('Employees', '员工人数', 'int'),
|
||||||
|
('RevenuePerEmp', '人均创收(万)', 'currency_wan'),
|
||||||
|
('ProfitPerEmp', '人均创利(万)', 'currency_wan'),
|
||||||
|
('AvgWage', '人均薪酬(万)', 'currency_wan'),
|
||||||
|
],
|
||||||
|
"市场表现": [
|
||||||
|
('Price', '股价', 'float'),
|
||||||
|
('MarketCap', '市值(亿)', 'currency_yi_market'),
|
||||||
|
('PE', 'PE', 'float'),
|
||||||
|
('PB', 'PB', 'float'),
|
||||||
|
('Shareholders', '股东户数', 'int'),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
# 3. Build HTML
|
||||||
|
html = []
|
||||||
|
html.append("<html><head><title>Financial Report</title><style>")
|
||||||
|
html.append("body { max-width: 1400px; margin: 0 auto; }")
|
||||||
|
html.append(".fin-table { width: 100%; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 13px; table-layout: fixed; }")
|
||||||
|
html.append(".fin-table th, .fin-table td { width: 90px; word-wrap: break-word; }")
|
||||||
|
html.append(".fin-table th { background-color: #f8f9fa; padding: 8px; border-bottom: 2px solid #ddd; text-align: right; }")
|
||||||
|
html.append(".fin-table td { padding: 6px 8px; border-bottom: 1px solid #eee; text-align: right; }")
|
||||||
|
html.append(".fin-table .row-header { width: 160px; text-align: left !important; font-weight: 500; color: #666; position: sticky; left: 0; z-index: 1; background-color: #f8f9fa; }")
|
||||||
|
html.append(".group-header { background-color: #f0f0f5 !important; font-weight: bold; text-align: left !important; color: #333; position: sticky; left: 0; z-index: 1; }")
|
||||||
|
html.append(".hover-row:hover { background-color: #e6e6fa !important; }")
|
||||||
|
html.append(".hover-row:hover .row-header { background-color: #e6e6fa !important; }")
|
||||||
|
html.append(".text-green { color: #008000; }")
|
||||||
|
html.append(".bg-green { background-color: #d1e7dd; color: #0f5132; }")
|
||||||
|
html.append(".text-red { color: #dc3545; }")
|
||||||
|
html.append(".bg-red { background-color: #f8d7da; color: #842029; }")
|
||||||
|
html.append(".text-blue-i { color: #0d6efd; font-style: italic; }")
|
||||||
|
html.append(".italic { font-style: italic; }")
|
||||||
|
html.append(".bg-khaki { background-color: #F0E68C; }")
|
||||||
|
html.append(".info-table { width: 100%; margin-bottom: 15px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 13px; table-layout: fixed; }")
|
||||||
|
html.append(".info-table td { padding: 5px 10px; border: 1px solid #eee; word-wrap: break-word; }")
|
||||||
|
html.append(".info-label { background-color: #f8f9fa; font-weight: bold; width: 100px; color: #666; }")
|
||||||
|
html.append("</style></head><body>")
|
||||||
|
|
||||||
|
# --- Company Info Table ---
|
||||||
|
import datetime
|
||||||
|
today_str = datetime.date.today().strftime("%Y-%m-%d")
|
||||||
|
name = metrics.get('name', '')
|
||||||
|
raw_list_date = metrics.get('list_date', '')
|
||||||
|
# Convert YYYYMMDD to YYYY-MM-DD if possible
|
||||||
|
if isinstance(raw_list_date, str) and len(raw_list_date) == 8:
|
||||||
|
list_date = f"{raw_list_date[:4]}-{raw_list_date[4:6]}-{raw_list_date[6:]}"
|
||||||
|
else:
|
||||||
|
list_date = raw_list_date
|
||||||
|
pe = metrics.get('pe', 0)
|
||||||
|
pb = metrics.get('pb', 0)
|
||||||
|
div = metrics.get('dividend_yield', 0)
|
||||||
|
|
||||||
|
html.append("<h1>Financial Report</h1>")
|
||||||
|
html.append("<table class='info-table'>")
|
||||||
|
html.append("<tr>")
|
||||||
|
html.append("<td class='info-label'>代码</td><td class='info-label'>简称</td><td class='info-label'>日期</td><td class='info-label'>上市日期</td><td class='info-label'>PE</td><td class='info-label'>PB</td><td class='info-label'>股息率(%)</td>")
|
||||||
|
html.append("</tr>")
|
||||||
|
html.append("<tr>")
|
||||||
|
html.append(f"<td>{symbol}</td><td>{name}</td><td>{today_str}</td><td>{list_date}</td><td>{pe:.2f}</td><td>{pb:.2f}</td><td>{div:.2f}%</td>")
|
||||||
|
html.append("</tr>")
|
||||||
|
html.append("</table>")
|
||||||
|
|
||||||
|
html.append("<div style='overflow-x: auto;'>")
|
||||||
|
html.append("<table class='fin-table'>")
|
||||||
|
|
||||||
|
# Header Row
|
||||||
|
html.append("<thead><tr><th class='row-header'>指标</th>")
|
||||||
|
for h in headers:
|
||||||
|
html.append(f"<th>{h}</th>")
|
||||||
|
html.append("</tr></thead>")
|
||||||
|
|
||||||
|
html.append("<tbody>")
|
||||||
|
|
||||||
|
for group_name, items in indicators.items():
|
||||||
|
# Group Header
|
||||||
|
html.append(f"<tr><td class='group-header'>{group_name}</td><td class='group-header' colspan='{len(headers)}' style='position: relative; border-bottom: 2px solid #ddd;'></td></tr>")
|
||||||
|
|
||||||
|
for key, label, fmt_type in items:
|
||||||
|
html.append("<tr class='hover-row'>")
|
||||||
|
html.append(f"<td class='row-header'>{label}</td>")
|
||||||
|
|
||||||
|
for idx, row_series in df.iterrows():
|
||||||
|
val = row_series.get(key, np.nan)
|
||||||
|
|
||||||
|
if pd.isna(val) or val is None:
|
||||||
|
html.append("<td>-</td>")
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Styling Logic
|
||||||
|
style_class = ""
|
||||||
|
disp_val = str(val)
|
||||||
|
|
||||||
|
if key == 'OtherAssetsRatio':
|
||||||
|
style_class = 'bg-khaki'
|
||||||
|
|
||||||
|
# Logic block
|
||||||
|
if fmt_type == 'percent':
|
||||||
|
disp_val = f"{val:.2%}"
|
||||||
|
# Conditional Specifics
|
||||||
|
if key == 'ROE' and val > 0.15: style_class = "bg-green"
|
||||||
|
elif key == 'ROA' and val > 0.10: style_class = "bg-green"
|
||||||
|
elif key == 'ROIC' and val > 0.15: style_class = "bg-green"
|
||||||
|
elif key == 'GrossMargin' and val > 0.35: style_class = "bg-green"
|
||||||
|
elif key == 'NetMargin':
|
||||||
|
if val > 0.15: style_class = "bg-green"
|
||||||
|
elif val < 0: style_class = "bg-red"
|
||||||
|
elif key == 'OperatingAssetsRatio' and val < 0:
|
||||||
|
style_class = 'bg-green'
|
||||||
|
|
||||||
|
elif fmt_type == 'percent_color': # Revenue/Profit Growth
|
||||||
|
disp_val = f"{val:.2%}"
|
||||||
|
if val > 0.15: style_class = "bg-green italic"
|
||||||
|
elif val < 0: style_class = "text-red italic"
|
||||||
|
else: style_class = "text-blue-i"
|
||||||
|
|
||||||
|
elif fmt_type == 'currency':
|
||||||
|
# Should not be used if everything moved to currency_yi, but keep for fallback
|
||||||
|
disp_val = f"{val:,.2f}"
|
||||||
|
|
||||||
|
elif fmt_type == 'currency_yi':
|
||||||
|
# 1 Yi = 100,000,000 (10^8)
|
||||||
|
disp_val = f"{val/100000000:,.2f}"
|
||||||
|
|
||||||
|
elif fmt_type == 'currency_yi_color': # OCF
|
||||||
|
disp_val = f"{val/100000000:,.2f}"
|
||||||
|
if val < 0: style_class = "bg-red"
|
||||||
|
|
||||||
|
elif fmt_type == 'currency_yi_compare': # FCF
|
||||||
|
disp_val = f"{val/100000000:,.2f}"
|
||||||
|
# Compare to Net Income (need to access current row's net_income)
|
||||||
|
ni = row_series.get('net_income', 0)
|
||||||
|
if val > ni: style_class = "bg-green"
|
||||||
|
elif val < 0: style_class = "bg-red"
|
||||||
|
|
||||||
|
elif fmt_type == 'currency_wan': # Per Employee
|
||||||
|
disp_val = f"{val/10000:,.2f}"
|
||||||
|
|
||||||
|
elif fmt_type == 'currency_yi_market': # Market Cap
|
||||||
|
val_yi = val / 100000000
|
||||||
|
if abs(val_yi) > 1000:
|
||||||
|
disp_val = f"{val_yi:,.0f}"
|
||||||
|
else:
|
||||||
|
disp_val = f"{val_yi:,.2f}"
|
||||||
|
|
||||||
|
elif fmt_type == 'int':
|
||||||
|
disp_val = f"{int(val):,}"
|
||||||
|
|
||||||
|
elif fmt_type == 'float':
|
||||||
|
disp_val = f"{val:.2f}"
|
||||||
|
|
||||||
|
# Special Alerts
|
||||||
|
if fmt_type == 'percent_alert_30':
|
||||||
|
disp_val = f"{val:.2%}"
|
||||||
|
if val > 0.30: style_class = "bg-red"
|
||||||
|
|
||||||
|
if fmt_type == 'float_alert_90':
|
||||||
|
disp_val = f"{val:.2f}"
|
||||||
|
if val > 90: style_class = "bg-red"
|
||||||
|
|
||||||
|
if fmt_type == 'int_alert_90':
|
||||||
|
disp_val = f"{int(val):,}"
|
||||||
|
if val > 90: style_class = "bg-red"
|
||||||
|
|
||||||
|
html.append(f"<td class='{style_class}'>{disp_val}</td>")
|
||||||
|
html.append("</tr>")
|
||||||
|
|
||||||
|
html.append("</tbody></table></div></body></html>")
|
||||||
|
return "\n".join(html)
|
||||||
157
src/reporting/markdown_generator.py
Normal file
157
src/reporting/markdown_generator.py
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
import pandas as pd
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
class MarkdownReporter:
|
||||||
|
def generate_report(self, df: pd.DataFrame, market: str, symbol: str, metrics: dict = {}) -> str:
|
||||||
|
if df.empty:
|
||||||
|
return f"No breakdown data available for {market} {symbol}"
|
||||||
|
|
||||||
|
df = df.sort_values('date_str', ascending=False)
|
||||||
|
|
||||||
|
headers = []
|
||||||
|
for d in df['date_str']:
|
||||||
|
s = str(d)
|
||||||
|
if len(s) == 8:
|
||||||
|
year = s[:4]
|
||||||
|
month = s[4:6]
|
||||||
|
if month == '12':
|
||||||
|
headers.append(year)
|
||||||
|
elif month in ['03', '01', '02']: headers.append(f"{year} Q1")
|
||||||
|
elif month in ['06', '04', '05']: headers.append(f"{year} Q2")
|
||||||
|
elif month in ['09', '07', '08']: headers.append(f"{year} Q3")
|
||||||
|
else: headers.append(f"{year} {month}")
|
||||||
|
else:
|
||||||
|
headers.append(s)
|
||||||
|
|
||||||
|
indicators = {
|
||||||
|
"主要指标": [
|
||||||
|
('ROE', 'ROE', 'percent'),
|
||||||
|
('ROA', 'ROA', 'percent'),
|
||||||
|
('ROIC', 'ROCE/ROIC', 'percent'),
|
||||||
|
('GrossMargin', '毛利率', 'percent'),
|
||||||
|
('NetMargin', '净利润率', 'percent'),
|
||||||
|
('revenue', '收入(亿)', 'currency_yi'),
|
||||||
|
('RevenueGrowth', '收入增速', 'percent_color'),
|
||||||
|
('net_income', '净利润(亿)', 'currency_yi'),
|
||||||
|
('NetIncomeGrowth', '净利润增速', 'percent_color'),
|
||||||
|
('ocf', '经营净现金流(亿)', 'currency_yi_color'),
|
||||||
|
('Capex', '资本开支(亿)', 'currency_yi'),
|
||||||
|
('FCF', '自由现金流(亿)', 'currency_yi_compare'),
|
||||||
|
('dividends', '分红(亿)', 'currency_yi'),
|
||||||
|
('total_assets', '总资产(亿)', 'currency_yi'),
|
||||||
|
('total_equity', '净资产(亿)', 'currency_yi'),
|
||||||
|
('goodwill', '商誉(亿)', 'currency_yi')
|
||||||
|
],
|
||||||
|
"费用指标": [
|
||||||
|
('SellingRatio', '销售费用率', 'percent'),
|
||||||
|
('AdminRatio', '管理费用率', 'percent'),
|
||||||
|
('RDRatio', '研发费用率', 'percent'),
|
||||||
|
('OtherExpenseRatio', '其他费用率', 'percent'),
|
||||||
|
('DepreciationRatio', '折旧费用占比', 'percent'),
|
||||||
|
('TaxRate', '所得税率', 'percent'),
|
||||||
|
],
|
||||||
|
"资产占比": [
|
||||||
|
('CashRatio', '现金占比', 'percent_alert_30'),
|
||||||
|
('InventoryRatio', '库存占比', 'percent'),
|
||||||
|
('ReceivablesRatio', '应收款占比', 'percent'),
|
||||||
|
('PrepaymentRatio', '预付款占比', 'percent'),
|
||||||
|
('FixedAssetsRatio', '固定资产占比', 'percent'),
|
||||||
|
('LongTermInvestmentRatio', '长期投资占比', 'percent'),
|
||||||
|
('GoodwillRatio', '商誉占比', 'percent'),
|
||||||
|
('OtherAssetsRatio', '其他资产占比', 'percent'),
|
||||||
|
('PayablesRatio', '应付款占比', 'percent'),
|
||||||
|
('AdvanceReceiptsRatio', '预收款占比', 'percent'),
|
||||||
|
('ShortTermDebtRatio', '短期借款占比', 'percent'),
|
||||||
|
('LongTermDebtRatio', '长期借款占比', 'percent'),
|
||||||
|
('OperatingAssetsRatio', '运营资产占比', 'percent'),
|
||||||
|
('InterestBearingDebtRatio', '有息负债率', 'percent'),
|
||||||
|
],
|
||||||
|
"周转能力": [
|
||||||
|
('InventoryDays', '存货周转天数', 'int'),
|
||||||
|
('ReceivablesDays', '应收款周转天数', 'int_alert_90'),
|
||||||
|
('PayablesDays', '应付款周转天数', 'int'),
|
||||||
|
('FixedAssetsTurnover', '固定资产周转率', 'float'),
|
||||||
|
('TotalAssetTurnover', '总资产周转率', 'float'),
|
||||||
|
],
|
||||||
|
"人均效率": [
|
||||||
|
('Employees', '员工人数', 'int'),
|
||||||
|
('RevenuePerEmp', '人均创收(万)', 'currency_wan'),
|
||||||
|
('ProfitPerEmp', '人均创利(万)', 'currency_wan'),
|
||||||
|
('AvgWage', '人均薪酬(万)', 'currency_wan'),
|
||||||
|
],
|
||||||
|
"市场表现": [
|
||||||
|
('Price', '股价', 'float'),
|
||||||
|
('MarketCap', '市值(亿)', 'currency_yi_market'),
|
||||||
|
('PE', 'PE', 'float'),
|
||||||
|
('PB', 'PB', 'float'),
|
||||||
|
('Shareholders', '股东户数', 'int'),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
md = []
|
||||||
|
|
||||||
|
# --- Company Info Table ---
|
||||||
|
import datetime
|
||||||
|
today_str = datetime.date.today().strftime("%Y-%m-%d")
|
||||||
|
name = metrics.get('name', '')
|
||||||
|
raw_list_date = metrics.get('list_date', '')
|
||||||
|
if isinstance(raw_list_date, str) and len(raw_list_date) == 8:
|
||||||
|
list_date = f"{raw_list_date[:4]}-{raw_list_date[4:6]}-{raw_list_date[6:]}"
|
||||||
|
else:
|
||||||
|
list_date = raw_list_date
|
||||||
|
pe = metrics.get('pe', 0)
|
||||||
|
pb = metrics.get('pb', 0)
|
||||||
|
div = metrics.get('dividend_yield', 0)
|
||||||
|
|
||||||
|
md.append(f"# {name} ({symbol}) - Financial Report")
|
||||||
|
md.append(f"*Report generated on: {today_str}*\n")
|
||||||
|
md.append("| 代码 | 简称 | 上市日期 | PE | PB | 股息率(%) |")
|
||||||
|
md.append("|:---|:---|:---|:---|:---|:---|")
|
||||||
|
md.append(f"| {symbol} | {name} | {list_date} | {pe:.2f} | {pb:.2f} | {div:.2f}% |")
|
||||||
|
md.append("\n")
|
||||||
|
|
||||||
|
# --- Financial Data Table ---
|
||||||
|
for group_name, items in indicators.items():
|
||||||
|
md.append(f"## {group_name}")
|
||||||
|
|
||||||
|
# Table Header
|
||||||
|
header_line = "| 指标 | " + " | ".join(headers) + " |"
|
||||||
|
md.append(header_line)
|
||||||
|
# Table Separator
|
||||||
|
separator_line = "|" + "|".join([":---"] + ["--:"] * len(headers)) + "|"
|
||||||
|
md.append(separator_line)
|
||||||
|
|
||||||
|
for key, label, fmt_type in items:
|
||||||
|
row_data = [label]
|
||||||
|
for idx, row_series in df.iterrows():
|
||||||
|
val = row_series.get(key, np.nan)
|
||||||
|
|
||||||
|
if pd.isna(val) or val is None:
|
||||||
|
row_data.append("-")
|
||||||
|
continue
|
||||||
|
|
||||||
|
disp_val = ""
|
||||||
|
if fmt_type == 'percent' or fmt_type.startswith('percent_'):
|
||||||
|
disp_val = f"{val:.2%}"
|
||||||
|
elif fmt_type == 'currency_yi_market':
|
||||||
|
val_yi = val / 100000000
|
||||||
|
if abs(val_yi) > 1000:
|
||||||
|
disp_val = f"{val_yi:,.0f}"
|
||||||
|
else:
|
||||||
|
disp_val = f"{val_yi:,.2f}"
|
||||||
|
elif fmt_type.startswith('currency_yi'):
|
||||||
|
disp_val = f"{val/100000000:,.2f}"
|
||||||
|
elif fmt_type == 'currency_wan':
|
||||||
|
disp_val = f"{val/10000:,.2f}"
|
||||||
|
elif fmt_type == 'int' or fmt_type.startswith('int_'):
|
||||||
|
disp_val = f"{int(val):,}"
|
||||||
|
elif fmt_type == 'float' or fmt_type.startswith('float_'):
|
||||||
|
disp_val = f"{val:.2f}"
|
||||||
|
else:
|
||||||
|
disp_val = f"{val}"
|
||||||
|
row_data.append(disp_val)
|
||||||
|
|
||||||
|
md.append("| " + " | ".join(row_data) + " |")
|
||||||
|
md.append("\n")
|
||||||
|
|
||||||
|
return "\n".join(md)
|
||||||
BIN
src/storage/__pycache__/file_io.cpython-312.pyc
Normal file
BIN
src/storage/__pycache__/file_io.cpython-312.pyc
Normal file
Binary file not shown.
BIN
src/storage/__pycache__/file_io.cpython-313.pyc
Normal file
BIN
src/storage/__pycache__/file_io.cpython-313.pyc
Normal file
Binary file not shown.
30
src/storage/file_io.py
Normal file
30
src/storage/file_io.py
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import os
|
||||||
|
import pandas as pd
|
||||||
|
|
||||||
|
class DataStorage:
|
||||||
|
def __init__(self, base_path: str = "data"):
|
||||||
|
self.base_path = base_path
|
||||||
|
|
||||||
|
def _ensure_dir(self, path: str):
|
||||||
|
os.makedirs(path, exist_ok=True)
|
||||||
|
|
||||||
|
def save_data(self, df: pd.DataFrame, market: str, symbol: str, statement_type: str):
|
||||||
|
if df.empty:
|
||||||
|
print(f"Warning: No data to save for {market} {symbol} {statement_type}")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Prepare directory: data/{market}/{symbol}
|
||||||
|
# Sanitize symbol for filename (e.g., remove special chars if any, though usually fine)
|
||||||
|
dir_path = os.path.join(self.base_path, market, symbol)
|
||||||
|
self._ensure_dir(dir_path)
|
||||||
|
|
||||||
|
file_path = os.path.join(dir_path, f"{statement_type}.csv")
|
||||||
|
df.to_csv(file_path, index=False)
|
||||||
|
print(f"Saved {file_path}")
|
||||||
|
|
||||||
|
def load_data(self, market: str, symbol: str, statement_type: str) -> pd.DataFrame:
|
||||||
|
file_path = os.path.join(self.base_path, market, symbol, f"{statement_type}.csv")
|
||||||
|
if not os.path.exists(file_path):
|
||||||
|
print(f"File not found: {file_path}")
|
||||||
|
return pd.DataFrame()
|
||||||
|
return pd.read_csv(file_path)
|
||||||
Loading…
Reference in New Issue
Block a user