示例:加权平均
成交量加权平均买入价和卖出价
给定一张包含价格和成交量的交易表,以下的 SQL 选择语句将把每个交易价格 Pn 与其前一个价格 Pn-1 进行比较。如果 Pn-1 > Pn,则为买入发起的交易;如果 Pn-1 < Pn,则为卖出发起的交易;如果 Pn-1 = Pn,则会与 Pn-2 或 Pn-3 等进行比较,直到找到最后一次价格变动。然后计算所有买入发起交易的成交量加权平均价格 VWAPB 和所有卖出发起交易的成交量加权平均价格 VWAPS:
SELECT seq_wavg( seq_filter( seq_trend(price) < 0, volume),
seq_filter( seq_trend(price) < 0, price) ) as VWAPB,
seq_wavg( seq_filter( seq_trend(price) > 0, volume),
seq_filter( seq_trend(price) > 0, price)) as VWAPS
FROM Security
此示例依赖于函数 seq_trend() 来确定所比较的价格是呈何种“趋势”;如果 Pn-1 小于 Pn,seq_trend() 将返回 -1,这表示“卖出”交易;如果 Pn-1 大于 Pn,seq_trend() 将返回 1,这表示“买入”交易。例如,考虑以下价格值序列:
{ 1, 2, 3, 3, 2, 2, 4, 5, 6, 5, 5 }
对于此序列,mco_seq_trend() 函数将生成以下结果序列:
{ 0, 1, 1, 1,-1,-1, 1, 1, 1,-1,-1 }
对 seq_filter() 的两次调用会返回仅包含那些价格趋势小于 0 的 VWAPB 元素和大于 0 的 VWAPS 元素的序列。最后,对 seq_wavg() 的调用会返回这两个序列的加权平均值。例如,给定 (价格,成交量) 值的序列:
{ (10.0, 100), (10.1, 150), (10.2,200), (10.2,300), (9.9, 90), (9.8,110)}
“买入”交易(Pn-1 > Pn)将来自以下配对:
(10.2,300) <> (9.9, 90)
(9.9, 90) <> (9.8,110)
“卖出”交易(Pn-1 < Pn)将来自以下配对:
(10.0, 100) <> (10.1, 150)
(10.1, 150) <> (10.2,200)
(10.1,150) <> (10.2,300)
那么得出的值将会是:
VWAPB = (9.9 * 90 + 9.8 * 110) / (90 + 110) = 9.845
VWAPS = (10.1 * 150 + 10.2 * 200 + 10.2 * 300) / (150 + 200 + 300) = 10.177
要使用 xSQL 演示此选择语句,可以从 samples/xsql/scripts/financial 目录中运行以下命令来执行示例脚本:
x 2