累计成交量加权平均价查询

问题描述 投票:0回答:1

我想使用 QuestDB 计算累积 VWAP。当我使用内置

vwap
函数时,我会获得整个表格的 VWAP(如果我不使用
SAMPLE BY
),或者当我使用
SAMPLE BY
时获得每个间隔的 VWAP:

 SELECT 
          timestamp,  symbol, 
          vwap(price, amount)
     FROM trades
     WHERE timestamp IN yesterday()
     AND symbol = 'BTC-USDT'
     SAMPLE BY 10m;

查询给出的结果与我自己计算每个间隔的结果相同:

  SELECT 
          timestamp,  symbol, 
          SUM(amount * price) / 
          SUM( amount) 
     FROM trades
     WHERE timestamp IN yesterday()
     AND symbol = 'BTC-USDT'
     SAMPLE BY 10m;

在两个版本中,结果是相同的,并且仅限于每个时间间隔,而不考虑当天迄今为止的所有交易。我宁愿有一个累积 VWAP,其中每一行都使用从当天开始到该特定行为止看到的值,因为这为我提供了更好的趋势指标。

database time-series questdb
1个回答
0
投票

窗口函数来救援!

使用窗口函数时,我们可以定义一个窗口框架,该窗口框架可以从查询中的行的开头一直到当前行。虽然 QuestDB 没有

vwap
函数的窗口版本,但它提供了
SUM
函数
OVER
行窗口,这就是我们所需要的

WITH btc_usdt AS (
    SELECT 
          timestamp,  symbol, 
          SUM(amount) AS volume, 
          SUM(price * amount) AS traded_value
     FROM trades
     WHERE timestamp IN yesterday()
     AND symbol = 'BTC-USDT'
     SAMPLE BY 10m
), cumulative AS ( 
     SELECT timestamp, symbol, 
           SUM(traded_value)
                OVER (ORDER BY timestamp) AS cumulative_value,
           SUM(volume)
                OVER (ORDER BY timestamp) AS cumulative_volume
     FROM btc_usdt
)
SELECT *, cumulative_value/cumulative_volume AS vwap FROM cumulative;   

在这里,我首先以 10 分钟为间隔对交易量和交易价值进行定期

SUM
统计,但我们可以调整为我们喜欢的任何时间分辨率。然后在下一个 CTE 中,我计算每 10 分钟间隔的交易量和价值的累积
SUM
,但考虑到之前的所有行,因此我们得到了两者的运行总计。在外部查询中,我们只需将cumulative_value除以comulative_volume,就可以得到预期的累积VWAP。

© www.soinside.com 2019 - 2024. All rights reserved.