Files
ljwx-stock/backend/COMPREHENSIVE_DATA_PLAN.md
brunoandClaude Sonnet 4.5 c553009853 feat: 添加全量A股数据抓取系统 v2.1.0
新增功能:
- 5个专业数据抓取器(公司信息、板块、财务、资金流、龙虎榜)
- 一键执行脚本 run_all_fetchers.sh(完整/测试/自定义三种模式)
- 扩展数据库Schema(11张新表)
- 数据源迁移至免费API(东方财富、新浪、腾讯)

数据能力:
- 公司基础信息:5,295只A股
- 板块数据:~400个板块 + 20万成分股关系
- 财务报表:利润表+资产负债表(最近4季)
- 资金流:主力资金、大单、中单、小单(700天)
- 龙虎榜:上榜记录+营业部明细(2年)
- 总数据量:~395万条记录,3-5GB存储

技术亮点:
- 断点续传支持
- UPSERT策略避免重复
- API限流控制
- 实时进度显示
- 错误容错机制
- 完整日志记录

文档更新:
- README添加"全量数据抓取"章节
- 60+页技术方案文档
- 完整的使用指南和维护文档

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
2025-12-22 08:35:43 +08:00

26 KiB
Raw Permalink Blame History

A股全量数据抓取完备方案

📋 目录

  1. 数据分类与优先级
  2. 数据源能力矩阵
  3. 数据库Schema扩展
  4. 抓取策略设计
  5. 实施路线图
  6. 技术架构

数据分类与优先级

P0: 核心交易数据(已实现/进行中)

数据类型 更新频率 数据量 状态 数据源
日线K线 每日 5,498股 × 700天 ≈ 385万条 ✅ 进行中 Sina/Tencent/EastMoney
实时行情 实时 5,498股 ⏳ 待实现 EastMoney
分钟线 实时 5,498股 × 240分/天 🔜 可选 Sina

P1: 基础信息数据(高优先级)

数据类型 更新频率 数据量 状态 数据源
公司基础信息 月度 5,498条 ⏳ 待实现 EastMoney
行业分类 季度 ~100个行业 ⏳ 待实现 EastMoney
板块分类 周度 ~300个概念板块 ⏳ 待实现 EastMoney
股票列表 周度 5,498股 ✅ 已实现 EastMoney

P1: 基本面数据(高优先级)

数据类型 更新频率 数据量 状态 数据源
财务报表 季度 5,498股 × 4季 × 10年 ≈ 22万条 ⏳ 待实现 EastMoney
财务指标 季度 同上 ⏳ 待实现 EastMoney
估值指标 每日 5,498股 × 700天 ≈ 385万条 ⏳ 待实现 EastMoney

P2: 资金流与交易数据(中优先级)

数据类型 更新频率 数据量 状态 数据源
主力资金流 每日 5,498股 × 700天 ≈ 385万条 ⏳ 待实现 EastMoney
北向资金 每日 ~700天 ⏳ 待实现 EastMoney
融资融券 每日 5,498股 × 700天 ⏳ 待实现 EastMoney
龙虎榜 不定期 ~5万条(历史) ⏳ 待实现 EastMoney

P3: 股东与机构数据(低优先级)

数据类型 更新频率 数据量 状态 数据源
十大股东 季度 5,498股 × 4季 × 10年 🔜 可选 EastMoney
十大流通股东 季度 同上 🔜 可选 EastMoney
机构持仓 季度 不定 🔜 可选 EastMoney
高管信息 半年 5,498股 × 5人/股 🔜 可选 EastMoney

数据源能力矩阵

东方财富 (EastMoney) - 主力数据源

