24 小时涨跌幅从哪一刻算起?两个地方对不上很正常

同一个币,交易所页面写着 +2.4%,行情网站写着 -0.8%,图表软件上又是第三个数。第一反应通常是「哪边的数据错了」。绝大多数时候答案是:都没错,它们算的不是同一段时间。「24 小时涨跌幅」这五个字在不同的地方指的是不同的东西,起点一换,数字自然就换了。下面把三种常见的起点拆开,再给一套自己动手确认的办法。
三种起点,三个数字
先把三种算法摆在一起看,差别一目了然:
| 你在哪看到的 | 它拿什么当起点 | 这个起点会不会动 |
|---|---|---|
| 交易所的行情接口和行情页 | 此刻往前推满 24 小时的那一刻 | 会,每刷新一次就往后挪一点 |
| 图表软件的日涨跌 % | 上一根日线的收盘价 | 不会,一整根 K 线期间都是同一个基准 |
| 标着「今日」的涨跌 | 某条日界(数据源自己定的零点) | 不会,但零点是谁的零点得看它怎么定 |
第一种叫滚动窗口。币安现货的公开行情接口在现货市场数据接口文档里就写成「24 hour rolling window price change statistics」,返回的数据带 openTime 和 closeTime 两个时间戳,标出这次统计到底覆盖了哪一段。窗口的两头都在往前走,所以你早上八点看到的「24 小时」和下午三点看到的「24 小时」,起点差了七个小时——被甩出去的是早的那一头:昨天早上八点到下午三点之间发生的事,下午三点那一次已经不算了。
第二种是 K 线的算法,和「小时」没关系。TradingView 在筛选器指标的计算说明里给了明确公式:涨跌幅 =(当前这根 K 线的收盘价 − 上一根 K 线的收盘价)÷ 上一根 K 线的收盘价 × 100,用的是你当前选的周期。也就是说,周期切成日线,它比的是今天这根和昨天那根的收盘;切成周线,比的就是这周和上周。它从头到尾没问过「24 小时前」是几点。
那所谓的「日界」到底在哪?这是第三个变量。TradingView 给自家图表库写的接数据规范里要求得很直白:日线、周线、月线这类 K 线的时间戳必须是那个交易日的 00:00:00 UTC,文档给的例子是「if a trading day is March 5, the DWM bar's time must be set to March 5, 00:00:00 UTC」;而分钟线这类日内 K 线的时间戳要跟交易时段对齐。加密市场不休市,「一天」这个概念本来就是人为划的一条线,不同数据源划在哪儿不必一致,更不必跟你手机上的零点重合。
价格本身也不完全一样
就算起点对齐了,分子分母里的价格也未必是同一个数。聚合行情站给的价格不是从某一家抄来的。CoinGecko 在方法论页面写明它的做法是:先按成交量取排在前面的一批交易对组成初始集合,剔除价格上的离群值,再对剩下的做成交量加权平均,得到最终那个价格。所以聚合站给你的是「全市场的一个加权结果」,交易所页面给你的是「这一家此刻的最新成交价」——两个数从定义上就不是一回事,能凑到小数点后两位反而奇怪。
刷新节奏是第二层。CoinGecko 的接口文档里标着数据更新频率:付费版约每 30 秒,不带 key 的 demo 版约每 60 秒。而交易所页面是秒级往前跳的。把一个可能已经放了几十秒的快照,和一个此刻的报价并排比,再拿去算百分比,差出零点几个百分点是结构性的,不是谁出了错。
第三层最容易被忽略:成交额那一栏也是算出来的。TradingView 的 24 小时成交量说明里写着,如果交易所给的成交量是以基础币计的(比如 BTCUSD 这一对给的是成交了多少个 BTC),它会用图上的价格把这个量乘成计价货币的量。你在页面上看到的「24 小时成交额」那个数,是一次换算的结果;换算用的价格不同,得数当然也不同。同一份原始成交,两个地方给出两个成交额,这就是原因之一。
本站首页那张表用的是哪一种
既然在讲这个,我们自己的口径也得摆出来。DYORly 首页那张主流币行情表,是你的浏览器直接去调公开接口填出来的,中间没有我们的服务器:
| 路径 | 取的接口 | 用到的字段 |
|---|---|---|
| 主路径 | 币安现货 /api/v3/ticker/24hr | lastPrice · quoteVolume · priceChangePercent |
| 兜底路径 | CoinGecko /coins/markets | current_price · total_volume · price_change_percentage_24h |
两条路给的都是滚动 24 小时口径,但来源不同、刷新节奏不同,所以它们之间本身就会有一点差。也因此,本站的数字和你手机上某个 App 对不上小数点后一位,属于预期之内。有三件事我们没做,也说清楚:不做平滑、不做二次加工、不在后端缓存结果。接口给什么就显示什么,主路径不通就换兜底路径,两条都不通就在表格里显示「行情暂时读取失败,请稍后刷新」,不会拿上一次的旧值填上去装作还在更新。
顺带一提,首页那张表是一份写死的主流币名单,按固定顺序排,不按涨幅重排——它不是一份按涨幅排序的榜。为什么不做涨幅榜,是另一个话题,涨幅榜是怎么排出来的那篇里讲。
三步确认你在看哪一种
不用记住每家的规则,现场判断只要三步:
第一步,读标签的字面。写「24h」的,基本是滚动窗口;写「今日」「日涨跌」「Today」的,基本是按某条日界算的。中文界面里这两个词经常混着用,别默认它们是一个意思。
第二步,切一下周期。在图表软件里把周期从日线切到 4 小时线。那个涨跌百分比如果跟着变了,说明它是按 K 线算的;如果纹丝不动,说明它独立于图表周期,是个滚动数字。这一步不用任何知识,切一下就知道了。
第三步,把光标停在最新那根 K 线上。读它标注的开始时间。那一刻就是这根 K 线的起点,也就是这个「今日」真正的零点。不用推算时区,直接读出来。
三步做完,你就知道手上这个百分比拿什么当基准了。剩下的规矩只有一条:比较必须同源。想比两个币谁涨得多,就在同一个页面上比;跨页面、跨 App 抄数字来比,比出来的差距里有一部分是算法差,不是行情差。想动手算清楚具体的百分比和回本关系,可以用涨跌幅 · 回本计算器,那里的输入是你自己填的,不涉及这些口径问题。
差多少算正常,差多少该警惕
这个问题没有一个通用门槛,但可以按币的类型分开看。大市值、多个市场都有像样成交的币,各家价格通常贴得很近,你看到的涨跌幅差异主要来自起点不同,而不是价格不同——这种情况下去追究「谁的价更准」意义不大。只有一两个地方有成交的小币就不一样了:价格本身就可能差出几个百分点,因为聚合站的加权结果里可能包含了你根本没在交易的那个市场。
真正值得停下来的是另一种情况:某个来源的价格明显脱离其他所有来源,同时那里的成交额很小。这多半不是发现了洼地,而是那个市场太薄,一笔不大的单子就能把价格推歪。CoinGecko 在方法论里专门写了要剔除价格离群值,防的就是这类数据污染整体结果。你自己看行情时也可以套用同一个思路:一个数字异常,先看它旁边的成交额撑不撑得住。
把这条和成交量一起看会更稳,成交量说明什么那篇讲了怎么读放量缩量。以上都是行情数据的读法说明,不构成任何投资建议。
编辑组说明:开头那组 +2.4% / -0.8% 是为了说明问题编的例子,不指向任何具体币种或平台。文中的接口字段名和文档口径,是按 2026-08-31 当天各家的公开文档逐条核对的,我们没有联系过任何一家的技术支持,也没有拿到公开文档以外的说法。接口和文档都会改,遇到不一致时以你当时看到的官方文档为准。本站首页的取数方式写的是当前源码里的真实情况。
常见问题
为什么交易所和行情网站的 24 小时涨跌幅不一样?
「24 小时涨跌」和「今日涨跌」是一回事吗?
两个地方的币价差多少算不正常?
接着读: 涨幅榜是怎么排出来的 · 涨跌幅怎么算 · 24h 振幅工具 · 看懂加密行情基础