美股盘前盘后行情接入:财报季跳空时,行情App涨跌幅按谁算

TickDB Research ·

美股财报季已经开始。不少公司在盘后发财报,行情在盘后、夜盘和盘前就走完了,K线第二天只留下一个缺口。同一时刻,苹果的涨跌幅可以有三个答案。这篇用真实数据拆开行情App在财报季最容易出错的6个地方,最后给一张设计清单和一段选价代码。

10月15日是台积电的财报日。当天美股开盘价415.10美元,比前一天收盘的430美元低了3.5%。

但这3.5%不是开盘那一刻跌出来的。从前一晚盘后到当天盘前,价格已经从430一路落到415附近。日K线上看不到这段过程,只能看到一个缺口。

image.png

接下来两周,奈飞10月20日盘后发财报,特斯拉和Meta 10月21日盘后,谷歌、微软10月28日,苹果11月2日盘后。这几天,美股App的流量最高,用户截图来问“为什么你家的涨跌和别家不一样”也最多。

同一时刻,苹果的涨跌幅可以是+0.50%、+0.68%,也可以是+1.18%。哪个都没算错,问题在于App没告诉用户它算的是哪一个。

下面6个场景,每个讲看到什么、为什么、怎么修。系列里的“价格身份证”有五格:品种、时段、算法、时间、状态,这篇讲时段和算法两格。

一、价格卡片只给一个数,没说是哪一段

美东时间10月15日06:24,我实测了一次苹果,同一时刻有四个“最新价”:

  • 常规时段收盘价 342.96(10月14日16:00)
  • 盘后最后价 345.00(10月14日19:59)
  • 夜盘收盘时的价格 345.75
  • 盘前最新价 345.28(10月15日06:24)

很多App的价格卡片只放一个大数字,不写是哪一段。美股一天有盘前、常规、盘后,再加夜盘,每段都有自己的最新成交。用户看到345.28,以为是“现在的价格”,旁边的K线却停在342.96,自然会觉得哪里不对。

怎么修:按当前时段选主价,旁边写清“盘前 06:24 美东”这样的时段和时间。其他几段用小字列在下面,让用户知道还有别的价格。

国内用户尤其需要这一条。北京时间白天正好是美股的夜盘,晚上是盘前和常规时段,凌晨是盘后。一天里打开App的不同时刻,看到的其实是四段不同的价格。

二、同一刻,涨跌幅有三个答案

还是那一刻的苹果:

  • +0.50%:常规收盘342.96对前一天收盘341.27,这是10月14日一整天的涨幅;
  • +0.68%:盘前价345.28对最近一个常规收盘342.96,这是盘前这一段的涨幅;
  • +1.18%:盘前价345.28对前一天收盘341.27。

第三个最误导。它把盘前价和前一天的基准混在一起,等于把10月14日的涨幅又算进了今天。而它最容易出现在“直接拿主报价的前收去算”的代码里。

原因在前收的切换时点。我在10月15日开盘前后各取了一次:开盘前,主报价里的前收还是前天的341.27;开盘后,它才切成342.96。盘前、盘后、夜盘的报价一直按342.96算。

image.png

怎么修:盘前、盘后、夜盘的涨跌,对比最近一个常规收盘;常规时段的涨跌另起一行,写清是哪一天的。

三、财报行情在盘后,K线第二天只补一个缺口

K线只含常规时段。10月15日美东06:24,盘前正在交易,苹果1分钟K线的最后一根还停在前一天15:59。

而财报季里,不少公司偏偏在盘后发财报。价格卡片在盘后、夜盘、盘前一直在动,K线一动不动,用户就以为App卡了。第二天开盘,K线直接跳一个缺口,前一晚发生的事全被压缩成一条空白。台积电从430到415的大部分下跌,就发生在这段空白里。

跳空之后也不一定沿着原方向走。摩根大通10月13日盘前发财报,开盘339.97,比前收334.30高1.7%;收盘却是331.43,跌了0.86%。

image.png

如果App只在开盘后推送“高开1.7%”,收盘时用户看到的是另一回事。盘前发财报的公司,跳空出现在开盘那一刻;盘后发财报的公司,价格在前一晚就开始走,两种情况K线上都只剩一个缺口。

怎么修:在K线上加一条“最新盘后价”参考线,或者在图上方标注“盘后 345.00(19:59 美东)”。让用户知道K线停了,价格没停。

