核心摘要
免费延迟股票报价 API 通常足以满足产品演示、个人仪表盘、课程作业和低访问量研究工具的需求。
“实时”没有统一定义。务必核对交易所、报价时间、交易时段,并确认接口返回的是实时报价还是延迟报价。
最新成交价、买卖报价中间价、买一价、卖一价和前收盘价代表不同含义。每个产品场景都应明确采用哪一种价格。
缓存重复请求;接口允许时,批量查询多个股票代码;同时保留数据服务商适配层,以便日后切换服务商。
延迟报价适合用于解释市场而不是直接参与交易的产品,例如教学页面、上市公司信息页、低频投资组合摘要、内部原型,以及不依赖最近数秒行情的研究。它不应直接触发订单、承诺可成交价格、计算时效敏感的风险,或在未对齐时间戳时与实时行情比较。“延迟 15 分钟”描述的是数据何时可以发布,每秒轮询一次也不会让底层报价变得更新。
延迟股票报价应包含哪些字段
仅有股票代码和单一价格数值远远不够。可靠的应用还需要完整的行情信息,才能正确理解该价格的含义,并避免混用统计口径不一致的数据。
| 数据 | 应包含的字段 | 用途 | 常见误区 |
|---|---|---|---|
| 最新报价 | 价格、报价时间、币种、交易所、交易时段 | 自选股列表与报价快照 | 误将延迟数据当作实时数据 |
| 买一价与卖一价 | 买一价、卖一价、买一量、卖一量、报价时间 | 展示买卖价差与流动性 | 误将过时报价当作成交数据 |
| 交易时段信息 | 市场状态、前收盘价、涨跌额、涨跌幅 | 正确展示当日涨跌 | 混用正常交易时段与盘前、盘后时段 |
| 证券代码基础信息 | 标准证券代码、证券名称、证券类型、所属市场、交易状态 | 搜索与校验 | 混淆不同交易所使用的相同证券代码 |
| 延迟政策 | 延迟时长、适用场所、资产范围、交易时段例外 | 判断报价何时可以展示 | 假定所有场所的延迟时长完全一致 |
| 时间链路 | 市场事件时间、服务商发布时间、获取时间、时区 | 展示报价年龄并验证延迟 | 把 API 响应时间误当成报价发生时间 |
| 价格类型 | 买价、卖价、中间价、最近符合条件的成交价、官方或前收盘价 | 准确标注向用户展示的数值 | 把所有返回数值都称为“股票价格” |
| 展示状态 | 数据时点、延迟标识、开休市状态、陈旧阈值 | 防止用户误以为具备实时交易时效 | 只在提示框或条款页面中说明延迟 |
“免费”和“延迟”究竟意味着什么
将服务商公布的调用额度换算为实际负载:证券代码数量 × 刷新次数 × 用户数。即使每日配额看似充足,严格的每分钟突发请求上限仍可能导致调用失败。
免费行情可能存在延迟、仅提供日终数据,或对常规交易时段以外的行情覆盖有限。界面中应明确标注报价时间和延迟情况,避免让用户误以为这些报价具备实时交易所需的时效性。
一条报价即使按规定延迟 15 分钟,也可能因为证券长期未成交、市场休市或数据源停止更新而更旧。因此,应同时记录规定延迟和实际报价年龄。
确认报价来自综合行情、单一交易所、另类交易场所,还是服务商聚合结果。单场所的延迟最新成交价,可能与全市场延迟参考价不同。
核对署名要求、延迟说明用语、展示位置及哪些用户有权查看,并把数据时点和延迟状态直接放在价格旁边,不能只写在法律条款中。
收盘后发布的每日收盘价并不等于持续滚动的延迟报价。应分别在交易时段和收盘后测试,让应用能够区分延迟盘中价、官方收盘价和前收盘价。
如何可靠集成免费延迟股票报价 API
将各数据服务商特有的响应映射到自己的 Quote、Bar 和 Instrument 模型。保留原始响应载荷用于排错,但不要让服务商字段名散布在产品代码中。
日终历史行情应设置远长于盘中报价的缓存时间。制定明确的数据时效规则,并合并并发的相同请求,以免过快耗尽免费调用额度。
拒绝时间戳不成立、价格为负、币种不一致、K 线重复或时区偏移意外变化的数据,并记录数据服务商和数据获取时间。
将买价、卖价、最新成交价、官方收盘价、前收盘价、来源场所、事件时间、延迟类别、服务商发布时间和获取时间分别保存,不能都塞进一个通用价格字段。
以高于数据发布时间的频率轮询只会浪费配额。应按证券和价格类型缓存到下一条数据可能发布的时刻,同时为失败重试设置更短且独立的策略。
界面应明确显示延迟、数据时点、市场休市、报价陈旧、暂不可用和覆盖不完整等状态,不能给缓存价格配上刚刷新页面的时间。
在代码和制度上把延迟行情服务与订单路由、时效敏感提醒分开,避免后续功能误把低成本展示行情用于交易决策。
验证开盘、提前收盘、常规收盘、夏令时切换、停牌,以及延迟事件恰好可以发布的时刻,并把事件时间与预期发布时间对照。
代码示例:区分规定延迟与行情异常陈旧
下面的校验器将四个时点分开处理:市场事件何时发生、延迟报价何时具备发布资格、服务商何时发布,以及应用何时获取。陈旧阈值只是在市场开市期间使用的产品规则,并不意味着每只证券都必须持续成交。
from datetime import datetime, timedelta
def parse_time(value: str) -> datetime:
return datetime.fromisoformat(value.replace("Z", "+00:00"))
def classify_delayed_quote(quote: dict, now: datetime,
stale_after_minutes: int = 5) -> dict:
event_time = parse_time(quote["event_time"])
release_time = parse_time(quote["provider_release_time"])
retrieved_at = parse_time(quote["retrieved_at"])
delay = timedelta(minutes=quote["delay_minutes"])
eligible_at = event_time + delay
if quote["price"] <= 0:
return {"status": "invalid", "reason": "non_positive_price"}
if not event_time <= release_time <= retrieved_at <= now:
return {"status": "invalid", "reason": "timestamp_order"}
if release_time < eligible_at:
return {"status": "invalid", "reason": "released_before_eligible"}
quote_age = now - event_time
allowed_age = delay + timedelta(minutes=stale_after_minutes)
if quote.get("market_status") == "open" and quote_age > allowed_age:
return {"status": "stale", "age_seconds": int(quote_age.total_seconds())}
return {
"status": "usable_delayed",
"eligible_at": eligible_at.isoformat(),
"age_seconds": int(quote_age.total_seconds()),
}测试状态,不能只测试价格。若事件发生于 14:30Z,规定延迟 15 分钟,服务商于 14:45Z 发布,应用在 14:45:02Z 获取,这是一条有效的延迟报价。若市场仍在交易,同一事件到 14:55Z 才返回,在五分钟宽限规则下就应标记为陈旧。市场已休市或证券停牌时,应如实展示相应状态,而不是虚构一条更“新”的价格。
何时用 QVeris 查找延迟报价工具
QVeris 可帮助开发者和智能体查找并评估具备金融数据调用能力的工具,以便在接入应用前比较各工具能够返回哪些数据。
- 查找支持报价、OHLCV、历史价格、证券代码查询和公司行为数据的工具。
- 在通过代码或智能体调用工具前,核对工具的输入参数与返回结果。
- 将数据服务商的选择与应用内部的标准化数据模型解耦。
QVeris 可帮助应用按字段、证券、接入条件和公开限制筛选报价能力,但延迟披露、时间链路、交易场所解释、缓存时机、陈旧状态政策、许可合规,以及信息展示与交易执行的隔离,仍由应用方负责。
常见问题
有时可以,但不同服务覆盖的市场和交易所有所不同,数据使用权限与延迟情况也各不相同。不要只看“实时”标签,还应核对报价时间和数据许可条款。
部分 API 支持批量查询股票代码,另一些则每次只能查询一只股票。既要核对单次批量查询的股票数量上限,也要确认每只股票会占用多少免费额度。
通常表示符合条件的市场事件,要在事件发生后的规定延迟期结束后才能发布。不同场所、时段、字段和政策可能不同,因此必须查看延迟类别和时间戳说明。
它不应驱动时效敏感的下单决策,也不能代表可成交价格。在清楚展示延迟的前提下,可用于教学、信息展示和低频分析。
证券可能长期未成交,市场可能已经休市或停牌,某字段可能只在成交时更新,数据源也可能陈旧。应同时检查事件时间、规定延迟、发布时间和市场状态。
应展示价格类型、“延迟”状态、必要的数据来源或覆盖范围,以及按市场时区表示的数据时点。标识应紧邻价格,不能只放在页脚。
