股票市场数据源

📎 引用文件

本文引用的文件 - agent/backtest/loaders/yahoo_loader.py - agent/backtest/loaders/yahoo_client.py - agent/backtest/loaders/tushare.py - agent/backtest/loaders/eastmoney_loader.py - agent/backtest/loaders/eastmoney_client.py - agent/backtest/loaders/akshare_loader.py - agent/backtest/loaders/baostock_loader.py - agent/backtest/loaders/cn_adjust.py - agent/backtest/loaders/base.py - agent/backtest/loaders/registry.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能与并发优化
  8. 故障排查指南
  9. 结论
  10. 附录:多市场同步最佳实践

简介

本文件面向 Vibe-Trading 的股票市场数据源集成,覆盖 Yahoo Finance、Tushare、东方财富、AKShare、BaoStock 等主流数据源的实现细节。重点说明各数据源的认证方式、数据格式差异、时区处理、复权因子计算逻辑;并给出获取策略、频率限制、错误恢复机制;以及 A 股、美股、港股等多市场数据同步的最佳实践(一致性保证与增量更新)。最后提供常见问题诊断方法与性能调优建议(连接池、缓存、并发控制)。

项目结构

数据源以“加载器(Loader)+ 客户端(Client)”的层次组织: - Loader:负责将外部数据源映射为统一的 OHLCV DataFrame(trade_date 索引 + open/high/low/close/volume),并封装日期校验、缓存、重试等通用逻辑。 - Client:封装特定数据源的 HTTP/TCP 协议、鉴权、符号解析、节流等底层细节。 - Registry:维护市场到数据源的降级链(fallback chain),自动选择可用数据源。 - Base:提供统一的数据验证、重试预算、本地 Parquet 缓存等基础设施。

graph TB subgraph "加载器层" YL["Yahoo Loader"] TS["Tushare Loader"] EM["Eastmoney Loader"] AK["AKShare Loader"] BS["BaoStock Loader"] end subgraph "客户端层" YC["Yahoo Client"] EC["Eastmoney Client"] end subgraph "基础设施" REG["Registry(降级链)"] BASE["Base(校验/重试/缓存)"] ADJ["CN Adjust(前复权)"] end YL --> YC EM --> EC TS --> ADJ YL --> BASE TS --> BASE EM --> BASE AK --> BASE BS --> BASE REG --> YL REG --> TS REG --> EM REG --> AK REG --> BS

图表来源 - agent/backtest/loaders/yahoo_loader.py:173-271 - agent/backtest/loaders/yahoo_client.py:156-205 - agent/backtest/loaders/tushare.py:116-202 - agent/backtest/loaders/eastmoney_loader.py:51-143 - agent/backtest/loaders/eastmoney_client.py:208-325 - agent/backtest/loaders/akshare_loader.py:74-157 - agent/backtest/loaders/baostock_loader.py:32-108 - agent/backtest/loaders/cn_adjust.py:27-78 - agent/backtest/loaders/base.py:31-119 - agent/backtest/loaders/registry.py:136-155

章节来源 - agent/backtest/loaders/registry.py:136-155 - agent/backtest/loaders/base.py:31-119

核心组件

章节来源 - agent/backtest/loaders/base.py:122-236 - agent/backtest/loaders/base.py:243-439 - agent/backtest/loaders/registry.py:136-155

架构总览

下图展示从调用方到具体数据源的请求路径,包括符号路由、客户端节流、数据标准化与缓存。

sequenceDiagram participant Caller as "调用方" participant Reg as "Registry" participant Ldr as "DataLoader" participant Cli as "Client" participant Cache as "本地缓存" participant API as "外部API" Caller->>Reg : resolve_loader(market) Reg-->>Caller : 返回可用Loader实例 Caller->>Ldr : fetch(codes, start, end, interval) Ldr->>Cache : 查询缓存 alt 命中缓存 Cache-->>Ldr : 返回DataFrame else 未命中 Ldr->>Cli : 发起请求(带节流/鉴权) Cli->>API : HTTP/TCP 请求 API-->>Cli : 原始数据 Cli-->>Ldr : 标准化行/列 Ldr->>Cache : 写入缓存(可选) Cache-->>Ldr : 确认写入 end Ldr-->>Caller : {symbol : DataFrame}

图表来源 - agent/backtest/loaders/registry.py:158-193 - agent/backtest/loaders/base.py:401-439 - agent/backtest/loaders/yahoo_client.py:156-205 - agent/backtest/loaders/eastmoney_client.py:269-325

详细组件分析

Yahoo Finance(yahoo_loader + yahoo_client)

flowchart TD Start(["开始"]) --> CheckSupported{"是否支持的后缀?"} CheckSupported -- 否 --> ReturnNone["返回 None"] CheckSupported -- 是 --> MapInterval["映射区间(1D/1H/4H→1h/1W/1M)"] MapInterval --> BuildWindow["计算 period1/period2(epoch)"] BuildWindow --> FetchChart["调用 Yahoo v8 chart"] FetchChart --> ParseRows["解析为行列表"] ParseRows --> Normalize["构建DataFrame<br/>索引归一化/裁剪窗口"] Normalize --> Result{"是否有数据?"} Result -- 否 --> ReturnNone Result -- 是 --> ReturnDF["返回OHLCV DataFrame"]

