Files
claude_dev c3e53fbef3 docs(data): 归档数据层验证产物 + 数据层总览README
- scripts/data_platform/_archive/legacy/: 归档20个独立探针/诊断/旧降级脚本(零引用验证)
- docs/archive/data/: 归档17个数据相关旧设计/plan/report(保留fusion spec作深读)
- docs/data-platform/README.md: 数据层单一权威记录(8节:架构/布局/源/管线/铁律/API/缺口/待办)
- 删除 _mootdx_depth_result.txt
- Phase2待办: 15m灌库链+旧回填import链(有测试/wrapper依赖,VPS schtask确认后归档)
2026-07-29 10:11:38 +08:00

8.4 KiB
Raw Permalink Blame History

数据层总览(Data Layer

A 股量化平台 方案 A 数据层单一权威记录。采集源 → 权威存储 → Provider → 策略全链路闭环。 维护:数据 session。策略层接口对接见本文 §6;策略逻辑本身由策略 session 负责。 深读设计依据:docs/superpowers/specs/2026-07-21-data-source-fusion-design.md(§14 权威层定稿)。 历史中间设计/plan 已归档至 docs/archive/data/


1. 架构总览

采集源(VPS定时任务)          权威存储层(VPS本地)            使用层(Provider)          策略层
─────────────────         ──────────────────         ──────────────────       ─────────
baostock  ─┐                                         get_closes_panel        选股/轮动
xtdata    ─┼─► staging ─► 验证 ─► 合并 ─►  dbbardata ─►┐                     (BulletTrade
akshare   ─┤            (validator)     (merge)       ├─ LocalUnifiedProvider  三策略)
sina/东财/腾讯─┘                          constituent_unified─►┤              filters
                                          valuation_baostock ─►┼─► get_fundamentals_df
                                          三表 parquet ─►────┘   get_limit_status_batch
                                          bs_adjust_factor        ...

核心原则Provider 只读 VPS 本地数据,零 online;下载经 staging 隔离 → 验证 → 合并主库,绝不直接写主库。


2. 数据布局(VPS 本地,C:\sanguo_vnpy_v2\data\

存储 形态 内容 关键说明
dbbardataquant_trading.db SQLite 表 唯一行情表:日线(raw) + 15min 含退市股 + ETF + 北交所920schema (id,symbol,exchange,datetime,interval,volume,turnover,open_interest,open/high/low/close_price)UNIQUE (symbol,exchange,interval,datetime)WAL 模式
bs_adjust_factor SQLite 表 前复权因子 get_closes_panel(fq='qfq') asof merge
constituent_unified SQLite 表 20 指数成份股 9 宽基 + 000985 中证全指(全市场) + 000928000937 中证800十行业;was_removed 治幸存者偏差
valuation_baostock parquet/年 pe / pb / isST 2003-2026,按年
三表(akshare parquet balance(221列)/income(170列)/cashflow(316列) 财报季更新
A股日线/分钟 parquet 兜底 回测 DB 为主,parquet 兜底

⚠️ 6 位码同名碰撞000852/000905/000016/000985/000928~000937 在 SZSE 是股票、在中证是指数点位。dbbardata 用 exchange 消歧:SSE = 中证指数点位(约定),SZSE = 个股。指数点位由 sina_index_eod.py 拉取入 exchange=SSE


3. 采集源职责

职责 限制
baostock 个股日线(含退市)+ 15min + pe/pb 单进程单登录,不并发(多连接→封 IP 6-24h);日 ≤ 48000 次
xtdata(miniQMT) ETF + 基金 + 北交所 920xxx 沪深京全覆盖;volume 单位需 ×100 对齐
akshare 三表 + events + top10 股东 东财瞬时限流(断路器 + 夜间重试兜底)
sina→东财→腾讯 14 指数点位 级联,腾讯兜底 5 个 sina 停更

4. 增量管线(定时任务 schtaskVPS)

schtask 时间 职责 LOOKBACK
sanguo-bs-eod 18:05 baostock 个股日线 + 15min + pe/pb 7 天
sanguo-idx-eod 18:30 14 指数点位(sina 级联)
sanguo-ak-eod 19:00 akshare 日线静态
sanguo-ak-events 19:30 事件
sanguo-xt-eod 21:00+ ⚠️ ETF/基金/北交所920 30 天
sanguo-ak-stock 周六 个股全量(top10 等)
sanguo-ak-quarter 财报季(APR,MAY,SEP,NOV) 三表
sanguo-index 月度 16 号 19:50 成份股月度增量

⚠️ xt-eod 原 18:40 与 bs-eod 18:05 写锁重叠(WAL 单写)→ 建议 21:00+ 错峰。 sanguo-index STEP0parse_csindex_announce 回溯公告治偏差(000852/932000+ --indices 刷 11 新指数;STEP1-3 migrate→merge。 bs-eod 已修 CLOSE_WAIT 卡死(per-stock commit + _with_timeout + 周期 relogin)。


5. 工作流与铁律

下载链路(用户铁律)

下载 → staging 隔离 → validator 验证(成功率95%,扣北交所) → 合并主库 → 推 NAS

绝不直接写主库(下载质量不可控,曾出现覆盖截断整年)。

约束

  • baostock 单进程单登录不并发;日 ≤ 48000 次
  • 直连不走代理:unset http_proxy https_proxy all_proxy
  • provider 读 VPS 本地,不调 online
  • 数据层瑕疵报数据 session 根治,不在 provider 适配兜底
  • commit ≠ 部署 VPS:改完 scp 到 VPS + findstr 验证
  • VPS Windowspython -X utf8、反斜杠路径、GBK 控制台用 ASCII 脚本
  • Mac Mini 长任务前 caffeinate -i -s 防睡眠

6. Provider APILocalUnifiedProvider

读本地零 online,治偏差(成份股并集 + 前视偏差修复)。14 个公开方法:

方法 用途 备注
get_price(security, start, end, frequency, fields, count, fq) 单只行情 聚宽兼容
get_closes_panel(symbols, start, end, interval='d', fq='raw') 批量收盘价宽表 fq='qfq' 批量前复权;UNION ALL 替 OR 链(340×);chunk=4005128 只 33s
get_index_stocks(index, date) 指数成份股 读 constituent_unified
get_constituent(...) 成份股详情 治偏差
get_fundamentals_df(stocks, date, fields=None) 基本面 fields= 短路(只算所需源表)+ ThreadPool300 只 68s→7.4s9.3×)
get_value_metrics(security, date) 价值指标(单只)
get_value_metrics_batch(stocks, date) 价值指标批量 ThreadPool 包装
get_trade_days(start, end) 交易日历
get_security_info(security) 证券信息(单只)
get_security_info_batch(stocks) 证券信息批量 2 SQL 替 N×2(ST/次新过滤提速)
get_limit_status_batch(codes, date) 涨跌停/停牌批量 精确算 high_limit=round(prev_close×(1+幅度),2);板块感知(主板10/创业科创20/北交30/ST5,历史ST from valuation_baostock.isST);停牌=volume==0
get_current_tick(security) tick ⚠️ 无 last_price/high_limit 字段,filter 已改用 get_limit_status_batch
get_split_dividend(security) 拆分分红/复权因子
get_all_securities(...) 全证券列表

四轮批量接口交付commit f416a17/d2cd8fa/1cc9126):行情 get_closes_panel / 财务 get_fundamentals_df fields= / filters+价值 get_security_info_batch+get_value_metrics_batch / 涨跌停停牌 get_limit_status_batch

filterssanguo_portfolio/filters.py):filter_paused/limitup/limitdown 已接入 get_limit_status_batch(向后兼容:无参=保留全部)。


7. 已知缺口与定论

状态 定论
行业治偏差(成份股历史调整) 部分覆盖 content HTML 解析已做(was_removed 8→99,主要覆盖 2009 + 零星 2016-2022);2010-2025 定期 csindex 无存档,免费源穷尽,用户接受残留偏差(不上 wind/choice
北交所 920xxx 补全 xtdata 独占(baostock/akshare 不覆盖),39 只,volume×100 对齐
实盘标的范围 定论 只做主板 + 创业板(filter_kcbj_stock 排除科创北交,用户未开户 50 万门槛);数据层仍全量补成份股治偏差,两层解耦
行业指数点位 修复 14 指数入 exchange=SSE,策略 03 不再永远判熊
akshare 三表 鲁棒 原子写 + --repair + is_parquet_healthy

8. 待办(Phase 2,低优先)

  • 归档 15min 一次性灌库链(backfill_15min_baostock 等被 tests/data/test_backfill_15min_hardening.py import,需同步处理测试)
  • 归档旧回填 import 链 + Mac .sh 链(build_daily_from_xtdata/import_vnpy_*/raw_redownload 等被 wrapper 引用,需 VPS schtasks /query 确认非活跃后归档)
  • 行业治偏差 2010-2025(若有 wind/choice 授权再补)