Tortoise/doc/sidecar.md
2026-06-24 16:50:59 +08:00

2.7 KiB
Raw Permalink Blame History

Python sidecar 与 DuckDB 存储设计

目标

提供一个统一的数据获取和缓存接口,屏蔽 mootdx 与腾讯财经的字段差异,后续本地策略只依赖 UnifiedDataService 或 HTTP 接口,不直接访问外部数据源。

模块结构

  • sidecar/api.pyFastAPI HTTP 接口,提供 /health/kline/{symbol}/snapshot/{symbol}
  • sidecar/service.py:统一数据服务,负责缓存命中、远端拉取、数据源降级。
  • sidecar/storage.pyDuckDB 仓储,维护 md.kline_barsmd.snapshots
  • sidecar/sources/mootdx_source.pymootdx 适配器,负责备用 K 线、分钟线与备用快照。
  • sidecar/sources/tencent.py:腾讯财经适配器,负责日/周/月 K 线与估值字段更完整的实时快照。
  • sidecar/models.py:统一 K 线与快照模型。

数据源策略

  • K 线:day/week/month 默认优先腾讯财经,失败后回退 mootdx1m/5m/15m/30m/60m 使用 mootdx腾讯财经 K 线使用未复权接口以对齐 mootdx 原始价格。
  • 快照:默认优先腾讯财经,失败后回退 mootdx。
  • 腾讯财经字段校准:39=PE_TTM46=PB52=PE 静态43 是振幅,不作为 PB 使用。

DuckDB 缓存

  • md.kline_bars:按 symbol + period + trade_date 覆盖写入,读取时返回最近 N 条并按交易日升序排列。
  • md.snapshots:每个 symbol 只保留一条快照,使用 expires_at 控制短 TTL 缓存。
  • 默认数据库路径为 data/tortoise.duckdb,可通过 TORTOISE_DUCKDB_PATH 配置。

Python 调用示例

from sidecar.config import load_config
from sidecar.service import create_default_service

service = create_default_service(load_config())
bars = service.get_kline("600000", period="day", limit=120)
snapshot = service.get_snapshot("600000")

测试用例

  • 1-1:验证腾讯财经 PB 使用索引 46避免误用索引 43。
  • 1-2:验证腾讯财经原始响应可解析为字段列表。
  • 1-3:验证腾讯财经 K 线 JSON 可转换为统一 K 线。
  • 2-1:验证 K 线首次拉取后可从 DuckDB 缓存读取。
  • 2-2:验证快照在 TTL 内复用 DuckDB 缓存。
  • 2-3:验证日/周/月 K 线优先使用主源。
  • 2-4:验证主源异常时 K 线自动回退备用源。
  • 2-5:验证分钟周期 K 线直接使用备用源。
  • 3-4:验证 mootdx 与腾讯财经的上证指数、深证成指、创业板指 K 线价格随机 100 个 OHLC 值基本一致;成交量单位不同不参与比较。
  • 3-5:验证三大指数代表成分股贵州茅台、平安银行、宁德时代的 K 线价格随机 100 个 OHLC 值基本一致。

运行方式:

pytest