图表来源 - agent/backtest/loaders/yahoo_loader.py:44-106 - agent/backtest/loaders/yahoo_loader.py:125-170 - agent/backtest/loaders/yahoo_loader.py:240-271 - agent/backtest/loaders/yahoo_client.py:71-92 - agent/backtest/loaders/yahoo_client.py:156-205

章节来源 - agent/backtest/loaders/yahoo_loader.py:173-271 - agent/backtest/loaders/yahoo_client.py:95-153 - agent/backtest/loaders/yahoo_client.py:253-308

Tushare(tushare.py + cn_adjust.py)

flowchart TD S(["开始"]) --> Type{"标的类型"} Type -- A股/基金 --> Daily["调用 daily/fund_daily"] Type -- 指数 --> IndexDaily["index_daily(无需复权)"] Type -- 港股 --> HKDaily["hk_daily(无复权因子)"] Type -- US/加密 --> Skip["跳过(Tushare不支持)"] Daily --> Adj["获取adj_factor并apply_qfq"] IndexDaily --> Frame["标准化为OHLCV"] HKDaily --> Frame Adj --> Frame Frame --> Out["返回DataFrame"] Skip --> Out

图表来源 - agent/backtest/loaders/tushare.py:116-202 - agent/backtest/loaders/tushare.py:204-265 - agent/backtest/loaders/tushare.py:322-383 - agent/backtest/loaders/cn_adjust.py:27-78

章节来源 - agent/backtest/loaders/tushare.py:116-202 - agent/backtest/loaders/cn_adjust.py:27-78

东方财富(eastmoney_loader + eastmoney_client)

sequenceDiagram participant L as "Eastmoney Loader" participant C as "Eastmoney Client" participant E as "push2his" L->>C : resolve_secid(symbol) C-->>L : secid(如 1.600519) L->>C : fetch_kline(secid, klt, fqt=1, beg/end) C->>E : GET /api/qt/stock/kline/get E-->>C : JSON(klines字符串数组) C-->>L : 解析为行列表 L-->>L : 标准化为OHLCV DataFrame L-->>L : 写入缓存(可选)

图表来源 - agent/backtest/loaders/eastmoney_loader.py:51-143 - agent/backtest/loaders/eastmoney_client.py:208-325

章节来源 - agent/backtest/loaders/eastmoney_loader.py:51-143 - agent/backtest/loaders/eastmoney_client.py:105-205

AKShare(akshare_loader.py)

章节来源 - agent/backtest/loaders/akshare_loader.py:74-157 - agent/backtest/loaders/akshare_loader.py:158-292

BaoStock(baostock_loader.py)

章节来源 - agent/backtest/loaders/baostock_loader.py:32-108 - agent/backtest/loaders/baostock_loader.py:110-164

依赖关系分析

graph LR M_a["a_share"] --> TENC["tencent"] M_a --> MOOT["mootdx"] M_a --> EM["eastmoney"] M_a --> BS["baostock"] M_a --> AK["akshare"] M_a --> TS["tushare"] M_a --> LOC["local"] M_us["us_equity"] --> YH["yahoo"] M_us --> STQ["stooq"] M_us --> SIN["sina"] M_us --> EM M_us --> YF["yfinance"] M_us --> TI["tiingo"] M_us --> FMP["fmp"] M_us --> FH["finnhub"] M_us --> AV["alphavantage"] M_us --> LB["longbridge"] M_us --> AK M_us --> LOC M_hk["hk_equity"] --> TENC M_hk --> EM M_hk --> YH M_hk --> FUTU["futu"] M_hk --> AK M_hk --> YF M_hk --> TS M_hk --> LB M_hk --> LOC

图表来源 - agent/backtest/loaders/registry.py:136-155

章节来源 - agent/backtest/loaders/registry.py:136-155

性能与并发优化

章节来源 - agent/backtest/loaders/base.py:122-236 - agent/backtest/loaders/base.py:243-439 - agent/backtest/loaders/yahoo_client.py:66-69 - agent/backtest/loaders/eastmoney_client.py:76-79

故障排查指南

章节来源 - agent/backtest/loaders/base.py:31-119 - agent/backtest/loaders/tushare.py:18-35 - agent/backtest/loaders/yahoo_client.py:253-308 - agent/backtest/loaders/eastmoney_client.py:179-205

结论

Vibe-Trading 的数据源层通过统一的 Loader 接口、健壮的校验与缓存、灵活的降级链与节流策略,实现了多市场、多数据源的稳定接入。Yahoo 适合全球权益与外汇,Tushare 提供 A 股深度与基本面扩展,东方财富覆盖 A/HK/US 且免费高效,AKShare 作为免费聚合补充广泛资产类别,BaoStock 以 TCP 直连规避封禁。结合本地缓存与重试预算,可在保证一致性的同时提升吞吐与鲁棒性。

附录:多市场同步最佳实践