市场数据工具

📎 引用文件

本文引用的文件 - agent/src/tools/market_data_tool.py - agent/src/market_data.py - agent/backtest/loaders/registry.py - agent/src/tools/symbol_search_tool.py - agent/src/tools/sector_tool.py - agent/tests/test_market_data_tool.py - agent/tests/test_symbol_search_tool.py - agent/tests/test_sector_tool.py - README_zh.md

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能与缓存
  8. 故障排查指南
  9. 结论
  10. 附录:调用示例与数据处理模式

简介

本文件系统性介绍 Vibe-Trading 的市场数据工具集,重点覆盖以下三个工具: - market_data_tool:统一的多市场、多资产实时与历史 OHLCV 数据获取入口,支持自动源选择与按市场回退链。 - symbol_search_tool:股票代码搜索与匹配,聚合东方财富、Yahoo 等公开接口,输出标准化符号并可选附加 SEC CIK。 - sector_tool:A 股行业板块与概念板块查询(成员归属与涨跌幅排名)。

文档同时说明统一接口设计、回退机制、错误处理、数据质量验证、缺失值处理、性能优化策略,以及具体调用示例与数据处理模式。

项目结构

围绕市场数据工具的核心代码分布在 agent/src/tools 与 agent/src 的共享模块中,并通过 backtest.loaders.registry 提供加载器注册与回退链。测试用例位于 agent/tests,用于验证行为与边界条件。

graph TB subgraph "工具层" MDT["MarketDataTool<br/>get_market_data"] SST["SymbolSearchTool<br/>search_symbol"] STT["SectorInfoTool<br/>get_sector_info"] end subgraph "共享能力" MDH["market_data.fetch_market_data_json<br/>统一数据获取"] REG["loaders.registry<br/>回退链/注册表"] end subgraph "数据源客户端" EM["eastmoney_client"] YH["yahoo_client"] SEC["sec_edgar_client"] end MDT --> MDH MDH --> REG SST --> EM SST --> YH SST --> SEC STT --> EM

图表来源 - agent/src/tools/market_data_tool.py:11-104 - agent/src/market_data.py:97-229 - agent/backtest/loaders/registry.py:158-249 - agent/src/tools/symbol_search_tool.py:69-157 - agent/src/tools/sector_tool.py:245-320

章节来源 - agent/src/tools/market_data_tool.py:11-104 - agent/src/market_data.py:97-229 - agent/backtest/loaders/registry.py:158-249 - agent/src/tools/symbol_search_tool.py:69-157 - agent/src/tools/sector_tool.py:245-320

核心组件

章节来源 - agent/src/tools/market_data_tool.py:11-104 - agent/src/tools/symbol_search_tool.py:69-157 - agent/src/tools/sector_tool.py:245-320

架构总览

统一的数据获取流程由 fetch_market_data_json 驱动,内部根据符号格式推断首选数据源,并按市场维度的回退链尝试各加载器,直至成功或耗尽尝试次数。symbol_search_tool 并行从多个公开接口拉取候选结果,归一化后合并去重;sector_tool 基于东方财富 push2 接口完成板块查询。

sequenceDiagram participant U as "调用方" participant T as "MarketDataTool" participant H as "fetch_market_data_json" participant R as "registry.get_loader_cls_with_fallback" participant L as "Loader.fetch" U->>T : get_market_data(codes, start_date, end_date, source, interval, max_rows) T->>H : 调用 JSON 封装 H->>H : detect_source + group by (source, market) loop 对每组(source, market) H->>R : 获取加载器类含回退链 R-->>H : LoaderClass H->>L : fetch(codes, start_date, end_date, interval) alt 成功且有数据 L-->>H : DataFrame -> records H->>H : cap_rows + _json_safe else 失败或无数据 H->>R : 尝试下一个回退源 end end H-->>T : {symbol : rows, _provenance?, _unresolved?} T-->>U : JSON 字符串

图表来源 - agent/src/tools/market_data_tool.py:94-104 - agent/src/market_data.py:51-63 - agent/src/market_data.py:97-229 - agent/backtest/loaders/registry.py:158-249

详细组件分析

MarketDataTool(get_market_data)

flowchart TD Start(["开始"]) --> Detect["检测符号首选源"] Detect --> Group["按(source, market)分组"] Group --> BuildChain["构建回退链 attempts"] BuildChain --> TryLoad{"尝试加载器"} TryLoad --> |成功| Clean["JSON安全化 + 行裁剪"] TryLoad --> |失败| Next["下一个回退源"] Clean --> Done["收集结果/溯源"] Next --> TryLoad Done --> End(["结束"])

