新闻详情

新闻详情

首页 / 资讯中心 / 详情

PanWatch marketdata 包拆解:一个 Symbol 值对象如何统一 A股、港股、美股代码

发布时间:2026/10/1 3:36:54来源:尧图网络
PanWatch marketdata 包拆解:一个 Symbol 值对象如何统一 A股、港股、美股代码
PanWatch marketdata 包拆解一个 Symbol 值对象如何统一 A股、港股、美股代码【免费下载链接】PanWatchPanWatch — AI stock monitoring for A-shares, HK US markets, powered by TradingAgents. Portfolio insights, real-time alerts automated reports.盯盘侠覆盖 A股/港股/美股的 AI 盯盘、持仓分析、实时提醒与自动报告。项目地址: https://gitcode.com/GitHub_Trending/pa/PanWatchPanWatch盯盘侠是一个覆盖 A股、港股、美股的 AI 盯盘项目其行情数据层独立在 packages/marketdata 包中。今天拆一个容易被忽略、却决定三市场统一成败的小文件——Symbol值对象它如何用一个不可变数据类替掉散落在各数据源里的腾讯前缀、东财 secid、yfinance 后缀等转换逻辑。为什么需要归一化同一只股票三种写法先看一个现实问题茅台、腾讯、苹果这三只股票在不同数据源里的身份证完全不同股票裸代码腾讯接口东财 secidyfinance贵州茅台600519sh6005191.600519不支持腾讯控股00700hk00700116.007000700.HK苹果AAPLusAAPL105.AAPLAAPL如果你同时接 3~4 家数据源做主备故障转移PanWatch 的 Engine 就是这么做的这些转换逻辑一旦散落在每个 vendor 里就会变成一排排if market HK的复制粘贴——改一处忘一处就是线上 bug。这正是Symbol要消灭的问题。模块开头的注释写得很直白跨市场股票代码值对象一处归一化替代散落各处的_to_market/前缀逻辑。完整定义在 symbol.py。Symbol 值对象一个 frozen dataclass 的解剖整个Symbol只有两个字段靠frozenTrue保证不可变——它是值对象不是实体dataclass(frozenTrue) class Symbol: market: Market # Market.CN / Market.HK / Market.US code: str # 裸代码如 600519不可变带来两个好处可以安全地做字典 key比如按市场分组、可以随手传参、不用担心被下游 vendor 悄悄改掉。自动识别市场三条正则 一个兜底Symbol.parse(600519)不传市场也能猜对靠的是三段规则symbol.py_CN_RE re.compile(r^[036]\d{5}$) # 6 位,0/3/6 开头 _HK_RE re.compile(r^\d{5}$) # 5 位数字 _US_RE re.compile(r^[A-Z.]{1,6}$) # 1-6 位字母(含指数 .DJI)600519→ 6 位、6开头 →A股00700→ 5 位数字 →港股AAPL→ 纯字母 →美股兜底6 位数字当 A股其余当美股当然猜测总有撞车的时候比如某些美股代码恰好是 6 位数字。所以parse支持显式传参Symbol.parse(00700, HK)显式市场优先级永远高于猜测。三个转换方法把方言翻译给各家数据源Symbol的三个转换方法就是给三家数据源说方言def to_tencent(self) - str: if self.market Market.HK: return fhk{self.code} if self.market Market.US: return fus{self.code} return _cn_exchange(self.code) self.code # sh/sz/bj 代码方法输入600519输入00700(HK)输入AAPLto_tencent()sh600519hk00700usAAPLto_eastmoney_secid()1.600519116.00700105.AAPLto_yfinance()不支持(被拦截)0700.HKAAPL注意港股在 yfinance 里的零填充细节00700→0700.HK。这类各家接口文档里不会主动提醒你的坑收敛在一个文件里最容易维护。A股的交易所前缀还有一套独立规则symbol.py920/83/87/88开头 → 北交所bj5/6开头或900→ 上交所sh其余 → 深交所sz。这套规则与宿主的 cn_symbol.py 保持一致避免两处漂移。谁在消费 Symbolvendor 层的单一入口Symbol不是摆设它是所有 vendor 的入参类型。以腾讯行情源为例tencent.pydef fetch(self, symbols: list[Symbol], config: dict) - list[Quote]: ... market symbols[0].market.value codes [s.to_tencent() for s in symbols]vendor 拿到的已经是解析好的值对象它只负责调to_tencent()翻译 → 发请求 → 解析成标准类型Quote。完全不需要关心代码长什么样。同样的模式贯穿各数据源东财资金流sym.to_eastmoney_secid()capital_flow.py东财报价/基本面sym.to_eastmoney_secid()eastmoney.py、fundamentals.pyYahoo K线sym.to_yfinance()kline.py跨市场自动分组quotes 的魔法来自这里marketdata 包最优雅的一个用法在 client.py 的quotes()md.quotes([600519, 00700, AAPL]) # 三个市场的代码混在一起传内部先Symbol.parse逐个识别市场再按市场分组每组各走一次 Engine 主备链groups: dict[str, list[Symbol]] {} for raw in symbols: sym raw if isinstance(raw, Symbol) else Symbol.parse(raw, market) groups.setdefault(sym.market.value, []).append(sym)调用方一行代码横跨三个市场识别、分组、路由全部自动完成。这套行为的回归保障在 test_symbol.py 里覆盖自动识别、显式市场、北交所前缀等场景assert Symbol.parse(00700).market Market.HK assert Symbol.parse(920001).to_tencent() bj920001 assert Symbol.parse(00700, HK).to_yfinance() 0700.HK值对象设计模式小文件里的大工程回头看Symbol不到 80 行代码却体现了几个经典的值对象实践单一事实来源市场识别规则只写一遍三个转换方法只写一遍全项目不再有第二份if market HK不可变 纯函数frozen dataclass保证转换方法幂等、可安全共享领域语言Symbol.parse(600519).to_eastmoney_secid()读起来就是自然语言新人五分钟能读懂整个文件可测试性不需要任何网络纯字符串断言就能锁定所有边界情况。小结packages/marketdata 包整体是可插拔数据源 主备故障转移的架构而Symbol是其中成本最低、收益最高的一块设计用一个不可变值对象把同一只股票在三家接口里的三种写法收敛到一处。如果你想给 PanWatch 加新数据源建议第一步就是读 symbol.py——它 20 分钟就能读完却能帮你避开所有市场前缀的坑。【免费下载链接】PanWatchPanWatch — AI stock monitoring for A-shares, HK US markets, powered by TradingAgents. Portfolio insights, real-time alerts automated reports.盯盘侠覆盖 A股/港股/美股的 AI 盯盘、持仓分析、实时提醒与自动报告。项目地址: https://gitcode.com/GitHub_Trending/pa/PanWatch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

