新增功能: - 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]>
26 KiB
26 KiB
A股全量数据抓取完备方案
📋 目录
数据分类与优先级
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,完全可控。
下一步行动
立即执行
- 等待日线抓取完成 (预计今晚22:00)
- 开始实施Phase 1:
- 创建扩展数据库schema
- 实现公司信息adapter
- 实现板块数据adapter
- 实现财务数据adapter
本周目标
- ✅ 完成日线数据抓取(5,498只 × 2年)
- 🎯 完成公司基础信息抓取(5,498条)
- 🎯 完成板块分类数据(~300个板块)
- 🎯 完成最近4季财报数据(~22,000条)
文档版本: v1.0 创建时间: 2025-12-21 预计完成时间: 2026-01-18 (4周)