数据类型 API端点 参数示例 数据质量
股票列表 /api/qt/clist/get fs=m:0+t:6 ⭐⭐⭐⭐⭐
实时行情 /api/qt/stock/get secid=1.600000 ⭐⭐⭐⭐⭐
历史K线 /api/qt/stock/kline/get secid=1.600000&klt=101 ⭐⭐⭐⭐
资金流向 /api/qt/stock/fflow/kline/get secid=1.600000&klt=1 ⭐⭐⭐⭐⭐
财务数据 /PC_HSF10/NewFinanceAnalysis/ code=SH600000 ⭐⭐⭐⭐
公司信息 /PC_HSF10/CompanySurvey/ code=SH600000 ⭐⭐⭐⭐⭐
板块数据 /api/qt/clist/get fs=m:90+t:2 ⭐⭐⭐⭐⭐
龙虎榜 /securities/api/data/v1/get reportName=RPT_DAILYBILLBOARD_DETAILS ⭐⭐⭐⭐
十大股东 /PC_HSF10/ShareholderResearch/ code=SH600000 ⭐⭐⭐⭐

新浪财经 (Sina) - 辅助数据源

数据类型 API端点 数据质量
实时行情 /list= ⭐⭐⭐⭐
历史K线 /MoneyFlow/CapitalFlow ⭐⭐⭐
分钟线 /js?list= ⭐⭐⭐

腾讯财经 (Tencent) - 备用数据源

数据类型 API端点 数据质量
历史K线 /q= ⭐⭐⭐⭐
实时行情 /v= ⭐⭐⭐

数据库Schema扩展

新增表设计

1. 板块数据表

-- 板块基础信息
CREATE TABLE IF NOT EXISTS t_sector_info (
    id SERIAL PRIMARY KEY,
    sector_code VARCHAR(20) UNIQUE NOT NULL,  -- 板块代码
    sector_name VARCHAR(100) NOT NULL,        -- 板块名称
    sector_type VARCHAR(20),                  -- 类型:行业/概念/地域
    parent_code VARCHAR(20),                  -- 父级板块代码
    level INT DEFAULT 1,                      -- 层级
    description TEXT,                         -- 板块描述
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW()
);

-- 板块成分股
CREATE TABLE IF NOT EXISTS t_sector_constituents (
    id BIGSERIAL PRIMARY KEY,
    sector_code VARCHAR(20) NOT NULL,         -- 板块代码
    symbol VARCHAR(10) NOT NULL,              -- 股票代码
    in_date DATE,                             -- 加入日期
    out_date DATE,                            -- 移出日期(NULL表示仍在板块中)
    weight NUMERIC(10,4),                     -- 权重(如果有)
    created_at TIMESTAMP DEFAULT NOW(),
    UNIQUE(sector_code, symbol, in_date)
);

-- 板块日线行情
CREATE TABLE IF NOT EXISTS t_sector_daily (
    id BIGSERIAL PRIMARY KEY,
    sector_code VARCHAR(20) NOT NULL,
    trade_date DATE NOT NULL,
    open NUMERIC(12,3),
    high NUMERIC(12,3),
    low NUMERIC(12,3),
    close NUMERIC(12,3),
    change_pct NUMERIC(10,3),
    volume BIGINT,
    amount NUMERIC(20,2),
    turnover_rate NUMERIC(10,3),
    leader_symbol VARCHAR(10),                -- 板块龙头股票
    created_at TIMESTAMP DEFAULT NOW(),
    UNIQUE(sector_code, trade_date)
);

CREATE INDEX idx_sector_daily_code_date ON t_sector_daily(sector_code, trade_date DESC);
CREATE INDEX idx_sector_constituents_code ON t_sector_constituents(sector_code);
CREATE INDEX idx_sector_constituents_symbol ON t_sector_constituents(symbol);

2. 资金流数据表

