跳到正文

研究指南

加密现货研究

TWAP证据:重建价格背后的平均规则

时间加权均价只有在平均规则、端点与单位固定后才可解释。Uniswap v3先平均累计tick,再转价格,与直接平均显示价格不同;整数舍入和实际历史长度还会继续改变结果。

本题重建一个已报告平均数的测量过程,不证明现货可执行报价、不可操纵oracle或未来价格。

保留池身份与请求区间

记录网络、确切v3池、token0、token1、精度、观察区块和secondsAgo数组。币对反向会改变含义;今天用latest再查同样秒数,也不是重做过去观察。

v3 Price Oracles的Tick Accumulator部分解释累计tick差除时间得到平均tick,并对应几何价格平均。这个概念区别有用,但具体时间与取整要核实现。

本文固定读取OracleLibrary提交24ccf01的consult,以及core Oracle提交5ea68a7的observeSingle与transform。下面精确计算按这些代码,而不把概念页简化措辞直接当实现事实。

先理解理想几何平均

假设归一价格一持续三十秒、四持续三十秒。这里先用连续价格解释估计目标,不声称它们都被整数tick精确表示。

几何时间均值为exp((三十乘ln一加三十乘ln四)除六十),等于二;算术时间均值为(三十乘一加三十乘四)除六十,等于二点五。两种计算都可以正确,但回答不同问题。

若一持续三十秒、四持续九十秒,几何结果为四的九十除一百二十次方,约二点八二八四二七;算术为(三十加三百六十)除一百二十,等于三点二五。只数两个观测并等权,会丢掉持续时间。

保留时长表,不应只发布“均价”。相同两个价位、不同持续时间就足以改变结果,单看价格端点无法复算整个窗口。

重建整数tick主例

对精度相同、报价方向规定的两代币,设虚构active tick零和一万三千八百六十三,各持续三十秒。累计增加为零乘三十加一万三千八百六十三乘三十,等于四十一万五千八百九十tick秒;除六十得六千九百三十一点五。

计算结果
实际区间六十秒
累计tick差四十一万五千八百九十
未舍入平均tick六千九百三十一点五
固定consult返回整数六千九百三十一
一点零零零一的该整数次方约一点九九九八三六三四

tick一万三千八百六十三对应价格约三点九九九七四五三二,不是精确四。两tick未取整的几何结果约一点九九九九三六三三。应区分tick离散化与平均tick进一步取整,不把全部差额都叫显示舍入。

这些小数解释目标;实际报价路径还可能经过整数金额和其他取整。若比较的是收到多少报价单位,应保存精确方法与baseAmount,而不只保存浮点价格。

负数需要规定方向

固定consult代码先做除法,再将负且有余数结果向下调整,即向负无穷取整,不是向零截断。

设六十秒累计差负六十一,可由假设tick负一持续五十九秒、负二持续一秒得到。未取整为负六十一除六十,约负一点零一六六六七;规定整数是负二,向零截断却会给负一。

两者价格比约零点九九九八零零零三与零点九九九九零零零一。一tick差异来自计算政策,不是未经解释的市场变动。保存符号与余数,不能让电子表格默认舍入暗改结果。

累计tick是有符号量,active tick为负时可以下降,不能泛称它始终单调增加。真正需要的是次序正确的差值,以及适用整数和时间约定。

当前端点可以由代码构造

存储观察与请求端点返回值未必完全相同。固定core实现中,secondsAgo为零时,observeSingle可用当前active tick将最近存储观察transform到当前区块时间,并非普遍原样返回最后写入时间。

设时间戳一万请求[六十,零],目标起点九千九百四十。起点累计十万,九千九百八十存储累计十万四千,后续active tick一百。最后二十秒增加一百乘二十等于二千,当前累计十万六千。

正确差六千除六十,平均tick一百。如果用旧存储值却仍除六十,会得四千除六十,取整前约六十六点六六六七;若改除四十,则回答另一四十秒窗口,并非原六十秒问题。