图表来源 - agent/src/market_data.py:51-63 - agent/src/market_data.py:97-229

章节来源 - agent/src/tools/market_data_tool.py:11-104 - agent/src/market_data.py:51-63 - agent/src/market_data.py:97-229 - agent/tests/test_market_data_tool.py:14-164

SymbolSearchTool(search_symbol)

sequenceDiagram participant U as "调用方" participant S as "SymbolSearchTool" participant E as "eastmoney_client" participant Y as "yahoo_client" participant C as "sec_edgar_client" U->>S : search_symbol(query, limit) S->>E : suggest(query, per-source cap) S->>Y : search(query, per-source cap) E-->>S : 候选列表 Y-->>S : 候选列表 S->>S : 归一化 + 去重 alt 存在 .US 股票 S->>C : cik_for(ticker) C-->>S : CIK 或失败 end S-->>U : JSON 信封(ok, data.candidates, data.sources)

图表来源 - agent/src/tools/symbol_search_tool.py:69-157 - agent/src/tools/symbol_search_tool.py:168-424 - agent/tests/test_symbol_search_tool.py:91-228

章节来源 - agent/src/tools/symbol_search_tool.py:69-157 - agent/src/tools/symbol_search_tool.py:168-424 - agent/tests/test_symbol_search_tool.py:91-228

SectorInfoTool(get_sector_info)

flowchart TD Mode{"mode?"} Mode --> |membership| Resolve["resolve_secid(code)"] Resolve --> |成功| FetchM["GET slist/get(secid, fields)"] Resolve --> |失败| Err["返回错误信封"] FetchM --> ParseM["解析 diff -> boards"] ParseM --> OutM["返回 ok=true, boards"] Mode --> |ranking| FetchR["GET clist/get(fs, fields, pz=limit)"] FetchR --> ParseR["解析 diff -> boards"] ParseR --> Cap["裁剪到 limit"] Cap --> OutR["返回 ok=true, boards"]

图表来源 - agent/src/tools/sector_tool.py:155-243 - agent/src/tools/sector_tool.py:245-320 - agent/tests/test_sector_tool.py:50-195

章节来源 - agent/src/tools/sector_tool.py:155-243 - agent/src/tools/sector_tool.py:245-320 - agent/tests/test_sector_tool.py:50-195

依赖关系分析

graph LR REG["registry.FALLBACK_CHAINS"] --> MD["market_data.fetch_market_data"] REG --> LDR["loader.fetch(...)"] MD --> RES["results + _provenance/_unresolved"] SST["symbol_search_tool"] --> EM["eastmoney_client"] SST --> YH["yahoo_client"] SST --> SEC["sec_edgar_client"] STT["sector_tool"] --> EM

图表来源 - agent/backtest/loaders/registry.py:117-129 - agent/backtest/loaders/registry.py:158-249 - agent/src/market_data.py:51-63 - agent/src/market_data.py:97-229 - agent/src/tools/symbol_search_tool.py:69-157 - agent/src/tools/sector_tool.py:155-243

章节来源 - agent/backtest/loaders/registry.py:117-129 - agent/backtest/loaders/registry.py:158-249 - agent/src/market_data.py:51-63 - agent/src/market_data.py:97-229 - agent/src/tools/symbol_search_tool.py:69-157 - agent/src/tools/sector_tool.py:155-243

性能与缓存

[本节为通用指导,不直接分析具体文件]

故障排查指南

章节来源 - agent/src/market_data.py:213-221 - agent/src/tools/symbol_search_tool.py:168-189 - agent/src/tools/sector_tool.py:293-320

结论

Vibe-Trading 的市场数据工具集通过统一接口屏蔽了多市场、多资产的复杂性,借助符号检测与市场级回退链实现高可用数据获取;symbol_search_tool 提供跨源的符号解析与增强;sector_tool 聚焦 A 股板块洞察。三者共同构成研究、分析与交易工作流的基础设施。建议在生产环境中结合缓存与监控,进一步提升稳定性与性能。

[本节为总结性内容,不直接分析具体文件]

附录:调用示例与数据处理模式

章节来源 - agent/src/tools/market_data_tool.py:20-91 - agent/src/tools/symbol_search_tool.py:83-104 - agent/src/tools/sector_tool.py:259-291 - README_zh.md:371-399