-- 个股资金流
CREATE TABLE IF NOT EXISTS t_money_flow (
    id BIGSERIAL PRIMARY KEY,
    symbol VARCHAR(10) NOT NULL,
    trade_date DATE NOT NULL,

    -- 主力资金
    main_net_inflow NUMERIC(20,2),           -- 主力净流入(元)
    main_net_inflow_rate NUMERIC(10,3),     -- 主力净流入占比(%)

    -- 超大单(>=100万)
    xlarge_net_inflow NUMERIC(20,2),
    xlarge_buy_amount NUMERIC(20,2),
    xlarge_sell_amount NUMERIC(20,2),

    -- 大单(20万-100万)
    large_net_inflow NUMERIC(20,2),
    large_buy_amount NUMERIC(20,2),
    large_sell_amount NUMERIC(20,2),

    -- 中单(4万-20万)
    medium_net_inflow NUMERIC(20,2),
    medium_buy_amount NUMERIC(20,2),
    medium_sell_amount NUMERIC(20,2),

    -- 小单(<4万)
    small_net_inflow NUMERIC(20,2),
    small_buy_amount NUMERIC(20,2),
    small_sell_amount NUMERIC(20,2),

    created_at TIMESTAMP DEFAULT NOW(),
    UNIQUE(symbol, trade_date)
);

CREATE INDEX idx_money_flow_symbol_date ON t_money_flow(symbol, trade_date DESC);
CREATE INDEX idx_money_flow_main_inflow ON t_money_flow(main_net_inflow DESC, trade_date DESC);

-- 北向资金(沪深港通)
CREATE TABLE IF NOT EXISTS t_northbound_flow (
    id BIGSERIAL PRIMARY KEY,
    symbol VARCHAR(10) NOT NULL,
    trade_date DATE NOT NULL,

    net_buy_amount NUMERIC(20,2),           -- 净买入金额(元)
    buy_amount NUMERIC(20,2),               -- 买入金额
    sell_amount NUMERIC(20,2),              -- 卖出金额
    total_shares NUMERIC(20,2),             -- 持股数量(股)
    shareholding_ratio NUMERIC(10,4),       -- 持股比例(%)

    created_at TIMESTAMP DEFAULT NOW(),
    UNIQUE(symbol, trade_date)
);

CREATE INDEX idx_northbound_symbol_date ON t_northbound_flow(symbol, trade_date DESC);

3. 龙虎榜数据表

-- 龙虎榜汇总
CREATE TABLE IF NOT EXISTS t_top_list (
    id BIGSERIAL PRIMARY KEY,
    symbol VARCHAR(10) NOT NULL,
    trade_date DATE NOT NULL,

    reason VARCHAR(200),                    -- 上榜原因
    reason_type VARCHAR(50),                -- 原因类型:涨跌幅/振幅/换手率

    close NUMERIC(12,3),                    -- 收盘价
    change_pct NUMERIC(10,3),               -- 涨跌幅
    turnover_rate NUMERIC(10,3),            -- 换手率

    total_buy_amount NUMERIC(20,2),         -- 龙虎榜总买入(元)
    total_sell_amount NUMERIC(20,2),        -- 龙虎榜总卖出(元)
    net_amount NUMERIC(20,2),               -- 净买入(元)

    buy_seat_count INT,                     -- 买入席位数
    sell_seat_count INT,                    -- 卖出席位数

    created_at TIMESTAMP DEFAULT NOW(),
    UNIQUE(symbol, trade_date)
);