因此保存请求数组、调用块时间与返回累计,不能只保存两个存储槽截图。有无最新交易不等于端点停止计时,代码可按规定规则延伸累计;应实际核方法行为,而非自行给数据附更新时间。

容量不等于已有历史

核最老已初始化观察及端点实际可取得性。固定core代码区分预备容量与初始化记录,扩大未来cardinality设置不会立即制造更长过去。

起点早于可用历史时,保留失败,不能缩短窗口后仍叫一小时均值。若较短区间另有价值,发布实际时长和原因,作为另一观察。请求失败也不是零累计差,更不能输出零价格。

价格历史与流动性另核。同样平均tick可由不同路径和in-range流动性历史产生;可用长窗口不独自说明全段流动性充足或抗操纵。不能把平均平稳当成每一瞬间都平稳。

读取原始槽时同时核initialized,不只取最小时间戳。固定grow逻辑为预备槽放置占位时间而仍未初始化,因此一个很小时间值不能证明可用观察延至遥远过去;应由真正初始化记录和请求结果建立覆盖。

两端价格无法重建中间路径

另设理想一百二十秒路径:前三十秒价格一,中间六十秒四,最后三十秒又一。两个端点都一,几何平均却是exp(六十乘ln四除一百二十)等于二,算术平均二点五。只把两个端点取平均会错得一。

累计量保存时长路径信息,两个价格截图没有。保留累计来源,不能声称稀疏端点足以重建同样均价。差异可能来自缺中间路径,而非oracle坏了;补充中间截图也需核持续多久,不能仅按截图数量等权。

对单独平均tick取整步骤,若未取整值在整数k与k加一之间,其精确均值比在一点零零零一的k次方和k加一次方之间。相邻比的乘法差为一点零零零一,即百分之零点零一。这只约束这一取整步骤,不能当成市场滑点、操纵或全部数值近似的总误差上界。

如果其他工具给接近但不同结果,先比较是否使用未取整均值、向零截断还是规定floor,再比较报价金额取整与精度。不要把所有残差都归到同一容差内,也不在不知道处理规则时自动挑更平滑序列。

报价单位核验

tick比值关联原始代币单位。若报价为每token0对应token1,人类单位比值等于原始比值乘十的(精度零减精度一)次方。本例同精度故意去掉这项;十八与六精度组合漏转换,会差十的十二次方尺度。

币对反向与精度换算要分别处理。不能先把显示价格倒数后,仍沿原方向使用金额单位;应保留原始比、方向及最终单位。比较两个工具时,先对齐这些字段,再追究小数差异。

独立单位例设原始比十的负十二次方,token0十八精度,token1六精度。一整token0有十的十八次方原始单位,按假设比对应十的六次方token1原始单位,也就是一整token1。漏掉十的十二次方尺度,就会把人类单位比一错报为十的负十二次方。这个例子不声称该比恰好落整数tick或能够真实成交。

对实际查询,把精度当有版本的资产证据。相同符号、不同合约不能共用另一币的精度;元数据不可读时不要按常见十八位补齐。保留原始tick计算结果并把显示换算列为待核,比输出错误的小数更可复查。

可执行核验表

检查保存材料失败处理
池身份网络、部署、顺序与精度先解决币对量纲
精确端点块时间与请求数组不混latest与历史
累计算术两累计、差与时长保留符号和分母
取整库版本、商、余数解释整数差异
真历史最老初始化记录与请求结果不把短窗口冒充长窗口
解释方向、单位、流动性背景不叫可执行深度

端点更正、实现不符、精度修订或历史记录补回后,应重核。一起发布重建窗口、未取整计算、实际整数和转换比,才能解释差异,而不把历史平均变成交易建议。

常见问题

平均tick是否等于价格算术平均?

不是。平均对数tick转价格对应几何平均,并叠加实现取整。

扩容是否立即提供更早历史?

不是。需检查已初始化观察与端点实际可用性,容量不创造过去测量。

相关阅读