feat: QMT Bridge 设为主数据源,新增指数日K支持及数据源文档

- QmtBridgeSource: provides 增加 index_daily,新增 fetch_index_daily 方法
- task_kline_index: 优先级改为 qmt_bridge → mairui → sina 三级降级
- task_kline_5min: 优先用 qmt_bridge,不可用时降级 mairui
- task_kline_daily: 优先级加入 qmt_bridge(首位)
- config: 新增 qmt_bridge_url 配置项
- registry: qmt_bridge 注册信息同步更新
- docs: 新增 DATASETS_AND_SOURCES.md,完整说明数据集与数据源依赖关系
- AGENTS.md: 同步更新指数数据源描述
This commit is contained in:
gao
2026-07-23 23:39:59 +08:00
parent 4516f6d75a
commit daef609e8b
9 changed files with 448 additions and 21 deletions
+152
View File
@@ -0,0 +1,152 @@
# 数据集与数据源依赖说明
> 本文档列出项目同步的全部数据集、各数据集依赖的数据源及优先级,
> 以及数据集之间的上下游依赖关系。
---
## 一、数据集总览
项目目前定义 **12 个同步数据集**,按类型分为原始源(依赖外部 API)和衍生源(本地计算)。
### 1.1 原始源
| 数据集 ID | 目标表 | 说明 | 数据源与优先级 |
|---|---|---|---|
| `stock_basic` | `market_data.stocks` | 全市场 A 股代码/名称/交易所/上市状态 + 股本快照(雪球) | **Baostock** `query_stock_basic`(主)→ 麦蕊 `/hslt/list`(备) |
| `kline_daily` | `market_data.kline_stock` | 全市场日 K OHLCV | **QMT Bridge** `/kline?period=1d`(主)→ **麦蕊** `hsstock/history/*/d/n`**雪球** `kline`**新浪** `getKLineData`per-stock 逐级 fallback |
| `kline_index` | `market_data.kline_index` + `indices` | 上证/深证/创业板/沪深300/中证500/中证1000 日线 | **QMT Bridge** `/kline?period=1d`(主)→ **麦蕊** `hsindex/history`**新浪** 指数日 K |
| `kline_5min` | `market_data.kline_5min` | 全市场 5 分钟 K 线 | **QMT Bridge** `/kline?period=5m`(主)→ **麦蕊** `hsstock/history/*/5/n`(备) |
| `tick_trade` | `market_data.tick_trade` | 当天逐笔成交(每日 21:00 发布) | **麦蕊** `hsrl/zbjy`(唯一) |
| `moneyflow` | `market_data.moneyflow` | 个股资金流(每日 21:30 发布,21:35 触发) | **麦蕊** `hsstock/history/transaction`(唯一) |
| `longhubang` | `market_data.longhubang_daily` + `longhubang_seat` | 龙虎榜聚合层 + 席位层(每日 22:00 触发) | **akshare** `stock_lhb_detail_em` + `stock_lhb_stock_detail_em`(东方财富封装,无替代源) |
| `stock_node` | `market_data.node_categories` + `nodes` + `stock_node_map` | 股票-指数/行业/概念映射(每周六 11:30) | **麦蕊** `/hszg/{list,gg,zg}`(唯一) |
| `mairui_indicators` | `market_data.kline_stock_macd_daily` + `kdj_daily` + `boll_daily` | MACD/KDJ/BOLL 日频技术指标(每日 16:40 增量) | **麦蕊** `/hsstock/history/{macd,kdj,boll}/{symbol}/d/n`(唯一) |
| `share_snapshot` | `market_data.stocks.total_share/float_share` + `share` 表 | 全市场股本快照(雪球 `quote_detail`,需 `XUEQIU_TOKEN` | **雪球** `quote_detail`(唯一) |
### 1.2 衍生源(本地计算,无外部接口)
| 数据集 ID | 目标表 | 说明 | 上游依赖 |
|---|---|---|---|
| `market_regime` | `market_data.market_regime_daily` | 涨跌家数 / advance_ratio / 恐慌标记 | **`kline_daily`**(本地 `kline_stock` 聚合) |
| `mairui_ma_daily` | `market_data.kline_stock_ma_daily` | MA5/10/20/60 均线 | **`kline_daily`**(本地 `kline_stock.close` 计算) |
> 注:`mairui_ma_daily` 本可走麦蕊 `/hsdata` 端点,但免费 licence 返回"数据不存在",故改为本地计算。
---
## 二、数据源总览
项目注册了 **6 个数据源**,各有 credential 要求和提供的能力。
| 数据源 Key | 名称 | 需凭证 | 提供能力 | 特性 |
|---|---|---|---|---|
| `datasource_qmt_bridge` | QMT Bridge(本地行情桥) | 否 | `kline_daily`, `kline_5min`, `index_daily` | 本地 xtquant HTTP 桥,免限速,低延迟,局域网 |
| `datasource_mairui` | 麦蕊智数(mairui.club | 需 `MAIRUI_LICENCE` | `kline_daily`, `kline_5min`, `index_daily`, `stock_basic`, `moneyflow`, `tick_trade`, `stock_node`, `indicator_daily` | 数据最全,免费 licence 1 分钟 300 次 |
| `datasource_xinlang` | 新浪财经 | 否 | `kline_daily`, `index_daily` | 免费,RPS 3/s 限流 |
| `datasource_baostock` | Baostock | 否 | `kline_daily`, `stock_basic`, `industry` | 免费,基础信息 + 行业映射 |
| `datasource_xueqiu` | 雪球 | 需 `XUEQIU_TOKEN` | `kline_daily`, `share` | 股本快照 + K 线复核 |
| `datasource_akshare_lhb` | akshare 龙虎榜(东方财富) | 否 | `longhubang_daily`, `longhubang_seat` | 龙虎榜唯一源 |
---
## 三、数据依赖关系
### 3.1 依赖拓扑图
```
stock_basic (Baostock + 雪球)
├── kline_daily (QMT Bridge → 麦蕊 → 雪球 → 新浪)
│ ├── market_regime (衍生:本地 kline_stock 聚合)
│ └── mairui_ma_daily (衍生:本地 kline_stock.close 计算)
├── kline_5min (QMT Bridge → 麦蕊)
├── tick_trade (麦蕊)
├── moneyflow (麦蕊)
├── longhubang (akshare/东财)
├── stock_node (麦蕊)
└── share_snapshot (雪球)
kline_index (QMT Bridge → 麦蕊 → 新浪) — 独立,无上游依赖
```
### 3.2 依赖表
| 数据集 | 直接上游依赖 | 依赖说明 |
|---|---|---|
| `stock_basic` | 无 | 根任务,提供股票代码列表 |
| `kline_daily` | `stock_basic` | 依赖股票列表决定拉取范围 |
| `kline_index` | 无 | 独立运行,不依赖股票列表 |
| `kline_5min` | `stock_basic` | 依赖股票列表决定拉取范围 |
| `tick_trade` | `stock_basic` | 同上 |
| `moneyflow` | `stock_basic` | 同上 |
| `longhubang` | `stock_basic` | 同上 |
| `stock_node` | `stock_basic` | 同上 |
| `mairui_indicators` | `stock_basic` | 同上 |
| `share_snapshot` | `stock_basic` | 同上 |
| `market_regime` | `kline_daily` | 需 `kline_stock` 数据完整 |
| `mairui_ma_daily` | `kline_daily` | 需 `kline_stock.close` 数据完整 |
---
## 四、默认调度时间(工作日)
| 时间 | 数据集 | 备注 |
|---|---|---|
| 09:00 | `stock_basic` | 开盘前刷新 |
| 15:30 | `kline_index` | 指数日线 |
| 15:40 | `kline_daily` | 个股日线 |
| 16:00 | `kline_5min` | 5 分钟线 |
| 15:15 | `market_regime` | 市场情绪 |
| 16:30 | `mairui_ma_daily` | MA 均线 |
| 16:40 | `mairui_indicators` | MACD/KDJ/BOLL |
| 21:35 | `moneyflow` | 资金流(等 21:30 发布) |
| 22:00 | `longhubang` | 龙虎榜 |
| 周六 11:30 | `stock_node` | 节点映射 |
| 周六 11:30 | `share_snapshot` | 股本快照(周度) |
---
## 五、数据回填级联规则
> 上游数据被回填或修复后,下游依赖它的衍生数据集必须手动/自动重跑,
> 否则会出现"上游新、下游旧"的不一致。
| 上游任务/表 | 触发条件 | 必须重跑的下游任务 |
|---|---|---|
| `kline_daily` / `kline_stock` | 回填历史 K 线、修复错误日线、补充漏掉的股票/日期 | `market_regime``mairui_ma_daily` |
| `stock_basic` / `stocks` | 新上市/退市、代码变更、上市状态修正 | `kline_daily``kline_5min``tick_trade``moneyflow``longhubang``stock_node``share_snapshot` |
| `kline_stock`(任意核心字段修复) | close/volume 等核心字段修正 | `market_regime``mairui_ma_daily` |
**操作建议:**
- 单次少量回填(如几只股票、几天):用 CLI 参数指定 `codes` / `start` / `end`,然后按上表手动触发下游。
- 大量回填(如全市场、多月/多年历史):先跑上游,再按依赖链顺序跑下游;必要时禁用当日独立 timer,避免与 runall 并发。
- 每日巡检 `bin/daily_sync_check.py` 已增加数据一致性检查:对比 `kline_stock``kline_stock_ma_daily``market_regime_daily` 的最新日期与缺失行数,发现缺口即告警。
---
## 六、数据源降级策略
各同步任务在代码中定义了具体的降级逻辑:
| 任务 | 降级链 | 降级触发条件 |
|---|---|---|
| `kline_daily` | QMT Bridge → 麦蕊 → 雪球 → 新浪 | per-stock 逐级 fallback,雪球失败自动降级到麦蕊/新浪 |
| `kline_index` | QMT Bridge → 麦蕊 → 新浪 | 选第一个 `is_source_ready` 通过的源 |
| `kline_5min` | QMT Bridge → 麦蕊 | bridge 不可用时检查 mairui 是否就绪 |
| `tick_trade` | 仅麦蕊 | 外层 FETCH_HARD_TIMEOUT=120s 防止永久挂起 |
| `moneyflow` | 仅麦蕊 | 唯一源 |
| `longhubang` | 仅 akshare | 唯一源,无替代 |
| `stock_node` | 仅麦蕊 | 唯一源 |
| `stock_basic` | Baostock(主)→ 麦蕊(备) | Baostock 失败时切换 |
| `mairui_indicators` | 仅麦蕊 | 唯一源 |
---
## 七、数据源健康检查
系统通过 `app/core/datasource/registry.py` 维护数据源健康状态:
- **周期检查**:后台线程每 30 分钟对所有注册数据源执行一次 `health_check()`
- **`is_source_ready()`**:综合判断凭证是否配置 + `is_available()` 是否通过 + 最近健康检查是否成功,返回 `(bool, reason)`
- **`pick_source(capability)`**:遍历注册表,返回第一个 `is_source_ready()` 通过且提供该能力的数据源。