causal-memory

2026-09-29

系列·贰。上一篇跑通了服务,这篇把 45 个工具按业务域拆开讲,全部配真实输出(2026-09-29 盘后运行)。中间会真实演示两个数据源失效的案例——这比成功案例更有教学价值。

六域地图

域 工具数 干什么 数据源
market 8 实时/ K线/分时/指数/搜股/资金流/北向 腾讯、新浪、同花顺
sentiment 10 涨停池/炸板/跌停/昨涨停/打板情绪/龙虎榜/热榜 东财 push2ex、同花顺、datacenter
fundamental 6 财务指标/三表/F10/EPS 一致预期 腾讯衍生、mootdx、同花顺
research 4 个股/行业研报、PDF 下载、互动易、巨潮公告 东财 reportapi、巨潮
corporate 5 分红/股东户数/解禁/融资融券/大宗交易 东财 datacenter
options 3 ETF 期权合约/T 型报价/希腊字母+IV 新浪

选型心法:先用 get_a_search 确认代码,再用 market 域拿数据,sentiment 域看情绪,corporate 域排雷(解禁/大宗折价)。

实战一:K 线与指数(market 域)

> get_a_hist(symbol="600519", count=5)

date        O        H        L        C        V
2026-09-22  1252.15  1265.88  1248.10  1253.80  2457294
2026-09-23  1255.03  1271.50  1250.89  1251.24  3098122
2026-09-24  1250.01  1256.13  1231.05  1237.00  3123935
2026-09-28  1236.00  1244.01  1228.10  1243.88  2821830
2026-09-29  1244.60  1245.87  1230.88  1235.58  2636630

> get_a_indices(indices="sh,sz,cy,hs300")

sh     上证指数   3830.45   +0.18%
sz     深证成指   12901.95  +0.34%
cy     创业板指   3142.56   +0.09%
hs300  沪深300    4345.21   +0.10%

量能配合看得很清楚:茅台 5 天从 1253 跌到 1235,成交量从 312 万手缩到 263 万手——缩量阴跌,不是恐慌盘。K 线源是新浪(scale=240 日线,datalen 最大 1023 根),传 start/end 做区间查询时服务会拉满窗口再本地过滤。

实战二:龙虎榜(sentiment 域)

> get_a_daily_dragon_tiger(trade_date="2026-09-29")

date: 2026-09-29  total: 72

301716  鸿富诚    无价格涨跌幅限制的证券              净买(万) 42004.1  涨幅 653.16%  换手 84.54
002074  国轩高科  日涨幅偏离值达到7%的前5只证券        净买(万) 36838.5  涨幅 10.01%   换手 2.66
000513  丽珠集团  连续三个交易日涨幅偏离值累计达20%     净买(万) 20781.0  涨幅 6.23%    换手 11.17
002172  澳洋健康  日换手率达到20%的前5只证券           净买(万) 20225.4  涨幅 8.28%    换手 29.02
000002  万科A     日涨幅偏离值达到7%的前5只证券        净买(万) 15960.8  涨幅 9.97%    换手 8.26
002912  中新赛克  连续三个交易日涨幅偏离值累计达20%     净买(万) 10551.0  涨幅 10.01%   换手 17.10

打板选手的日常:72 只上榜,get_a_dragon_tiger(symbol=...) 还能下钻到具体个股的买卖前五席位和机构专用席位净额(RPT_BILLBOARD_DAILYDETAILSBUY/SELL 两张表)。这个工具有一次请求聚合 5 张 datacenter 表,是全服务最重的查询之一。

实战三:两个数据源失效的完整排查(真实记录)

这次实跑遇到了两个失败,值得完整记录。

失败 1:涨停池返回空。

> get_a_limit_up_pool(date="20260929")
[]                                    ← 当天明明万科A都涨停了
> get_a_limit_up_pool(date="20260925")
[]                                    ← 换交易日还是空

涨停池走的是东财 push2ex.eastmoney.com 的 getTopicZTPool。指数有数据、datacenter 有数据,唯独这个域名全空——基本可判定是 push2ex 接口变更或对本网络不可达,而不是"今天没有涨停"。这里暴露一个设计陷阱:接口失效和"真的没数据"返回了同样的 []。全市场截面工具 em_clist_all 有 UniverseDegraded 防护(行数低于阈值直接抛错),但涨停池这类单接口工具还没有——这是已知的改进点(你的 PR 机会)。

失败 2:资金流接口连接被重置。

> get_a_fund_flow_120d(symbol="600519")

WARNING Retrying ... Remote end closed connection without response
       (push2his.eastmoney.com/api/qt/stock/fflow/daykline/get)

push2his 的连接被对端直接断开,urllib3 按配置重试 3 次后失败。这类"软失败"平时不显眼,但它说明生产部署时最好在国内服务器跑这个服务(代码注释里写过:通达信 TCP 7709 端口对海外 IP 直接超时)。

经验总结成三条:

  1. 免费数据源都有脾气,多源冗余比单源可靠重要——这套服务里腾讯/新浪/同花顺/东财互为备份
  2. 空结果必须区分"没数据"和"坏了",下游(尤其是 Agent)没有能力自己分辨
  3. 5 分钟 TTL 的本地缓存挡掉了大部分重复请求,历史日期的数据这次 PR 之后直接永久缓存

缓存与限流(看懂这两个机制,排障快一半)

  • 限流:所有东财请求走 em_get 统一入口。原来全局 1 req/s,已改为 per-host(push2 系放宽到 0.2s),get_a_market_snapshot 翻 55 页从 ~70s 降到 ~12s
  • 缓存:文件缓存 + 原子换名写入,is_empty_result 判定为空的结果不写缓存(否则上游限流时返回的空 [] 会污染 5 分钟内所有请求)

下一篇进新闻链路:30 条真实新闻跑一遍"采集→SimHash 去重→事件分类"的全流程。

项目地址:github.com/JingxuanC/astock-data-mcp

Comments (0)

Sign in with GitHubto leave a comment.