ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Vibe-Trading 行业概念板块工具实战:get_sector_info 的两种模式、东财 push2 端点与源码级解析

Vibe-Trading 行业概念板块工具实战:get_sector_info 的两种模式、东财 push2 端点与源码级解析 Vibe-Trading 行业概念板块工具实战get_sector_info 的两种模式、东财 push2 端点与源码级解析【免费下载链接】Vibe-TradingVibe-Trading: Your Personal Trading Agent项目地址: https://gitcode.com/GitHub_Trending/vi/Vibe-Trading本技术指南围绕 Vibe-Trading 开源仓库中的get_sector_info板块工具SectorInfoTool展开讲解它如何通过东方财富Eastmoney免费免鉴权接口提供 A 股行业板块 / 概念板块的两种只读视图按个股查询所属板块membership与按盘中涨跌幅对行业板块排名ranking。读完本文你将掌握该工具的输入参数、端点查询参数、返回信封结构、底层 secid 解析与节流机制并能结合源码与测试用例理解其防御性解析细节直接在本地复现调用。本文关联文档位于 agent/src/skills/eastmoney/references/板块/行业概念板块.md核心实现位于 agent/src/tools/sector_tool.py配套测试见 agent/tests/test_sector_tool.py。工具概览免费的 A 股板块分类数据东方财富发布了一套免费、免鉴权的板块分类体系把 A 股个股归入两类集合行业板块如白酒酿酒行业银行按申万/东财行业口径划分主题概念板块如白酒概念人工智能按市场主题与热点概念划分。get_sector_info只对这套分类提供两种只读视图全部请求经由共享的eastmoneyper-host 节流层发出避免触发东财按源 IP 的限流东财对突发式请求会封禁客户端 IP。在源码中该工具由SectorInfoTool类实现agent/src/tools/sector_tool.py#L301-L347继承自src.agent.tools.BaseTool工具名name即get_sector_info并声明了标准的 JSON Schema 参数parameters因此既能被 Agent 直接调用也能以 LLM function-calling 形式暴露给上层编排。两种模式membership 与 ranking工具支持两个互斥的只读视图对应两个不同的 push2 端点模式端点 URL语义membershiphttps://push2.eastmoney.com/api/qt/slist/get给定个股code列出它所属的行业/概念板块按 secid 寻址rankinghttps://push2.eastmoney.com/api/qt/clist/get把行业板块全集按盘中涨跌幅排名板块全集选择器fsm:90t:2membership以spt3参数一次性混合返回个股所属的行业板块与概念板块覆盖 A 股.SH/.SZ/.BJrankingfsm:90t:2表示板块市场m:90 行业板块子类型t:2即行业板块全集按fidf3涨跌幅降序排列。两个端点 URL 在源码中以模块常量定义agent/src/tools/sector_tool.py#L34-L35_MEMBERSHIP_URL https://push2.eastmoney.com/api/qt/slist/get _RANKING_URL https://push2.eastmoney.com/api/qt/clist/get字段选择器agent/src/tools/sector_tool.py#L39-L44通用f12板块/证券代码f14名称f3涨跌幅f2最新价/板块指数ranking 专属f104/f105上涨/下跌成分数f140领涨股membershipf12,f13,f14,f3,f2rankingf12,f14,f3,f2,f104,f105,f128,f140。输入参数详解SectorInfoTool.execute()接受三个关键字参数与工具 Schema 中的properties一一对应名称类型必选描述modestrNmembership默认列个股所属板块需code或ranking行业板块按当日涨幅排名忽略codecodestrmembership 必选A 股 symbol 带后缀如600519.SH/000001.SZ/430139.BJlimitintNranking 时返回 top 板块数1–100默认 30membership 忽略源码中的默认值与防御性上限agent/src/tools/sector_tool.py#L50-L53_MAX_RANKING 100 # 防御性上限防止载荷撑爆 LLM 上下文 _DEFAULT_RANKING 30 _VALID_MODES (membership, ranking)分发逻辑agent/src/tools/sector_tool.py#L349-L375值得注意的几个校验细节mode必须属于(membership, ranking)否则返回{ok: false, error: mode must be one of [membership, ranking]}limit必须是正整数且布尔值isinstance(limit, bool)会被显式拒绝实际请求的pz会被min(limit, _MAX_RANKING)钳制到 100membership 模式下code必须是非空字符串空白会被拒绝传入前会做code.strip()去除首尾空格。端点查询参数与源码逐项对应membershipslist 端点secidsecid spt3 pi0 pz100 fieldsf12,f13,f14,f3,f2 fltt2 po1在源码中对应_fetch_membershipagent/src/tools/sector_tool.py#L160-L203payload get_json( _MEMBERSHIP_URL, params{ secid: secid, spt: 3, # 同时返回行业 概念板块 pi: 0, # 页码从 0 开始 pz: 100, # 页大小 fields: _MEMBERSHIP_FIELDS, fltt: 2, # 返回浮点数值而非文本 po: 1, }, )secid通过resolve_secid(code)解析若解析失败如符号无后缀或无法识别工具不会发请求而是直接返回错误信封{ok: false, error: unresolvable symbol: ...}。rankingclist 端点fsm:90t:2 fieldsf12,f14,f3,f2,f104,f105,f128,f140 pn1 pzlimit po1 fidf3 fltt2对应_fetch_rankingagent/src/tools/sector_tool.py#L257-L298payload get_json( _RANKING_URL, params{ fs: _RANKING_FS, # m:90t:2 行业板块全集 fields: _RANKING_FIELDS, pn: 1, pz: str(limit), # 已校验并钳制到 100 po: 1, fid: f3, # 按涨跌幅排序 fltt: 2, }, )ranking 视图不依赖 secid它枚举整个行业板块全集因此即使传入code也会被忽略测试test_ranking_ignores_code_and_skips_resolve验证了resolve_secid不会被调用见 agent/tests/test_sector_tool.py#L118-L127。返回信封与字段语义成功时两种模式统一返回{ok: true, market: stock, source: eastmoney, mode: mode, data: {...}}结构失败时返回{ok: false, error: ...}。东财返回的-或空值统一映射为None由_as_floatagent/src/tools/sector_tool.py#L68-L84与领涨股解析共同保证。membership 返回字段每行一个板块字段类型描述来源board_codestr板块代码f12board_namestr板块名称f14change_pctfloat涨跌幅f3pricefloat最新价f2信封的data额外包含code原始 symbol与secid解析结果便于追溯。解析时行若缺少f12或f14会被静默丢弃测试中missing-code行即被过滤见 agent/tests/test_sector_tool.py#L19。ranking 返回字段每行一个行业板块字段类型描述来源board_code / board_namestr板块代码 / 名称f12 / f14change_pctfloat涨跌幅f3indexfloat板块指数f2up_count / down_countfloat上涨 / 下跌成分数f104 / f105leaderstr领涨股-→ Nonef140防御性载荷解析push2 接口的data.diff在不同端点可能返回列表或按字符串索引键控的字典两种形态。_diff_rowsagent/src/tools/sector_tool.py#L139-L157对两者都做了兼容测试test_diff_as_dict_is_handledagent/tests/test_sector_tool.py#L138-L143验证了字典形态的解析。此外_fetch_ranking在拿到解析结果后会再次执行boards[:limit]截断确保即使上游返回多余行也不会突破请求的上限。底层支撑secid 解析与共享节流层secid 寻址规则get_sector_info的 membership 模式与 K 线数据共用同一套 secid 寻址方案agent/backtest/loaders/eastmoney_client.py#L105-L114上交所.SH→ 市场号1如600519.SH→1.600519深交所与北交所.SZ/.BJ→ 市场号0如000001.SZ→0.000001、430139.BJ→0.430139非 A 股后缀.HK补零五位为116.xxxxx、.US走 suggest 搜索并缓存不在板块工具的支持范围内——membership 只覆盖 A 股。resolve_secid的完整分支在 agent/backtest/loaders/eastmoney_client.py#L208-L236无法识别时返回None工具随即返回unresolvable symbol错误信封测试见 agent/tests/test_sector_tool.py#L172-L176。共享 per-host 节流板块请求与东财 K 线请求共用同一个节流桶_HOST_KEY eastmoneyagent/backtest/loaders/eastmoney_client.py#L38-L40。get_json内部调用throttled_get_jsonagent/backtest/loaders/_http.py#L176-L200每次请求前都会等待满足 per-host 最小间隔默认最小间隔1.0秒可通过环境变量VIBE_TRADING_EASTMONEY_MIN_INTERVAL覆盖resolve_min_intervalagent/backtest/loaders/_http.py#L127-L138同一 host key 复用同一requests.Session并带默认浏览器 UA请求超时默认 15 秒非 2xx 状态或无法解析的 JSON 会抛出异常由工具层捕获并转为干净的错误信封测试用HTTP 429/HTTP 503模拟见 agent/tests/test_sector_tool.py#L178-L194。这也意味着任何并发调用如批量板块查询都必须经过该节流层这正是文档中东财按源 IP 限流的落地实现。进阶用法一单行业板块解析resolve_industry_board除SectorInfoTool外模块还导出了一个非工具函数resolve_industry_board(code)agent/src/tools/sector_tool.py#L206-L254用于把一只 A 股解析为唯一的行业板块名称如600519.SH→白酒Ⅱ与 membership 的spt3混合行业概念不同它请求spt1返回个股本身 其唯一行业板块两行板块行以f13 90板块市场标记区分——个股行f13为1/0板块行为90仅当_detect_market(code) a_share时才会发请求agent/backtest/engines/_market_hooks.py#L214-L233任何失败不可解析、请求异常、无板块行都静默降级为None绝不抛出异常。进阶用法二在 API 中的实际应用持仓行业解析resolve_industry_board已被用于回测运行的持仓行业归因在 agent/src/api/runs_routes.py#L522-L543 的_resolve_industries_concurrent中通过线程池对符号集合做有界并发解析不超过_POSITIONS_SECTOR_MAX_SYMBOLS个网络查询、_POSITIONS_SECTOR_WORKERS个并发 worker结果缓存到artifacts/sector_map.json。单个符号解析失败不会中断整批任务这与resolve_industry_board永不抛异常的约定一致。调用范例与联动研究最小可运行示例from src.tools.sector_tool import SectorInfoTool print(SectorInfoTool().execute(code600519.SH)) # membership print(SectorInfoTool().execute(moderanking, limit20)) # 行业板块涨幅榜运行前提在agent/目录下执行导入根为agent/无需任何 token所有请求自动经过东财共享节流层。资金流向 板块联动仓库自带的示例脚本 agent/src/skills/eastmoney/scripts/fund_flow_example.py 演示了把板块工具与资金流向工具组合的研究流程def study_sectors(code: str) - None: membership json.loads(SectorInfoTool().execute(codecode)) if membership.get(ok): boards membership[data].get(boards, []) print(f{code} 所属板块{[b[board_name] for b in boards]}) ranking json.loads(SectorInfoTool().execute(moderanking, limit5)) if ranking.get(ok): for board in ranking[data][boards]: print(f {board[board_name]}: {board[change_pct]}%)该脚本以600519.SH为例先读取近 30 日主力净流入序列FundFlowTool再列出其所属板块与当日行业涨幅榜前 5形成个股资金流 → 板块归属 → 板块热度的联动研判链条。测试验证信封形状、解析与校验全覆盖agent/tests/test_sector_tool.py 对工具行为做了完整的单元验证所有 HTTP 均 mock 在get_json/resolve_secid层不触网。可归纳为四组信封形状ok/marketstock/sourceeastmoney/mode字段齐备data.code与data.secid回显正确解析正确性membership 与 ranking 的 diff 行正确映射到带标签的 dict-值映射为None缺f12的行被丢弃模式分发ranking 忽略code且不触发 secid 解析limit10000时请求pz被钳制为100diff 为字典形态也能解析错误信封缺code、空白code、非法mode、非正limit、布尔limit、无法解析的符号、HTTP 失败429/503均返回{ok: false, ...}。使用建议与边界membership 用于个股画像快速回答这只股票属于哪些行业/概念板块适合投研的持仓归因与风格刻画ranking 用于板块轮动盘中实时观测行业涨幅榜、上涨/下跌成分数市场宽度与领涨股是板块热度与情绪监测的低成本数据源注意市场范围membership 仅覆盖 A 股.SH/.SZ/.BJ非 A 股符号在 membership 模式下会返回 unresolvable 错误注意节流数据免费免鉴权但东财按源 IP 限流并发批量查询务必经由共享节流层并考虑缓存如sector_map.json模式。【免费下载链接】Vibe-TradingVibe-Trading: Your Personal Trading Agent项目地址: https://gitcode.com/GitHub_Trending/vi/Vibe-Trading创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表