/proc/self 深度解析:Linux进程自省的宝库 2026/10/1 4:37:50

/proc/self 深度解析:Linux进程自省的宝库

1. 为什么每个Linux开发者都应该搞懂 /proc/self如果你用过Linux一段时间,一定见过或者无意中碰到过这个路径:/proc/self/。无论是写系统监控脚本、排查线上进程异常,还是做内核态文件系统拦截、研究动态调试工具,它几乎无处不在。…

阅读更多 →
10分钟定位90%的Bug:一套系统化调试流程与实战方法 2026/10/1 4:37:50

10分钟定位90%的Bug:一套系统化调试流程与实战方法

上周遇到一个典型场景:现场反馈车机屏幕偶发闪退,日志传回来有十几万行。组里的新人同学打开文件就开始滚动找,找了一下午没头绪;我拿过文件先搜了error关键字,再翻到第一个error之前的最后一条正常日志,前…

阅读更多 →
AI初筛与人工深聊比例验证:从拍脑袋到数据驱动的实操指南 2026/10/1 4:37:50

AI初筛与人工深聊比例验证:从拍脑袋到数据驱动的实操指南

1. 先搞清楚"验比例"到底在验什么"AI初筛和人工深聊的比例"这个问题,十个团队里有八个是拍脑袋定的。老板说"AI先过一遍,能省不少人力",于是运营随手定了个"AI筛70%,人工聊30%"&#xff…

阅读更多 →
Rust集合类型详解:Vec与HashMap的底层原理与实战技巧 2026/10/1 4:37:50

Rust集合类型详解:Vec与HashMap的底层原理与实战技巧

说实话,写 Rust 写了这么些年,日常打交道最多的两个类型就是 Vec 和 HashMap。一个负责把数据排好队,一个负责把数据挂好牌,几乎任何项目里都离不开它们。但它俩的细节其实比表面看起来要多得多,尤其当你从 C、Python …

阅读更多 →
Kubernetes应用编排实践:从Helm多环境到GitOps回滚 2026/10/1 4:37:50

Kubernetes应用编排实践:从Helm多环境到GitOps回滚

简介:一份面向云原生开发、运维及架构设计人员的Kubernetes应用编排实践讲解PPT,围绕微服务架构下服务依赖关系管理、更新部署、多环境配置等核心问题展开;内容先梳理Kubernetes社区编排现状,深入分析Helm工具偏重包管理、语法复杂…

阅读更多 →
永磁同步电机无感FOC全速域控制:高频注入与滑模观测器切换策略 2026/10/1 4:37:43

永磁同步电机无感FOC全速域控制:高频注入与滑模观测器切换策略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