# A 股数据源整合记录 · v3.9.0 调研:2026-09-19;实现与验收:2026-09-20。 基线:v3.8.0,GitHub `main` 提交 `8e5985c`。 ## 本版处理的 issue / PR | 编号 | 问题 | 处理 | |---|---|---| | #52 | mootdx 取不到 K 线 | 服务器端变化:内置 10 台逐台实测,TCP 都可达,财务 / 除权除息正常,F10 只剩「最新提示」一类,K 线 / 五档 / 逐笔返回 0 行。`tdx_client(check='finance')` 让财务类调用按财务快照 + F10 类别表验活;§6.2 改为先 `F10C` 列类别;K 线改走 §1.5 腾讯、§1.6 通达信官网盘后包 | | #49 | 商品期货 / 期权 | 新增 Layer 13:五家期货交易所官方日行情与期权、四家(上期所 / 上期能源 / 郑商所 / 中金所)持仓排名,新浪实时期货(含大商所)、A50、上金所 | | #53 | 研报只有东财一个来源 | 新增 §2.4 新浪研报列表 | | #55 | 聚宽代码与回测 | `norm_ticker()` / `get_prefix()` 认 `.XSHG` / `.XSHE`;新增 `to_joinquant()`;FAQ 写明本 skill 不带回测引擎 | | PR #54 | 用 easy_tdx 替换 mootdx | 不合并。本项目只接直接可取的数据源,不引入同协议的另一个客户端库;#52 由 HTTP 路径解决 | ## 纳入本版 | 层 | 函数 | 数据提供方 | 与原版关系 | 数据边界 | |---|---|---|---|---| | 1 行情 | `tencent_kline` | 腾讯 | 已有源的新端点 | 沪深日周月前 / 后复权 + 1~60 分钟;**不含北交所**;前复权是等差口径,遇 ≤0 价格抛错 | | 1 行情 | `tdx_daily_package` | 通达信官网 | 新源 | 某交易日沪深北全市场日线含成交额;实测 2022-01-04、2023-01-03 可取,2021-01-04 已没有,未逐日验证;2022-05-06 之前的包没有北交所 | | 2 研报 | `sina_research_reports` | 新浪 | 已有源的新端点 | 只有列表,无评级与目标价;内置 6 秒间隔 | | 4 资金面 | `etf_shares` | 上交所、深交所 | 已有源的新端点 | 上交所按日期,实测 2022-01-04 仍有 382 只、2023-01-03 有 446 只;深交所只有当前快照 | | 5 新闻 | `wallstreetcn_lives` | 华尔街见闻 | 新源 | 按频道 7×24 快讯,可翻页 | | 5 新闻 | `cctv_news` | 央视网 | 新源 | 新闻联播条目与文字稿,当晚约 20:00 后更新 | | 6 基础 | `st_stock_list` | 东财(baostock 兜底) | 已有源的新端点 | 沪深京当日快照;东财不可达时退 baostock,只有沪深、无价格 | | 10 舆情 | `sse_e_interaction` | 上证e互动 | 新源 | 只收沪市代码;公司近期无回复时返回空表 | | 11 宏观利率 | `chinabond_yield_curve` | 中债 | 新源 | 国债 / 银行 AAA / 中短票 AAA;单次超 1 年官网静默返回 0 行,函数按 360 天切片。起点:国债 2006-03-01、中短票 2006-12-25、银行 2009-12-24,逐段核对日期、按起点核对返回的每一天曲线齐全(整天缺失无日历可判),`all` 按起点核对每天曲线是否齐全 | | 11 宏观利率 | `repo_fixing_rates` | 中国货币网 | 新源 | FR 约近 3 年、FDR 约近 1 年 | | 11 宏观利率 | `lpr_history` | 东财 | 已有源的新端点 | 1 年 / 5 年全历史 | | 11 宏观利率 | `macro_calendar` | 华尔街见闻 | 复用新源 | 公布值 / 预期 / 前值 | | 13 期货 | `futures_daily` | 上期所、上期能源、郑商所、中金所、广期所 | 5 个新源 | 大商所官网有 JS 反爬(HTTP 412),未接入 | | 13 期货 | `options_daily` | 同上 | 复用新源 | 商品期权与股指期权;Delta 为交易所公布值;隐含波动率上期所 / 上期能源按系列、郑商所 / 广期所按合约;中金所两项都不公布(2026-09-18 实测 692 行全空) | | 13 期货 | `futures_position_rank` | 上期所、上期能源、郑商所、中金所 | 复用新源 | 广期所、大商所未接 | | 13 期货 | `futures_realtime` | 新浪 | 已有源的新端点 | 覆盖六家交易所,大商所品种只能走这里 | | 13 期货 | `a50_futures` | 新浪 | 已有源的新端点 | 富时中国 A50 连续合约 | | 13 期货 | `sge_spot` | 上金所 | 新源 | 黄金 / 白银 / 铂金现货日线 | | 14 事件 | `earnings_forecast` · `institution_survey` · `holder_trades` · `share_buyback` · `equity_pledge` · `ipo_calendar` | 东财 datacenter | 已有源的新端点 | 统一严格模式:「返回数据为空」给空表,其他错误码抛错;**`equity_pledge` 只覆盖沪深** | | 15 可转债 | `convertible_bonds` | 东财 datacenter | 已有源的新端点 | 摘牌日不晚于今天才算已摘牌、上市日不晚于今天才算交易中(东财会提前填上未来的日期,2026-09-20 实测 113710 上市日为 09-23);退市板块转债(404xxx)没有上市日和摘牌日,按交易市场判为已摘牌;判断不了的标 unknown | 沿用仓库的**能力入口计数**:新增 25 个公共函数,60→85(主入口 55→80,备胎仍为 5);层数 12→15;来源 22→34。 新增 12 个来源:通达信官网、华尔街见闻、央视网、上证e互动、中债、中国货币网、上期所、上期能源、郑商所、中金所、广期所、上金所。 腾讯、新浪、东财、沪深交易所已在原来的 22 个来源里,不重复计数。`to_joinquant()` 是代码转换辅助函数,不计入。 ## 可复查的端点发现线索 - [AKShare](https://github.com/akfamily/akshare):期货交易所日行情、持仓排名、上金所、中债、货币网等端点格式 - [jing2uo/tdx2db](https://github.com/jing2uo/tdx2db):通达信官网盘后包地址与 `.cod` / `.md1` 布局 - [Xiaoyuan-Liu/national-team-position](https://github.com/Xiaoyuan-Liu/national-team-position):上交所 ETF 份额归档接口 实现直接访问提供方域名,未增加这些项目作为依赖。 ## 本机真实数据验证 运行环境:macOS,Python 3.9.6,2026-09-20。数据日期用 2026-09-18(周五)。 | 请求 | 返回行数 | 检查 | |---|---:|---| | `tencent_kline("600519", start="2025-01-01")` | 417 | 自动分段、日期去重 | | `tencent_kline("300750", period="m5", count=96)` | 96 | 分钟线换手率按基点 ÷100 | | `tdx_daily_package("2026-09-18")` | 52314 | 沪 27810 / 深 24128 / 京 376;600519 收盘 1257.12、000001 收盘 11.70、300750 收盘 301.95,与 `tencent_kline(adjust='')` 一致 | | `tdx_daily_package("2022-01-04")` | 21726 | 没有北交所文件,只返回沪深;深市 00/30 股票 2563 只都在,比现在少的是 19/10 开头的债券回购代码;000001 收盘 16.66、300750 收盘 568.88,与腾讯不复权一致 | | `sina_research_reports("600519")` | 38 | 标题、机构、研究员 | | `sina_research_reports("920982")` | 39 | 函数自动加 `bj` 前缀;只给数字时新浪返回「没有找到」 | | `etf_shares("2026-09-18", "SH")` | 912 | 上交所日度归档 | | `wallstreetcn_lives("a-stock-channel", limit=50)` | 50 | 频道与翻页游标 | | `cctv_news("2026-09-18", with_content=False)` | 14 | 条目列表 | | `st_stock_list()` | 208 | 沪 83 / 深 122 / 京 3;当次 push2 经代理失败,自动切到 push2delay | | `sse_e_interaction("600519")` / `("600000")` | 0 / 4 | 600519 页面本身写着近 1 个月暂无回复 | | `chinabond_yield_curve("2026-01-01", curve="all")` | 534 | 三条曲线 | | `repo_fixing_rates("FR")` | 748 | 2023-09-18 至 2026-09-18 | | `lpr_history()` | 1537 | 1 年 / 5 年 | | `macro_calendar("2026-09-14", "2026-09-20")` | 195 | 公布值 / 预期 / 前值 | | `futures_daily(d, ex)` SHFE / INE / CZCE / CFFEX / GFEX | 238 / 63 / 243 / 28 / 48 | 上期所 / 上期能源 / 郑商所核对文件里的交易日;中金所 CSV 没有交易日列,用同目录 `index.xml` 每行的 tradingday 核对,并逐合约比对成交量 / 收盘价 / 持仓量(2010、2015、2022、2026 年实测两者逐合约一致);广期所行里没有交易日字段,核对它回显的请求参数(周六请求返回空表并报「非交易日」,不会回退到最近交易日) | | `options_daily(d, "SHFE")` / `("CFFEX")` | 6546 / 692 | Delta、隐含波动率 | | `futures_position_rank(d, "CFFEX", symbol="IF2610")` | 20 | 前 20 名会员;全市场 8 个品种 440 行。2015-04-15 旧文件(排名段前还有会员类别合计段)120 行、只含当时已上市的 IF / TF / T;2010-04-16 首日 20 行 | | `futures_realtime(["RB0", "M0", "IF0"])` | 3 | 含大商所豆粕 | | `a50_futures()` / `sge_spot("Au99.99")` | 1 / 2368 | | | `earnings_forecast(report_date="2026-09-30")` / `institution_survey("688062", detail=True)` / `holder_trades(direction="减持", start="2026-09-01")` / `share_buyback(progress="实施中")` / `equity_pledge()` / `ipo_calendar(limit=30)` | 108 / 500 / 311 / 371 / 2212 / 30 | 机构调研为单只股票的逐机构明细,其余为全市场;质押 2212 条中没有北交所 | | `convertible_bonds()` | 317 | 代码唯一,状态按上市日、摘牌日与交易市场判断;314 只交易中、3 只 upcoming,退市板块 5 只不在默认结果里 | 实现过程中实测发现并修复的问题(均已加回归测试): - 腾讯 K 线对北交所只返回最新 1 根日线,区间和分钟线为空(920021 / 920982 / 920185)。函数改为遇北交所直接报错,指向 §1.6。 - 新浪研报查北交所必须写 `bj920982`,只给数字会得到「没有找到」空页,看起来像该股没有研报。 - 质押统计全市场 2212 条没有一只北交所;北交所代码改为报错,不返回空表。 - 2022-05-06 之前的通达信盘后包没有北交所文件(二分实测 2022-05-05 没有、2022-05-06 有),原实现会整包报错。 现在只对这之前的日期放行,之后缺北交所文件报错,不把沪深当成全市场。 - 盘后包不是只保留最近一段:最早能取到 2021-08-16(2021-08-02 返回 404),2022-01-04、2023-01-03 都能取到。 11 个包里各市场有价记录的最小值为沪 16202、深 3641(2022 年以前深市大部分代码当日无价)、京 87,函数按沪 1 万 / 深 3000 / 京 50 设下限, 代码表与行情块条数一致、代码和块序号都不重复、代码全是 6 位数字、价格与成交额没有 NaN / inf(11 个包实测均如此),函数对这几条都做了核对。 - 上交所 ETF 份额接口把每页压到 2000 条(请求 10000 也回 `pageSize=2000`),2026-09-18 共 912 条;函数要求条数等于 `pageHelp.total`。 - 新浪研报每页序号都从 1 编起;翻过末页、以及没有研报的股票,页面都写「没有找到相关内容」。上证e互动问答为空时,公司维度写「近1个月暂无回复 / 暂无提问」, 全市场翻过末页写「暂时没有问答内容」。华尔街见闻宏观日历 31 周 5976 条没有重复 id。 - 中金所、广期所的数据地址只能走 HTTP:2026-09-20 用 curl 8.7.1 与 Python requests 实测,中金所 443 握手即断(SSL_ERROR_SYSCALL), 广期所 443 返回的是 `*.unionpayintl.com` 的证书。交易日靠来源自己核对:中金所日行情 / 期权用同目录 `index.xml`,持仓排名用行内交易日,广期所用回显的请求参数。 - 通达信 F10 只剩「最新提示」一类(内置 10 台服务器逐台实测)。§6.2 示例原来写死 9 个类别名,请求不存在的类别时 mootdx 返回 dict, 切片直接 TypeError;现改为先用 `F10C` 列出实际类别,`tdx_client(check='finance')` 同时核对财务快照、类别表里有「最新提示」、并实际读出非空正文(000001 实测 21494 字)。 - 上金所行情 7 个品种约 1.5 万条记录价格全是数字,无成交的时段填 0;函数剔除 0,空值 / NaN 报错。 - 广期所返回里没有 `delivMonth` 的只有小计 / 总计行(2022-12-22、2026-09-18 实测;周六只回一行总计),合约行缺这个字段报错,不当成非交易日。 ## 验证方法 ```bash python3 -m unittest discover -s tests -v ``` 离线测试从 SKILL.md 里取出发布代码直接执行(定义 `get_prefix` / `norm_ticker` / `to_joinquant` / `em_get` / `bs_session` / `tdx_client` 的代码块,加上 16 个 `v39-*` 标记块),不访问网络。 `tests/test_v39_sources.py` 新增 115 条(114 条离线 + 1 条联网,联网默认跳过),覆盖 #52 验活分流、#55 聚宽代码、盘后包解析、腾讯三入口切换与实际来源、东财空结果与错误码区分及翻页不完整、网络与非 JSON 错误、来源数值与日期认不出、 宏观日历零值与整周缺失、东财翻页满页与总条数、深交所 ETF 与东财 clist 翻页途中快照变化、腾讯分段缺字段、ST 名单沪深与北交所都不能为空、上期所剔除能源品种的对照文件、 中金所已上市品种缺文件与表头列顺序、中金所日行情 index.xml 交易日核对、广期所请求回显、中债曲线段内日期与齐全性、宏观日历段内日期、 腾讯复权 key 优先与段内日期、深交所 / 东财页数总数拒收布尔值、东财 payload / data 结构、上证e互动公司列表结构与末页标记、盘后包压缩损坏、 盘后包各市场下限、代码格式、代码 / 序号唯一与非有限数值、腾讯与宏观日历重复条目、腾讯价格空值 / NaN 与行结构、事件驱动逐行核对筛选条件、上证e互动问答空结果提示、新浪研报整页解析、上交所 ETF 总数、 数值字段拒收布尔值、可选行列表的 falsy 结构、上期所 / 广期所 / 上金所 / 华尔街见闻快讯的返回结构、盘后包名称解码、上证e互动时间字段、ETF 份额与 LPR 的空值、品种字母与持仓排名表头、新浪无变量页、宏观日历参数、ST 名单只在连不上时退到 baostock、F10 验活(类别与正文)、参数组合检查(质押、期货实时、宏观日历区间)、可转债状态、显式沪市指数代码、北交所边界,以及 Python 3.9 语法。 每个修复都做过变异检查:把修复改回去,对应测试会失败。八轮审计的修复,加上三次复跑变异时自查发现的问题(腾讯行结构变成对象时会漏出 `KeyError`;分钟线与中债曲线的测试断言太宽,被逐行异常转换顶替),共 209 处,发布前在最终代码上复跑适用的 190 处:186 处全部失败;4 处改坏后仍被另一道检查拦住,属于双重保护(东财第 1 页空页检查被「非末页必须满页」拦住,质押按代码查询的指数代码拦截被 `_em_event_filter` 先拦住,期权 `INSTRUMENTID` 存在性检查被逐行读取加统一异常契约拦住,ST 名单改回 `.get()` 读字段被同一处的代码 / 市场号 / 名称校验拦住);其余 19 处针对的代码已在后续轮次重写,由新一轮变异覆盖。 联网测试需显式启用,日期须是源已发布数据的交易日: ```bash ASTOCK_LIVE_V39=2026-09-18 python3 -m unittest tests.test_v39_sources -v ``` 本次没有重跑旧版 60 个入口的全部真实请求;它们的历史验证日期保留在原章节。 ## 未接入 | 候选 | 原因 | |---|---| | 大商所官网日行情 | JS 挑战型反爬,纯 HTTP 返回 412;大商所品种用 `futures_realtime` | | easy_tdx(PR #54) | 同一通达信协议的另一个客户端库,不是新的数据源 | | 开盘啦 | App 私有接口,需要伪造设备号 | | 乐咕市场宽度 | 第三方统计页面,字段抽取不稳定 | | 需要注册或 Key 的平台 | 不符合零注册原则(iwencai 为历史例外) |