ARTICLE DETAIL

资讯详情

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

Vibe-Trading screen_market 实战解析:从 clist 端点到排行榜的完整调用链路

Vibe-Trading screen_market 实战解析:从 clist 端点到排行榜的完整调用链路 Vibe-Trading screen_market 实战解析从 clist 端点到排行榜的完整调用链路【免费下载链接】Vibe-TradingVibe-Trading: Your Personal Trading Agent项目地址: https://gitcode.com/GitHub_Trending/vi/Vibe-TradingVibe-Trading 里有一个只读工具screen_market一次调用即可拿到 A 股、美股、港股全市场按涨跌幅、成交量、成交额、换手率排名的 Top N。读完本文你会掌握四件事端点寻址与 fs 市场全集选择器、fid 排序字段映射、返回信封结构、按 IP 限流下的防护机制。为什么不做逐 symbol 抓取今天谁涨得最猛、成交最活跃是交易研究里最高频的问题。最直接的解法是遍历候选列表逐个拉行情——慢而且每加一个 symbol 就多一次上游请求很容易撞上免费数据源的限流墙。screen_market换了个思路直接问东方财富 push2 体系的榜单列表接口。给定一个市场全集选择器服务端返回每只上市标的一行最新价 常用排名指标并且由服务端按指定字段预排序客户端只取前 N 行。一个请求顶几百次逐标的抓取响应体规模天然有界。架构位置方面实现文件 agent/src/tools/market_screener_tool.py类MarketScreenerTool继承自 agent/src/agent/tools.py 中的BaseToolL13-55注册走 agent/src/tools/__init__.py 的自动发现_discover_subclassesL34用BaseTool.__subclasses__()L64递归收集所有子类放进src/tools/就自动被 LLM 可用无需手动登记技能索引页 agent/src/skills/eastmoney/SKILL.md 的选股检索分类L93-97里登记了它的用途与适用市场。Vibe-Trading screen_market 怎么取数clist 端点与 fs 选择器端点整个工具只打一个 URL模块级常量_CLIST_URLmarket_screener_tool.py L30https://push2.eastmoney.com/api/qt/clist/getclist与项目里另一个东财端点分工明确push2his 的 kline 接口见 agent/backtest/loaders/eastmoney_client.py 的fetch_klineL300回答某只标的的历史走势clist回答全市场谁排前面。市场全集选择器fs三个市场的fs值原样保存在_MARKET_FSL35-39源码键fs 实际取值覆盖范围am:0t:6,m:0t:80,m:1t:2,m:1t:23,m:0t:81s:2048深市主板、创业板、沪市主板、科创板、北交所usm:105,m:106,m:107NASDAQ、NYSE、AMEXhkm:116,m:113,m:114,m:115,m:128港股主板与创业板等这些片段对应东财的 secid 寻址约定沪市用市场号1、深市/北交所用0与resolve_secid中 A 股1.code/0.code的写法一一对应港股固定116前缀 5 位零填充代码美股三所分别是105/106/107。排序字段映射sort_by → fid → 查询参数fid 映射_SORT_FIDL43-48把对外的排序名翻译成东财字段号sort_byfid含义change_pct默认f3涨跌幅 %volumef5成交量手amountf6成交额货币单位turnoverf8换手率 %排序方向恒为降序——榜单语义就是取最大的前 N 名所以方向参数写死不提供入口。完整的查询参数拼装_screen_marketL120-164调用get_json时逐项拼装 paramsL137-147参数取值说明pn1页码固定第一页pzstr(top_n)每页条数po11 降序fid_SORT_FID[sort_by]服务端排序依据fs_MARKET_FS[market]市场全集fieldsf2,f3,f4,f5,f6,f8,f12,f14请求返回的列_FIELDSL52测试test_sort_by_maps_to_eastmoney_fidagent/tests/test_market_screener_tool.py L80-90断言了这条拼接链路marketus, sort_byamount时请求参数中fid f6、po 1、fs m:105,m:106,m:107。一行原始数据怎么变成规范记录响应体里data.diff是行列表每行是 field id 键控的 dict_shape_rowL92-117负责归一化field id输出键描述注意事项f12code代码缺失则整行丢弃f14name名称缺省为空串f2price最新价经_num转换f3change_pct涨跌幅同上f4change涨跌额同上f5volume成交量手同上f6amount成交额同上f8turnover_rate换手率 %同上两个细节值得展开哨兵值映射为 None。东财对无值单元格返回-_numL71-89将其转成None而不是 0.0——停牌股的换手率是没有不是零。测试test_change_pct_screen_parses_rowsL46-78里平安银行的f8就是-断言结果为turnover_rate is None。diff 结构双形态归一化。同一接口在不同主机上data.diff可能是 list也可能是按索引键控的 dict键为0、1……。_screen_market对 dict 形态执行list(diff.values())L154-155测试test_diff_as_dict_is_normalizedL92-101专门覆盖了这条分支。入参与校验三个参数的合法边界JSON Schema 定义在MarketScreenerTool.parametersL179-210参数类型必选合法取值默认值marketstr是a/us/hk无sort_bystr否change_pct/volume/amount/turnoverchange_pcttop_nint否1–100 的正整数30_DEFAULT_TOP_NL56executeL213-256的校验边界行为market 白名单非字符串或不在_MARKET_FS键集中即返回market must be one of [a, us, hk]sort_by 白名单同上逻辑报错信息列出四个合法键top_n 的布尔陷阱校验写的是not isinstance(top_n, int) or isinstance(top_n, bool)L236——Python 里isinstance(True, int)为真必须显式排除布尔测试test_bool_top_n_rejectedL150-153验证top_nTrue会被拒上限钳制通过校验后top_n min(top_n, _MAX_TOP_N)L238_MAX_TOP_N 100L55传 500 也只拿 100 行绝不报错兜底捕获请求阶段的任何异常含 429在execute里被捕获并转成错误信封L240-244测试test_http_failure_surfaces_as_error_envelopeL155-164模拟RuntimeError(HTTP 429)验证异常不外抛。返回信封长什么样成功时返回 JSON 字符串ensure_asciiFalse中文名不转义{ ok: true, market: a, source: eastmoney, data: { market: a, sort_by: change_pct, rows: [ {code: 600519, name: 贵州茅台, price: 1688.0, change_pct: 9.98, change: 153.0, volume: 1234567.0, amount: 2080000000.0, turnover_rate: 1.23}, {code: 000001, name: 平安银行, price: 11.5, change_pct: 5.01, change: 0.55, volume: 9876543.0, amount: 110000000.0, turnover_rate: null} ] } }失败时参数校验或请求异常{ok: false, error: top_n must be a positive integer}行列表嵌在data.rows下而非裸列表源码 docstring 明确写了原因L224-225与项目内所有工具的data:{...}信封形状保持一致下游解析代码可以统一处理。即便上游返回空数据也是ok: true 空rows测试test_rowless_payload_yields_empty_dataL111-122不会退化成裸列表。为什么不该裸调端点共享限速层东财按源 IP 限流并对突发请求的客户端临时封禁。工具的每次请求都不自己发 HTTP而是走 agent/backtest/loaders/eastmoney_client.py 的get_jsonL112-133后者固定以host_keyeastmoney_HOST_KEYL38进入 agent/backtest/loaders/_http.py 的节流体系进程级节流器HostThrottleL46-106按 host 桶记录上次发枪时刻保证同桶相邻请求最小间隔并发调用方链式排队锁只持有记账期间不同桶互不阻塞随机抖动间隔之上叠加最多 0.4 秒抖动_JITTER_MAX_SL43避免多个并发调用方同时到期齐射Session 复用每进程每桶一个requests.SessionL114-124摊薄 TCP/TLS 握手浏览器 UA默认携带桌面 Chrome 的 User-AgentL35-38因为不少免费行情端点拒绝裸 requests 指纹最小间隔可调默认 1.0 秒环境变量可覆盖VIBE_TRADING_EASTMONEY_MIN_INTERVAL批量任务建议调大而不是调小。这意味着绕开工具直连clist端点的突发请求会失去节流保护可能触发按 IP 的临时封禁——连累的是同 IP 下所有走共享节流层的调用方包括 backtest 的东财 loader。直接调用与 swarm 中的用法以下示例在agent/目录下运行导入根为agent/无需 token# 场景 1A 股今日涨幅榜前 20 from src.tools.market_screener_tool import MarketScreenerTool print(MarketScreenerTool().execute(marketa, sort_bychange_pct, top_n20))# 场景 2美股成交额榜前 10 print(MarketScreenerTool().execute(marketus, sort_byamount, top_n10))# 场景 3港股换手率榜前 50 print(MarketScreenerTool().execute(markethk, sort_byturnover, top_n50))repeatable TrueL211允许同一轮对话里多次调用对比不同市场/排序。技能脚本 agent/src/skills/eastmoney/scripts/screen_search_example.py 演示了先search_symbol解析标的、再screen_market看市场动向的完整研究流程。在 swarm 多 Agent 编排中它是研究型 worker 的 universe 枚举工具agent/src/swarm/presets/statistical_arbitrage_desk.yamlL48先screen_market枚举当日热点再get_market_data拉价格面板agent/src/swarm/presets/pairs_research_lab.yamlL60用screen_market枚举{market}/{sector}候选池后再逐对扫描。它不能做什么数据范围只有 A 股、美股、港股三大市场的行情列表期货、期权、外汇不在覆盖内实时性返回的是 push2 行情快照适合当日排名类问题历史榜单序列不在此工具职责内单位语义volume以手计amount为货币单位成交额turnover_rate是百分比跨市场比较时单位口径不同港股量纲与 A 股不同空值语义停牌等无值场景对应字段是None而非 0下游计算必须做空值防御限流依赖可靠性建立在共享节流层之上节流是进程内 best-effort、不跨机器协调高并发场景靠环境变量拉开间隔。相关工具agent/src/tools/symbol_search_tool.py 的search_symbol把公司名/代码片段解析为候选 symbol与screen_market组成模糊查询 → 全市场扫描的组合拳agent/backtest/loaders/eastmoney_client.py 的fetch_kline入选标的的历史 K 线拉取榜单粗筛后的深度数据环节。【免费下载链接】Vibe-TradingVibe-Trading: Your Personal Trading Agent项目地址: https://gitcode.com/GitHub_Trending/vi/Vibe-Trading创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表