股小仙(四):免费行情接入——GBK、波浪号与 68 个字段 股小仙系列第四篇也是最短的一篇——讲一段只有 20 行的代码。但这段代码浓缩了三个值得展开的点一个不稳定官方接口的替代品怎么选、一个反直觉编码的坑、一个用魔法下标从密文里取数的黑科技。行情数据是持仓系统的最后一块拼图没有现价可卖判定和浮盈都是死的。一、行情源选型为什么是腾讯个人系统接行情候选无非几个方案门槛稳定性券商/同花顺官方接口要登录态/签名随时变随手记系列就是血泪Tushare 等聚合库注册积分制接口配额变动频繁新浪/腾讯公开行情无需任何 key多年稳定非官方但事实标准选了腾讯qt.gtimg.cn。理由很功利无需注册、无配额、一次 HTTP GET、字段里直接带 52 周高低价——最后一点是决定性的因为波段计划A3 篇需要 52 周分位其他免费源大多只给现价。风险也明说这是非官方接口没有 SLA字段位置可能变。对策放在代码里——后面讲容错降级。二、市场前缀一行代码的市场判断prefixshifstock_code.startswith((6,5))elseszurlfhttps://qt.gtimg.cn/q{prefix}{stock_code}_{int(datetime.now().timestamp())}000A股代码首位数字决定交易所归属6 开头沪市主板、5 开头沪市 ETF/基金其余0、3 开头默认深市。这个映射不完美1 开头的深市基金会被误判但对主板股票 场内 ETF的个人持仓场景一行startswith((6,5))足够——代码的精度应该匹配场景的精度而不是匹配通用性。URL 末尾的时间戳参数_是经典防缓存手法行情接口的响应会被中间层缓存加个每次都变的参数强制回源。三、GBK一个以为灭绝了的编码respurlopen(url,timeout5)rawresp.read().decode(gbk)2026 年了还有接口用 GBK有而且是大厂的老接口——历史包袱让它没法改编码。坑点在于不指定编码时 Python 默认按 UTF-8 解报错还算幸运更阴的是部分字节恰好合法解出来中文名成乱码但数字字段正常——股价对、股票名是鎷熷皬鍏?你以为只是显示问题其实是整段解析已经不可信。所以decode(gbk)不能省而且要显式写。顺带一提券商导出的 xls 也是 GBKA1 篇会再遇到它国内金融数据的 GBK 渗透率远超想象。四、波浪号密文68 个字段与魔法下标响应长这样截断v_sh6009001~长江电力~600900~27.50~27.32~27.35~...(共 68 个字段)~33.10~24.80;按~切开取数partsraw.split(~)iflen(parts)68:pricefloat(parts[3])high_52wfloat(parts[67])ifparts[67]else0.0low_52wfloat(parts[68])ifparts[68]else0.0return(price,high_52w,low_52w)eliflen(parts)3:return(float(parts[3]),0.0,0.0)# 降级只有现价值得说的三件事1. 字段位置是考古出来的。这个接口没有官方文档全网流传的字段表是无数人抓包对照试出来的parts[3]现价、parts[67]52 周高、parts[68]52 周低。用魔法下标前必须做长度校验len(parts) 68——接口一改版数组变短没有校验就是 IndexError 裸奔。2. 两级降级设计。68 字段齐 → 返回完整三元组只有基本字段 → 返回现价 52 周置零解析彻底失败 → 返回(0.0, 0.0, 0.0)。下游A3 篇的分位计算对 52 周为零的情况已经写了回退逻辑退回用自有成交价算分位——每一层都假设上游可能残缺残缺时给出诚实的零值而不是抛异常。3.if parts[67] else 0.0的空串防御。某些字段在特定状态下是空字符串停牌、新股上市不足 52 周float()会炸。这个三元表达式是数据清洗的最小防御工事。五、超时与告警免费接口的正确姿势try:respurlopen(url,timeout5)...exceptExceptionase:print(f警告: 获取股价失败 -{e},filesys.stderr)return(0.0,0.0,0.0)三个细节超时必须设免费接口偶发挂起不设超时整个分析管线会卡死在行情上异常打到stderrstdout 留给结构化结果警告走错误流重定向时互不污染失败返回零值元组而不是 None调用方不需要判空三元组解构永远成立。免费接口的契约是尽力而为——代码结构要承认这一点超时、降级、零值返回三件套缺一不可。六、收尾20 行代码的三条原则精度匹配场景市场前缀一行判断不追求通用正确假设上游残缺长度校验、空串防御、两级降级、零值返回失败不传染行情挂了不该挂掉整个分析stderr 告警 零值继续跑。这个小模块是整个系统里最不起眼的但把它写稳之后两年里没为它改过一行——稳定性是给不起眼的代码的最高勋章。系列导航A1 数据底座券商流水入库与表结构排期中A2 买卖匹配引擎两轮匹配、贪心排序与幂等键的坑A3 网格层健康检测与波段加仓计划A4本篇免费行情接入