四、盘后成交稀薄,提醒照样响

以苹果10月14日为例,盘后成交382.8万股,夜盘9.8万股,常规时段5,006万股。盘后成交不到常规时段的一成。

成交少,几笔单子就能把价格带走。价格提醒却还按同一个阈值触发,半夜一条“苹果涨超1%”推过来,第二天开盘可能根本不是这个价。

怎么修:盘后成交量单独显示,不要和常规时段加在一起;盘后触发的提醒写明“盘后成交,流动性低”,让用户自己判断要不要当真。如果产品允许,盘后的提醒阈值可以单独设,或者默认只在常规时段推送。

五、财报时间按美东说,11月2日起要多算一小时

苹果11月2日美股收盘后发财报,财报日历记为21:00(UTC),也就是美东16:00。

美国11月1日结束夏令时。之前,美东16:00是北京时间凌晨4点;从11月2日起,变成凌晨5点。如果代码里写死“美东加12小时”,苹果的财报时间就会显示成北京时间4点,实际是5点,早一个小时提醒,用户等了一个小时什么都没有。

怎么修:时间按时区名换算(America/New_York),不写死时差;财报日历里的“盘前/盘后”标记直接带进界面,详情页提前一天挂上“今晚盘后财报”。

盘前和盘后的区别也要写给用户看。摩根大通是盘前发,国内用户晚上打开App就能看到反应;苹果是盘后发,要等到北京时间第二天清晨。

六、同叫“盘后”,三个市场是三回事

  • A股的盘后固定价格交易在15:05–15:30,按收盘价成交,价格不会变;
  • 港股的收市竞价从16:00起约10分钟,竞价出收盘价;
  • 美股盘后16:00–20:00连续交易,价格一直在变,之后还有夜盘。

image.png

跨市场App如果统一用一个“盘后”标签,国内用户很容易以为美股的盘后和A股一样“按收盘价成交、不会再变”,结果拿着一个还在变的价格做判断。

怎么修:时段标签按市场来。常规、盘前、盘后时段从交易时段接口读,夜盘按交易所公告配置,不在前端写死。

财报季行情页设计清单

场景用户会看到的问题怎么修
价格卡片只有一个数,不知道是哪段主价按时段选,写清时段和时间
涨跌幅和别家App对不上延长时段对比最近收盘,常规涨跌另起一行
K线价格在动,K线不动加最新盘后价参考线
提醒半夜误报盘后成交量单独显示,提醒标注流动性低
财报时间换算差一小时按时区名换算,日历标盘前盘后
跨市场三个“盘后”混成一个时段标签按市场读取

读法:前三行管“显示什么”,后三行管“什么时候、在哪个市场”。数据来自10月13日至15日的实测。

怎么做

TickDB 为开发者和 AI 应用提供统一的全球行情数据接口,让团队通过一套接入获取多市场实时与历史数据,更快构建行情、分析和监控产品。

文中的价格、时间和财报日历来自它的三项能力:美股快照一次返回常规、盘前、盘后、夜盘四段报价,每段带价格、时间、成交量和自己的前收(pre_market_quote、post_market_quote、overnight_quote);财报日历带“盘前/盘后”标记;交易时段接口按市场返回当地时段。

下面这段代码按时间最新的一段选主价,涨跌对比各段自己的前收,并标出美东时间:

# 测试环境:Python 3.11 / 2026-10-16(用 10/15 两次真实快照验证)
# 用途:美股行情卡片按“当前时段”选主价,并标清时段、时间和涨跌基准
import os
from datetime import datetime
from decimal import Decimal
from zoneinfo import ZoneInfo

import requests

ET = ZoneInfo("America/New_York")
EXTENDED = {"pre_market_quote": "盘前", "post_market_quote": "盘后", "overnight_quote": "夜盘"}

def get_quote(symbol):
    r = requests.get("https://api.tickdb.ai/v1/market/ticker", params={"symbols": symbol},
                     headers={"X-API-Key": os.environ["TICKDB_API_KEY"]}, timeout=10)  # Key 只放服务端
    body = r.json()
    if body.get("code") != 0:
        raise RuntimeError(body.get("message"))
    return body["data"][0]

def pct(last, base):
    return (Decimal(str(last)) - Decimal(str(base))) / Decimal(str(base)) * 100