-- 龙虎榜营业部明细
CREATE TABLE IF NOT EXISTS t_top_list_detail (
    id BIGSERIAL PRIMARY KEY,
    symbol VARCHAR(10) NOT NULL,
    trade_date DATE NOT NULL,

    seat_name VARCHAR(200),                 -- 营业部名称
    direction VARCHAR(10),                  -- buy/sell
    buy_amount NUMERIC(20,2),               -- 买入金额
    sell_amount NUMERIC(20,2),              -- 卖出金额
    net_amount NUMERIC(20,2),               -- 净买入

    rank INT,                               -- 排名

    created_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_top_list_symbol_date ON t_top_list(symbol, trade_date DESC);
CREATE INDEX idx_top_list_detail_symbol_date ON t_top_list_detail(symbol, trade_date DESC);
CREATE INDEX idx_top_list_detail_seat ON t_top_list_detail(seat_name, trade_date DESC);

4. 财务报表数据表

-- 利润表
CREATE TABLE IF NOT EXISTS t_income_statement (
    id BIGSERIAL PRIMARY KEY,
    symbol VARCHAR(10) NOT NULL,
    report_date DATE NOT NULL,              -- 报告期(2024-09-30)
    publish_date DATE,                      -- 发布日期
    report_type VARCHAR(20),                -- 1Q/2Q/3Q/4Q/年报

    -- 营收相关
    total_revenue NUMERIC(20,2),            -- 营业总收入
    operating_revenue NUMERIC(20,2),        -- 营业收入
    other_revenue NUMERIC(20,2),            -- 其他业务收入

    -- 成本相关
    total_cost NUMERIC(20,2),               -- 营业总成本
    operating_cost NUMERIC(20,2),           -- 营业成本
    sales_expense NUMERIC(20,2),            -- 销售费用
    admin_expense NUMERIC(20,2),            -- 管理费用
    finance_expense NUMERIC(20,2),          -- 财务费用
    rd_expense NUMERIC(20,2),               -- 研发费用

    -- 利润相关
    operating_profit NUMERIC(20,2),         -- 营业利润
    total_profit NUMERIC(20,2),             -- 利润总额
    net_profit NUMERIC(20,2),               -- 净利润
    net_profit_parent NUMERIC(20,2),        -- 归母净利润

    -- 每股指标
    eps NUMERIC(10,4),                      -- 每股收益(元)
    bps NUMERIC(10,4),                      -- 每股净资产(元)

    created_at TIMESTAMP DEFAULT NOW(),
    UNIQUE(symbol, report_date)
);

-- 资产负债表
CREATE TABLE IF NOT EXISTS t_balance_sheet (
    id BIGSERIAL PRIMARY KEY,
    symbol VARCHAR(10) NOT NULL,
    report_date DATE NOT NULL,
    publish_date DATE,
    report_type VARCHAR(20),

    -- 资产
    total_assets NUMERIC(20,2),             -- 总资产
    current_assets NUMERIC(20,2),           -- 流动资产
    noncurrent_assets NUMERIC(20,2),        -- 非流动资产

    cash NUMERIC(20,2),                     -- 货币资金
    accounts_receivable NUMERIC(20,2),      -- 应收账款
    inventory NUMERIC(20,2),                -- 存货
    fixed_assets NUMERIC(20,2),             -- 固定资产
    intangible_assets NUMERIC(20,2),        -- 无形资产

    -- 负债
    total_liabilities NUMERIC(20,2),        -- 总负债
    current_liabilities NUMERIC(20,2),      -- 流动负债
    noncurrent_liabilities NUMERIC(20,2),   -- 非流动负债

    short_term_debt NUMERIC(20,2),          -- 短期借款
    long_term_debt NUMERIC(20,2),           -- 长期借款

    -- 股东权益
    total_equity NUMERIC(20,2),             -- 股东权益合计
    parent_equity NUMERIC(20,2),            -- 归母股东权益

    created_at TIMESTAMP DEFAULT NOW(),
    UNIQUE(symbol, report_date)
);

-- 现金流量表
CREATE TABLE IF NOT EXISTS t_cashflow_statement (
    id BIGSERIAL PRIMARY KEY,
    symbol VARCHAR(10) NOT NULL,
    report_date DATE NOT NULL,
    publish_date DATE,
    report_type VARCHAR(20),

    -- 经营活动
    operating_cashflow NUMERIC(20,2),       -- 经营活动现金流
    operating_cash_in NUMERIC(20,2),        -- 经营活动现金流入
    operating_cash_out NUMERIC(20,2),       -- 经营活动现金流出

    -- 投资活动
    investing_cashflow NUMERIC(20,2),       -- 投资活动现金流
    investing_cash_in NUMERIC(20,2),
    investing_cash_out NUMERIC(20,2),

    -- 筹资活动
    financing_cashflow NUMERIC(20,2),       -- 筹资活动现金流
    financing_cash_in NUMERIC(20,2),
    financing_cash_out NUMERIC(20,2),

    -- 现金及等价物净增加
    net_cashflow NUMERIC(20,2),

    created_at TIMESTAMP DEFAULT NOW(),
    UNIQUE(symbol, report_date)
);

CREATE INDEX idx_income_symbol_date ON t_income_statement(symbol, report_date DESC);
CREATE INDEX idx_balance_symbol_date ON t_balance_sheet(symbol, report_date DESC);
CREATE INDEX idx_cashflow_symbol_date ON t_cashflow_statement(symbol, report_date DESC);

5. 公司信息扩展表

-- 公司基础信息扩展
CREATE TABLE IF NOT EXISTS t_company_info (
    id SERIAL PRIMARY KEY,
    symbol VARCHAR(10) UNIQUE NOT NULL,

    -- 基础信息
    full_name VARCHAR(200),                 -- 公司全称
    english_name VARCHAR(200),              -- 英文名称
    legal_representative VARCHAR(50),       -- 法定代表人

    -- 主营业务
    main_business TEXT,                     -- 主营业务
    business_scope TEXT,                    -- 经营范围

    -- 行业分类
    industry_csrc VARCHAR(100),             -- 证监会行业
    industry_sw_l1 VARCHAR(100),            -- 申万一级行业
    industry_sw_l2 VARCHAR(100),            -- 申万二级行业
    industry_sw_l3 VARCHAR(100),            -- 申万三级行业

    -- 上市信息
    list_date DATE,                         -- 上市日期
    list_board VARCHAR(20),                 -- 上市板块:主板/创业板/科创板
    exchange VARCHAR(10),                   -- 交易所:SH/SZ

    -- 注册信息
    register_address VARCHAR(200),          -- 注册地址
    office_address VARCHAR(200),            -- 办公地址
    zipcode VARCHAR(10),
    website VARCHAR(200),
    email VARCHAR(100),

    -- 股本信息
    total_capital NUMERIC(20,2),            -- 总股本(股)
    float_capital NUMERIC(20,2),            -- 流通股本(股)

    -- 状态
    is_active BOOLEAN DEFAULT TRUE,
    delist_date DATE,                       -- 退市日期

    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_company_industry ON t_company_info(industry_sw_l1);
CREATE INDEX idx_company_board ON t_company_info(list_board);

抓取策略设计

策略1: 增量抓取

适用数据: 日线、资金流、龙虎榜

def incremental_fetch_strategy():
    """
    增量抓取策略
    - 每天抓取最新一天的数据
    - 检查缺失日期,补充历史数据
    """
    # 1. 获取最新交易日
    latest_trade_date = get_latest_trade_date()

    # 2. 检查数据库中已有的最新日期
    db_latest_date = get_db_latest_date(table='daily_quotes')

    # 3. 如果有缺失,抓取缺失区间
    if db_latest_date < latest_trade_date:
        fetch_date_range(db_latest_date + 1, latest_trade_date)

    # 4. 每日定时任务
    schedule_daily_task(time='15:30')  # 收盘后半小时

策略2: 批量抓取

适用数据: 财务报表、公司信息

def batch_fetch_strategy():
    """
    批量抓取策略
    - 按季度抓取财报
    - 按股票分批,避免API限流
    """
    # 1. 获取所有股票列表
    all_stocks = get_all_stocks()

    # 2. 分批抓取(每批100只)
    batch_size = 100
    for i in range(0, len(all_stocks), batch_size):
        batch = all_stocks[i:i+batch_size]
        fetch_financial_data(batch, report_periods)
        time.sleep(1)  # 避免限流

策略3: 优先级抓取

适用数据: 全量历史数据

def priority_fetch_strategy():
    """
    优先级抓取策略
    - P0: 大盘股、行业龙头
    - P1: 中盘股
    - P2: 小盘股
    """
    # 按市值排序
    stocks = get_stocks_by_market_cap()

    # 优先抓取大盘股
    large_cap = stocks[:500]   # 前500只
    mid_cap = stocks[500:2000] # 500-2000
    small_cap = stocks[2000:]  # 其余

    for group in [large_cap, mid_cap, small_cap]:
        fetch_all_data(group)

策略4: 故障重试

def retry_strategy(max_retries=3):
    """
    重试策略
    - 失败自动重试
    - 指数退避
    """
    for attempt in range(max_retries):
        try:
            fetch_data()
            break
        except Exception as e:
            wait_time = 2 ** attempt  # 1, 2, 4, 8...
            time.sleep(wait_time)
            if attempt == max_retries - 1:
                log_failed_task()

实施路线图

Phase 1: 核心数据(1-2周)

Week 1:

  • ✅ 日线数据抓取(进行中)
  • 🎯 公司基础信息
  • 🎯 板块分类数据

Week 2:

  • 🎯 基本面财务数据(最近4季)
  • 🎯 估值指标(PE/PB/PS)

产出:

  • 数据表: t_company_info, t_sector_info, t_income_statement
  • 数据量: ~385万条日线 + 5,498条公司信息 + ~2万条财报

Phase 2: 资金流数据(1周)

Week 3:

  • 🎯 主力资金流(历史2年)
  • 🎯 北向资金
  • 🎯 龙虎榜数据

产出:

  • 数据表: t_money_flow, t_northbound_flow, t_top_list
  • 数据量: ~385万条资金流 + ~5万条龙虎榜

Phase 3: 股东与机构(可选)

Week 4:

  • 🔜 十大股东
  • 🔜 高管信息
  • 🔜 机构调研

技术架构

架构图

┌─────────────────────────────────────────────────────────────┐
│                    数据抓取调度层                              │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐   │
│  │日线任务   │  │财报任务   │  │资金流任务 │  │龙虎榜任务 │   │
│  │(每日15:30)│  │(季度更新) │  │(每日16:00)│  │(每日17:00)│   │
│  └─────┬────┘  └─────┬────┘  └─────┬────┘  └─────┬────┘   │
└────────┼─────────────┼─────────────┼─────────────┼─────────┘
         │             │             │             │
         ▼             ▼             ▼             ▼
┌─────────────────────────────────────────────────────────────┐
│                    数据适配层                                  │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐     │
│  │EastMoney     │  │Sina          │  │Tencent       │     │
│  │Adapter       │  │Adapter       │  │Adapter       │     │
│  └──────┬───────┘  └──────┬───────┘  └──────┬───────┘     │
└─────────┼──────────────────┼──────────────────┼─────────────┘
          │                  │                  │
          ▼                  ▼                  ▼
┌─────────────────────────────────────────────────────────────┐
│                    数据清洗与存储层                            │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐     │
│  │数据验证       │  │数据去重       │  │数据标准化     │     │
│  └──────┬───────┘  └──────┬───────┘  └──────┬───────┘     │
│         └──────────────────┼──────────────────┘             │
│                            ▼                                │
│                    ┌──────────────┐                         │
│                    │PostgreSQL     │                         │
│                    │+ Redis Cache  │                         │
│                    └──────────────┘                         │
└─────────────────────────────────────────────────────────────┘

核心模块

1. 统一抓取框架 (DataFetchFramework)

class DataFetchFramework:
    """统一数据抓取框架"""

    def __init__(self):
        self.adapters = {
            'eastmoney': EastMoneyAdapter(),
            'sina': SinaAdapter(),
            'tencent': TencentAdapter()
        }
        self.db = DatabaseManager()
        self.cache = CacheManager()

    def fetch_with_fallback(self, data_type, symbols, source_priority):
        """
        带降级的数据抓取
        - 主数据源失败时自动切换到备用数据源
        """
        for source in source_priority:
            try:
                adapter = self.adapters[source]
                data = adapter.fetch(data_type, symbols)
                return data
            except Exception as e:
                logger.warning(f"{source} failed: {e}, trying next...")
        raise DataFetchError("All sources failed")

    def validate_and_save(self, data, table_name):
        """
        数据验证与保存
        - 检查必填字段
        - 去重
        - 批量插入
        """
        validated_data = self.validate(data)
        deduplicated_data = self.deduplicate(validated_data, table_name)
        self.db.bulk_insert(table_name, deduplicated_data)

2. 任务调度器 (TaskScheduler)

class TaskScheduler:
    """任务调度器"""

    def __init__(self):
        self.tasks = []

    def add_daily_task(self, task_func, schedule_time):
        """添加每日任务"""
        schedule.every().day.at(schedule_time).do(task_func)

    def add_weekly_task(self, task_func, day_of_week):
        """添加每周任务"""
        getattr(schedule.every(), day_of_week).do(task_func)

    def run(self):
        """运行调度器"""
        while True:
            schedule.run_pending()
            time.sleep(60)

3. 进度追踪器 (ProgressTracker)

class ProgressTracker:
    """进度追踪器"""

    def track_progress(self, task_name, total, completed, failed):
        """记录进度"""
        self.db.execute("""
            INSERT INTO t_data_fetch_logs
            (task_name, records_fetched, records_saved, records_failed)
            VALUES (%s, %s, %s, %s)
        """, (task_name, total, completed, failed))

    def get_task_status(self, task_name):
        """获取任务状态"""
        return self.db.query("""
            SELECT * FROM t_data_fetch_logs
            WHERE task_name = %s
            ORDER BY created_at DESC
            LIMIT 1
        """, (task_name,))

数据质量保证

1. 数据验证规则

VALIDATION_RULES = {
    'daily_quotes': {
        'required_fields': ['symbol', 'trade_date', 'close'],
        'range_checks': {
            'close': (0, 10000),      # 价格范围
            'volume': (0, 1e12),      # 成交量范围
            'change_pct': (-20, 20)   # 涨跌幅范围
        }
    },
    'money_flow': {
        'required_fields': ['symbol', 'trade_date', 'main_net_inflow'],
        'consistency_checks': [
            'xlarge + large + medium + small = total'
        ]
    }
}

2. 数据监控告警

def data_quality_monitor():
    """数据质量监控"""
    # 检查数据完整性
    missing_dates = check_missing_dates('daily_quotes')
    if missing_dates:
        alert(f"Missing {len(missing_dates)} trading days")

    # 检查异常值
    outliers = detect_outliers('daily_quotes', 'change_pct')
    if outliers:
        alert(f"Found {len(outliers)} outliers")

    # 检查数据新鲜度
    latest_date = get_latest_date('daily_quotes')
    if (datetime.now().date() - latest_date).days > 1:
        alert("Data is outdated")

预估数据量与存储

存储容量规划

数据类型 记录数 单条大小 总大小 保留期
日线数据 385万 200B ~770MB 永久
分钟线 5.3亿/年 100B ~53GB/年 1年
财务数据 22万 500B ~110MB 永久
资金流 385万 300B ~1.2GB 永久
龙虎榜 5万 400B ~20MB 永久
公司信息 5,498 1KB ~5.5MB 永久
板块数据 ~1万 200B ~2MB 永久
合计 - - ~3GB -

结论: 不包含分钟线的情况下,总存储约 3-5GB,完全可控。


下一步行动

立即执行

  1. 等待日线抓取完成 (预计今晚22:00)
  2. 开始实施Phase 1:
    • 创建扩展数据库schema
    • 实现公司信息adapter
    • 实现板块数据adapter
    • 实现财务数据adapter

本周目标

  • ✅ 完成日线数据抓取(5,498只 × 2年)
  • 🎯 完成公司基础信息抓取(5,498条)
  • 🎯 完成板块分类数据(~300个板块)
  • 🎯 完成最近4季财报数据(~22,000条)

文档版本: v1.0 创建时间: 2025-12-21 预计完成时间: 2026-01-18 (4周)