QVeris
产品

同一只茅台3家数据源3种成交量——你的AI正在算错仓位

2026年6月3日·1 分钟阅读·QVeris Team
同一只茅台3家数据源3种成交量——你的AI正在算错仓位
同一只茅台3家数据源3种成交量——你的AI正在算错仓位

QVeris · 数据实测

如果 Al Agent 告诉你"茅台今天只成交了 30,837 股,几乎没人交易",你会相信吗?

2026 年 6 月,现在立刻打开你的 AI 助手查一次试试——它没说谎,数据源确实返回了 30,837。但是它不知道,这个数字的单位是"手",不是"股"。差了整整100倍。

而这样的陷阱,A 股数据里至少有3个。

2026 年 6 月 3 日 11:49,我们同时调了三家 A 股行情源

如果你现在打开三个主流 A 股数据源的 API,同时查贵州茅台(600519)——下面是你会拿到的三份答案:

价格完全一致。涨跌幅完全一致。

然而成交量差了整整三个数量级——30,837 vs 3.08 vs 3,083,729。

这不是数据源的 bug。30,837 手 × 100 = 3,083,700 股 ≈ 3.08 万手。三家说的是同一件事,但没有人告诉你的 AI Agent,"手"和"万手"和"股"不是同一个单位。

仓位误判:Agent 不会自己发现

现在想象这个场景:你的 AI 金融助理接到任务——"帮我算一下茅台今天的换手率"。

它调了 cn_financial_pro 的 API。返回 volume: 30837。HTTP 200。JSON 格式正常。数字有效。换手率 = 成交量 ÷ 流通股本 = 30,837 ÷ 12.5 亿 ≈ 0.0025%。它告诉你:"茅台今天换手率极低,几乎无人交易。"

然而实际的换手率是 0.25%。Agent 少算了 100 倍。

这错在哪?Agent 不认得"手"。

A 股统一规定 1 手 = 100 股——这是每个散户看一眼就知道的常识。但美股没有"手"。港股"手"的定义每只股票不一样。一个在全球数据上训练出来的 AI,天然没有"手"这个概念。

更致命的是——API response 里没有任何字段注明"volume 的单位是手"。它只有一个裸数字 30837。Agent 拿到这个数字,只有一种处理方式:当成"股"。

比"手"更可怕的:成交额是一个中文字符串

成交额的陷阱比成交量更隐蔽。cn_financial_pro 返回的是纯数字 3966577000——可以直接除以上市公司总股本,算出市值之类的衍生指标。但恒生聚源返回的是 "39.67亿元"——一个中文字符串。

当 Agent 读到 "39.67亿元" 时,它会做什么?

三种错误,没有一种是对的:

1.解析失败,直接报错 → 你的整个分析流程被卡住

2.当成文本,原样输出 → "茅台成交额 39.67亿元" —— 你没法拿这个文字做对比分析

3.最致命的一击:当成数字 39.67 → Agent 静默地把 ¥39.67 当成成交额,而实际是 ¥3,967,000,000。差了一亿倍,Agent 不报错、不提醒、甚至不犹豫

这三种结果,没有一种是因为数据错了。数据本身完全正确。"39.67亿元"就是一个正确的成交额。问题出在:API 协议和 AI Agent 之间,缺了一层"格式翻译"。

**
**

后缀的静默陷阱:HTTP 200 + 空表格 = Agent 以为"没有数据"

测试中还有一个更隐蔽的发现。用 600519(不带后缀)调 caidazi → HTTP 200,返回一张格式完整的表格——但数据行空空如也。用 600519.SH 再调 →所有数据完好无损地出来了。

Agent 看到的:HTTP 200 → "调用成功" → 无数据行 → "茅台今天没有行情数据" → 跳过这只股票,继续往下算。

它永远不会告诉你"ticker 缺了 .SH 后缀"。 它只会报告"没查到"。你永远不会知道这只股票的数据其实完好可用——你只是用错了它的方言。

这就是静默失败。不打断你的工作流,只是悄无声息地让你的分析结果不完整。比报错危险得多。

好消息藏在坏消息里:三家供应商的价格完全一致

反过来看,A 股数据和美股数据有一个根本区别。测美股时,同一只 AAPL 在 Finnhub、Twelve Data、EODHD 上出现价格偏差——因为盘后价和收盘价的基准不同。

A 股这边,三家供应商在价格和涨跌幅两个最核心的维度上,做到了 100% 一致。 我们同时测了茅台、平安银行、宁德时代三只股票,每一只的所有供应商报价都分毫不差。

原因很简单:A 股有统一的交易所原始行情。各供应商本质上是同一份数据的二次分发,所以在"最新价"这个最硬核的指标上不存在分歧。

真正的问题不在数据本身的准确性。是数据的"包装"——单位、格式、字段名——每家都独立设计,彼此完全不通。

这个表格就是"供应商形态档案"的缩影。

每接入一家 A 股数据源,你就要在 Agent 里维护一份这样的映射。不维护?Agent 用默认解析器处理三家数据——这个表格的每一行它都会踩坑。

QVeris 的单位归一化:Agent 永远看不到"手"和"亿元"

上一篇文章讲了 QVeris 底座里的 ticker 方言翻译层。这一篇讲的是同一层的另一半——单位归一化引擎

每次调用,三件事自动在数据到达 Agent 之前完成:

归一化单位。 不管供应商返回的是什么单位——手、万手、股——底座统一转成"股"。cn 的 30,837 手 → 3,083,700 股。恒生聚源的 3.08 万手 → 3,080,000 股。caidazi 的 3,083,729 股 → 保持。Agent 拿到的永远是同一个单位。

解析字符串。 恒生聚源返回 "39.67亿元" → 自动解析为 3967000000。所有成交额在 Agent 面前统一是纯数字"元"。

检测空响应。 caidazi 返回空表格 → 底座自动标记 empty_result,附带原因提示("ticker 缺了 .SH 后缀")。Agent 收到的是明确的失败信号,而不是"没数据"的误判。

这三件事的维护成本在底座,不在 Agent。每接入一个新的 A 股供应商,QVeris只是多维护一份形态档案。Agent 什么都不用改。

Agent 不需要知道"手"是什么——就像你不需要知道海底光缆怎么走。

**
**

适用边界

实测覆盖:

✅ 3 家 A 股实时行情供应商 × 3 只股票(茅台、平安银行、宁德时代)

✅ 成交量单位差异(手 / 万手 / 股)

✅ 成交额格式差异(纯数字 vs 带中文单位的字符串)

✅ caidazi 的 ticker 后缀导致空响应

✅ A 股价格数据在供应商间的一致性验证

如果你想在 Agent 里用 A 股数据,不必给每家写一套单位转换器。QVeris 已经归一化了。你拿到的永远是以"股"为单位的成交量和以"元"为单位的成交额。

#QVeris#Agent