8.5 KiB
8.5 KiB
实施计划:财务数据获取与分析系统 (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 方法会按顺序执行以下操作:
-
数据获取 (
fetch_data):- 执行:
CN_Strategy实例化并调用CnFetcher来获取数据。 - API调用序列 (共7次):
- 获取利润表: 调用 Tushare 的
income接口 (1次)。 - 获取资产负债表: 调用 Tushare 的
balancesheet接口 (1次)。 - 获取现金流量表: 调用 Tushare 的
cashflow接口 (1次)。 - 获取市场指标 (PE/PB等): 调用 Tushare 的
daily_basic接口 (1次)。 - 获取基本信息 (名称/日期): 调用 Tushare 的
stock_basic接口 (1次)。 - 获取公司信息 (员工数): 调用 Tushare 的
stock_company接口 (1次)。 - 获取股东信息: 调用 Tushare 的
stk_holdernumber接口 (1次)。
- 获取利润表: 调用 Tushare 的
- 数据存储 (两阶段缓存):
- 1. 原始数据缓存:
CnFetcher将API返回的原始数据保存为raw_*.csv。 - 2. 处理后数据缓存:
CN_Strategy将初步处理过的数据保存为income_statement.csv等文件。
- 1. 原始数据缓存:
- 执行:
-
数据分析 (
analyze_data):- 执行:
CN_Strategy实例化CN_Analyzer。 - 动作:
CN_Analyzer对获取的数据进行合并、列名映射 (_map_columns) 和A股特定的财务指标计算。
- 执行:
-
报告生成 (
generate_report):- 调用:
CN_Strategy调用CN_ReportGenerator实例的generate_report方法,传递分析数据和输出路径。 - 核心动作:
CN_ReportGenerator全权负责报告的生成与保存:- 生成Markdown: 调用继承自
BaseReporter的_generate_markdown_content方法创建报告内容。 - 保存Markdown: 将内容写入
data/CN/{symbol}/report.md。 - 生成HTML: 使用
markdown库将内容转换为 HTML,并嵌入预设的 CSS 样式。 - 保存HTML: 将最终的 HTML 内容写入
data/CN/{symbol}/report.html。
- 生成Markdown: 调用继承自
- 调用:
场景 B: 香港市场 (market='HK')
选择香港市场时,HK_Strategy 的 execute 方法会按顺序执行以下操作:
-
数据获取 (
fetch_data):- 执行:
HK_Strategy实例化并调用HkFetcher来获取数据。 - API调用序列 (共7次):
- 获取利润表: 调用 Tushare 的
hk_income接口 (1次)。 - 获取资产负债表: 调用 Tushare 的
hk_balancesheet接口 (1次)。 - 获取现金流量表: 调用 Tushare 的
hk_cashflow接口 (1次)。 - 获取市场指标 (PE/PB等): 调用 Tushare 的
daily_basic接口 (1次)。 - 获取基本信息 (名称/日期): 调用 Tushare 的
stock_basic接口 (1次)。 - 获取公司信息 (员工数): 调用 Tushare 的
stock_company接口 (1次)。 - 获取股东信息: 调用 Tushare 的
stk_holdernumber接口 (1次)。
- 获取利润表: 调用 Tushare 的
- 数据存储 (两阶段缓存):
- 1. 原始数据缓存:
HkFetcher将API返回的原始数据保存为raw_*.csv。 - 2. 处理后数据缓存:
HK_Strategy将初步处理过的数据保存为income_statement.csv等文件。
- 1. 原始数据缓存:
- 执行:
-
数据分析 (
analyze_data):- 执行:
HK_Strategy实例化HK_Analyzer。 - 动作:
HK_Analyzer对获取的数据进行合并、列名映射和港股特定的财务指标计算。
- 执行:
-
报告生成 (
generate_report):- 调用:
HK_Strategy调用HK_ReportGenerator实例的generate_report方法,传递分析数据和输出路径。 - 核心动作:
HK_ReportGenerator全权负责报告的生成与保存:- 生成Markdown: 调用继承自
BaseReporter的_generate_markdown_content方法创建报告内容。 - 保存Markdown: 将内容写入
data/HK/{symbol}/report.md。 - 生成HTML: 使用
markdown库将内容转换为 HTML,并嵌入预设的 CSS 样式。 - 保存HTML: 将最终的 HTML 内容写入
data/HK/{symbol}/report.html。
- 生成Markdown: 调用继承自
- 调用:
场景 C: 美国市场 (market='US')
选择美国市场时,US_Strategy 的 execute 方法会按顺序执行以下操作:
-
数据获取 (
fetch_data):- 执行:
US_Strategy实例化并调用UsFetcher。 - API调用序列 (共4次, 每次调用前有15秒延迟):
- 获取利润表: 调用 Alpha Vantage 的
INCOME_STATEMENT功能 (1次)。 - 获取资产负债表: 调用 Alpha Vantage 的
BALANCE_SHEET功能 (1次)。 - 获取现金流量表: 调用 Alpha Vantage 的
CASH_FLOW功能 (1次)。 - 获取公司概览: 调用 Alpha Vantage 的
OVERVIEW功能 (1次),用于计算市值、PE、PB等核心指标。
- 获取利润表: 调用 Alpha Vantage 的
- 数据存储 (两阶段缓存):
- 1. 原始数据缓存:
UsFetcher将API返回的原始数据保存为raw_*.csv。 - 2. 处理后数据缓存:
US_Strategy将初步处理过的数据保存为income_statement.csv等文件。
- 1. 原始数据缓存:
- 执行:
-
数据分析 (
analyze_data):- 执行:
US_Strategy实例化US_Analyzer。 - 动作:
US_Analyzer对获取的数据进行合并、列名映射和美股特定的计算逻辑。
- 执行:
-
报告生成 (
generate_report):- 调用:
US_Strategy调用US_ReportGenerator实例的generate_report方法,传递分析数据和输出路径。 - 核心动作:
US_ReportGenerator全权负责报告的生成与保存:- 生成Markdown: 调用继承自
BaseReporter的_generate_markdown_content方法创建报告内容。 - 保存Markdown: 将内容写入
data/US/{symbol}/report.md。 - 生成HTML: 使用
markdown库将内容转换为 HTML,并嵌入预设的 CSS 样式。 - 保存HTML: 将最终的 HTML 内容写入
data/US/{symbol}/report.html。
- 生成Markdown: 调用继承自
- 调用:
4. 验证计划
- 核心逻辑不变: 由于核心的数据获取和指标计算逻辑是从旧代码平移而来,其准确性得以保留。
- 结构验证:
- 中国股票: 运行
python main.py CN 600519.SH。检查程序是否无报错执行完毕,并生成data/CN/600519.SH/report.md文件。 - 香港股票: 运行
python main.py HK 00700.HK。检查程序是否无报错执行完毕,并生成data/HK/00700.HK/report.md文件。 - 美国股票: 运行
python main.py US AAPL。检查程序是否无报错执行完毕,并生成data/US/AAPL/report.md文件。 - 报告内容: 打开生成的
.md文件,确认内容与旧版报告基本一致,数据完整,格式正确。
- 中国股票: 运行