122 lines
8.5 KiB
Markdown
122 lines
8.5 KiB
Markdown
# 实施计划:财务数据获取与分析系统 (V3.0) - Refactored
|
||
|
||
## 1. 目标描述
|
||
开发一个可扩展的后端工具,通过策略模式(Strategy Pattern)支持多市场(当前为中国A股、美股、港股)的财务数据分析。工具能够为每个市场定制数据获取、分析和报告生成的全过程,同时保持核心流程的统一和代码的清晰。
|
||
|
||
## 2. 核心架构:策略模式
|
||
系统采用策略模式,将每个市场的完整业务流程(“获取-存储-分析-报告”)封装在独立的策略类中。`main.py` 作为上下文,根据用户指定的市场,选择并执行相应的策略。
|
||
|
||
- **基础策略 (Base Strategy)**: 定义在 `src/strategies/base_strategy.py`,提供了一个所有具体策略都必须遵循的通用接口,如 `execute()` 方法,该方法依次调用 `fetch_data()`、`analyze_data()` 和 `generate_report()`。
|
||
- **中国市场策略 (CN_Strategy)**: `src/strategies/cn_strategy.py`,封装了针对A股的完整处理流程。
|
||
- **美国市场策略 (US_Strategy)**: `src/strategies/us_strategy.py`,封装了针对美股的完整处理流程。
|
||
- **香港市场策略 (HK_Strategy)**: `src/strategies/hk_strategy.py`,封装了针对港股的完整处理流程。
|
||
|
||
## 3. 核心执行流程 (通过策略)
|
||
|
||
### 步骤 1: 初始化与策略选择
|
||
- **目的**: 准备环境并根据市场选择合适的策略。
|
||
- **动作**:
|
||
- 加载 `.env` 文件中的 `TUSHARE_TOKEN` 和 `ALPHA_VANTAGE_KEY`。
|
||
- `main.py` 根据用户输入的 `market` 参数,通过一个简单的工厂函数 `get_strategy`,实例化 `CN_Strategy`、`US_Strategy` 或 `HK_Strategy`。
|
||
|
||
### 步骤 2: 策略执行流程
|
||
`main.py` 调用所选策略实例的 `execute` 方法,触发完整的分析流程。根据市场选择,执行路径如下:
|
||
|
||
---
|
||
|
||
#### **场景 A: 中国市场 (market='CN')**
|
||
选择中国市场时,`CN_Strategy` 的 `execute` 方法会按顺序执行以下操作:
|
||
|
||
1. **数据获取 (`fetch_data`)**:
|
||
- **执行**: `CN_Strategy` 实例化并调用 `CnFetcher` 来获取数据。
|
||
- **API调用序列 (共7次)**:
|
||
1. **获取利润表**: 调用 Tushare 的 `income` 接口 (1次)。
|
||
2. **获取资产负债表**: 调用 Tushare 的 `balancesheet` 接口 (1次)。
|
||
3. **获取现金流量表**: 调用 Tushare 的 `cashflow` 接口 (1次)。
|
||
4. **获取市场指标 (PE/PB等)**: 调用 Tushare 的 `daily_basic` 接口 (1次)。
|
||
5. **获取基本信息 (名称/日期)**: 调用 Tushare 的 `stock_basic` 接口 (1次)。
|
||
6. **获取公司信息 (员工数)**: 调用 Tushare 的 `stock_company` 接口 (1次)。
|
||
7. **获取股东信息**: 调用 Tushare 的 `stk_holdernumber` 接口 (1次)。
|
||
- **数据存储 (两阶段缓存)**:
|
||
- **1. 原始数据缓存**: `CnFetcher` 将API返回的原始数据保存为 `raw_*.csv`。
|
||
- **2. 处理后数据缓存**: `CN_Strategy` 将初步处理过的数据保存为 `income_statement.csv` 等文件。
|
||
|
||
2. **数据分析 (`analyze_data`)**:
|
||
- **执行**: `CN_Strategy` 实例化 `CN_Analyzer`。
|
||
- **动作**: `CN_Analyzer` 对获取的数据进行合并、列名映射 (`_map_columns`) 和A股特定的财务指标计算。
|
||
|
||
3. **报告生成 (`generate_report`)**:
|
||
- **调用**: `CN_Strategy` 调用 `CN_ReportGenerator` 实例的 `generate_report` 方法,传递分析数据和输出路径。
|
||
- **核心动作**: `CN_ReportGenerator` 全权负责报告的生成与保存:
|
||
1. **生成Markdown**: 调用继承自 `BaseReporter` 的 `_generate_markdown_content` 方法创建报告内容。
|
||
2. **保存Markdown**: 将内容写入 `data/CN/{symbol}/report.md`。
|
||
3. **生成HTML**: 使用 `markdown` 库将内容转换为 HTML,并嵌入预设的 CSS 样式。
|
||
4. **保存HTML**: 将最终的 HTML 内容写入 `data/CN/{symbol}/report.html`。
|
||
|
||
---
|
||
|
||
#### **场景 B: 香港市场 (market='HK')**
|
||
选择香港市场时,`HK_Strategy` 的 `execute` 方法会按顺序执行以下操作:
|
||
|
||
1. **数据获取 (`fetch_data`)**:
|
||
- **执行**: `HK_Strategy` 实例化并调用 `HkFetcher` 来获取数据。
|
||
- **API调用序列 (共7次)**:
|
||
1. **获取利润表**: 调用 Tushare 的 `hk_income` 接口 (1次)。
|
||
2. **获取资产负债表**: 调用 Tushare 的 `hk_balancesheet` 接口 (1次)。
|
||
3. **获取现金流量表**: 调用 Tushare 的 `hk_cashflow` 接口 (1次)。
|
||
4. **获取市场指标 (PE/PB等)**: 调用 Tushare 的 `daily_basic` 接口 (1次)。
|
||
5. **获取基本信息 (名称/日期)**: 调用 Tushare 的 `stock_basic` 接口 (1次)。
|
||
6. **获取公司信息 (员工数)**: 调用 Tushare 的 `stock_company` 接口 (1次)。
|
||
7. **获取股东信息**: 调用 Tushare 的 `stk_holdernumber` 接口 (1次)。
|
||
- **数据存储 (两阶段缓存)**:
|
||
- **1. 原始数据缓存**: `HkFetcher` 将API返回的原始数据保存为 `raw_*.csv`。
|
||
- **2. 处理后数据缓存**: `HK_Strategy` 将初步处理过的数据保存为 `income_statement.csv` 等文件。
|
||
|
||
2. **数据分析 (`analyze_data`)**:
|
||
- **执行**: `HK_Strategy` 实例化 `HK_Analyzer`。
|
||
- **动作**: `HK_Analyzer` 对获取的数据进行合并、列名映射和港股特定的财务指标计算。
|
||
|
||
3. **报告生成 (`generate_report`)**:
|
||
- **调用**: `HK_Strategy` 调用 `HK_ReportGenerator` 实例的 `generate_report` 方法,传递分析数据和输出路径。
|
||
- **核心动作**: `HK_ReportGenerator` 全权负责报告的生成与保存:
|
||
1. **生成Markdown**: 调用继承自 `BaseReporter` 的 `_generate_markdown_content` 方法创建报告内容。
|
||
2. **保存Markdown**: 将内容写入 `data/HK/{symbol}/report.md`。
|
||
3. **生成HTML**: 使用 `markdown` 库将内容转换为 HTML,并嵌入预设的 CSS 样式。
|
||
4. **保存HTML**: 将最终的 HTML 内容写入 `data/HK/{symbol}/report.html`。
|
||
|
||
---
|
||
|
||
#### **场景 C: 美国市场 (market='US')**
|
||
选择美国市场时,`US_Strategy` 的 `execute` 方法会按顺序执行以下操作:
|
||
|
||
1. **数据获取 (`fetch_data`)**:
|
||
- **执行**: `US_Strategy` 实例化并调用 `UsFetcher`。
|
||
- **API调用序列 (共4次, 每次调用前有15秒延迟)**:
|
||
1. **获取利润表**: 调用 Alpha Vantage 的 `INCOME_STATEMENT` 功能 (1次)。
|
||
2. **获取资产负债表**: 调用 Alpha Vantage 的 `BALANCE_SHEET` 功能 (1次)。
|
||
3. **获取现金流量表**: 调用 Alpha Vantage 的 `CASH_FLOW` 功能 (1次)。
|
||
4. **获取公司概览**: 调用 Alpha Vantage 的 `OVERVIEW` 功能 (1次),用于计算市值、PE、PB等核心指标。
|
||
- **数据存储 (两阶段缓存)**:
|
||
- **1. 原始数据缓存**: `UsFetcher` 将API返回的原始数据保存为 `raw_*.csv`。
|
||
- **2. 处理后数据缓存**: `US_Strategy` 将初步处理过的数据保存为 `income_statement.csv` 等文件。
|
||
|
||
2. **数据分析 (`analyze_data`)**:
|
||
- **执行**: `US_Strategy` 实例化 `US_Analyzer`。
|
||
- **动作**: `US_Analyzer` 对获取的数据进行合并、列名映射和美股特定的计算逻辑。
|
||
|
||
3. **报告生成 (`generate_report`)**:
|
||
- **调用**: `US_Strategy` 调用 `US_ReportGenerator` 实例的 `generate_report` 方法,传递分析数据和输出路径。
|
||
- **核心动作**: `US_ReportGenerator` 全权负责报告的生成与保存:
|
||
1. **生成Markdown**: 调用继承自 `BaseReporter` 的 `_generate_markdown_content` 方法创建报告内容。
|
||
2. **保存Markdown**: 将内容写入 `data/US/{symbol}/report.md`。
|
||
3. **生成HTML**: 使用 `markdown` 库将内容转换为 HTML,并嵌入预设的 CSS 样式。
|
||
4. **保存HTML**: 将最终的 HTML 内容写入 `data/US/{symbol}/report.html`。
|
||
|
||
## 4. 验证计划
|
||
- **核心逻辑不变**: 由于核心的数据获取和指标计算逻辑是从旧代码平移而来,其准确性得以保留。
|
||
- **结构验证**:
|
||
1. **中国股票**: 运行 `python main.py CN 600519.SH`。检查程序是否无报错执行完毕,并生成 `data/CN/600519.SH/report.md` 文件。
|
||
2. **香港股票**: 运行 `python main.py HK 00700.HK`。检查程序是否无报错执行完毕,并生成 `data/HK/00700.HK/report.md` 文件。
|
||
3. **美国股票**: 运行 `python main.py US AAPL`。检查程序是否无报错执行完毕,并生成 `data/US/AAPL/report.md` 文件。
|
||
4. **报告内容**: 打开生成的 `.md` 文件,确认内容与旧版报告基本一致,数据完整,格式正确。
|