我想使用 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,其中每一行都使用从当天开始到该特定行为止看到的值,因为这为我提供了更好的趋势指标。
窗口函数来救援!
使用窗口函数时,我们可以定义一个窗口框架,该窗口框架可以从查询中的行的开头一直到当前行。虽然 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。