def price_card(q):
    # 常规时段:对比主报价自己的前收(开盘时才切到最近一个收盘)
    rows = [("常规", q["last_price"], int(q["timestamp"]), pct(q["last_price"], q["prev_close"]))]
    # 盘前/盘后/夜盘:对比对象里的 prev_close,即最近一个常规收盘
    for key, name in EXTENDED.items():
        s = q.get(key)
        if s:
            rows.append((name, s["last_done"], int(s["timestamp"]), pct(s["last_done"], s["prev_close"])))
    main = max(rows, key=lambda r: r[2])                      # 时间最新的一段做主价
    fmt = lambda r: f"{r[0]} {r[1]}  {r[3]:+.2f}%  {datetime.fromtimestamp(r[2] / 1000, ET):%m-%d %H:%M} 美东"
    return {"main": fmt(main), "others": [fmt(r) for r in rows if r is not main]}

if __name__ == "__main__":
    print(price_card(get_quote("AAPL.US")))

设置环境变量 TICKDB_API_KEY 后运行,Key 只放在服务端。用10月15日06:24的快照跑,主价输出“盘前 345.28 +0.68% 10-15 06:24 美东”,正是第二节里那个不误导的答案。


财报季的行情在盘后就走完了,App上的每个数字都要说清是哪一段、跟谁比。

今晚美股收盘后,打开自己App的苹果详情页看一眼:价格旁边有没有写时段,涨跌幅跟谁比。

相关文章

港股拟延长交易:TradingView做跨市场行情App,K线为何差一天

用 TradingView 开源的 Lightweight Charts 画腾讯10月14日的日K,图上显示的是10月13日。图表库没错,数据也没错,错在喂数据的那一步。我用真实行情把同一组数据喂了两遍,挑出跨市场K线最容易画错的10个地方,文末附一段能直接复制的喂数代码。 10月9日,香港证监会透露,香港正在研究延长证券交易时段,港交所第四季度会就现货市场延时发讨论文件。再过两周多,11月…

TickDB Research ·

谷歌开放AI自建应用:让AI写跨市场行情App要过12关

让 AI 写一个跨市场行情面板只要两分半,模拟数据下一切正常;接上真实接口,第一屏全是“数据获取失败”。我用同一个 AI 写了5份行情代码:不给资料的3份,在适用的检查项里错了27处;先让它查一遍真实接口的2份,只错1处。这是一份让 AI 写行情 App 的全景指南,12道关,附提示词模板和自检脚本。 10月13日,谷歌宣布:美国18岁以上的用户,可以用 Google AI Studio 让…

TickDB Research ·

跨市场行情应用的涨跌幅:同刻黄金−0.69%还是+0.24%

做跨市场行情App,最容易被用户截图投诉的,是价格旁边那个红绿百分比。同一刻、同一个金价,涨跌可以是−0.69%,也可以是+0.24%。本文拆解涨幅榜、价格提醒、持仓页、首页详情页4个最容易出错的场景,附一张跨市场分母清单。 做跨市场行情App,最容易被用户截图投诉的,往往是价格旁边那个红绿百分比。 2026年10月13日周二,北京时间10:56,黄金4,175.15美元。同一个价格,我按5…

TickDB Research ·

A股美股港股行情看板Demo三天、上线三个月:拆解7个返工点

同一张行情表,寒武纪的成交额自己算是5,414万元,接口给的是54.20亿元,差了100倍,原因只是一个单位。行情看板三天就能接通,上线后的返工,几乎都来自界面上说不清“自己是什么”的数字。 本文依据上交所、港交所的一手文件,加上10月12日盘中对7类资产的实测,给你四样东西: 一张“价格身份证”:每个数字上线前要答的5个问题 7个返工点逐条拆:钱在哪里算错、为什么会错 一份可以直接发给数据…

TickDB Research ·

自选股跨了A股港股美股,还在打开三个APP翻?盘中扫异动前,先定这五个字段

自选股四十只,A股港股美股都有,每天早上打开三个 APP 翻一遍。有天腾讯盘中跌了 3%,又弹回来,我在外面吃饭,完全没看到。下午再打开,只看到它跌了 2%。 这个 2% 是结果,不是过程。 问题不在我没有实时数据。问题在我看到的那个数字——涨跌幅——它只告诉我一个方向,没告诉我这个方向是怎么走出来的。 同一只股票,只看涨跌幅和看开高低收加成交额,你做出的判断可以完全相反。股票池越大,这个差…

TickDB Research ·