窗口聚合函数
概述
与网格聚合函数一样,所有窗口聚合函数都接受一个整数间隔参数,并生成一个结果序列,其中包含每个间隔的计算聚合值。窗口聚合函数与网格聚合函数在确定其滑动窗口间隔方式上的差异在“窗口与网格聚合”页面中有描述。所有窗口聚合函数的结果都作为每个间隔的计算聚合值返回在结果序列中。与网格聚合函数一样,对象的序列会根据间隔参数的值拆分为间隔,该值确定组中的最大元素数量,但实际数量可能更少。因此,输入序列将被拆分为间隔元素的块,在这些块上执行操作。
函数 | 说明 |
---|---|
seq_window_agg_max(input, interval) | 返回每个元素窗口的最大值序列 |
seq_window_agg_min(input, interval) | 返回每个元素窗口的最小值序列 |
seq_window_agg_sum(input, interval) | 返回每个元素窗口的总和序列 |
seq_window_agg_avg(input, interval) | 返回每个元素窗口的平均值序列 |
seq_window_agg_var(input, interval) | 返回每个元素窗口的方差序列 |
seq_window_agg_var_samp(input, interval) | 返回每个元素窗口的样本方差序列 |
seq_window_agg_dev(input, interval) | 返回每个元素窗口的标准差序列 |
seq_window_agg_dev_samp(input, interval) | 返回每个元素窗口的样本标准差序列 |
seq_window_agg_ema(input, interval) | 返回每个元素窗口的指数移动平均值序列 |
最大值、最小值、总和、平均值、方差和标准差函数
seq_window_agg_max()、seq_window_agg_min()、seq_window_agg_sum()、seq_window_agg_avg()、seq_window_agg_var() 和 seq_window_agg_dev() 函数返回包含 12 个元素的序列,这些元素由 7 个元素的滑动块组成,其元素与样本量块中的值相对应。请注意,结果序列的前 6 个元素无效。(有关更详细的解释,请参阅“窗口与网格聚合”页面。)
以下是一个展示这些功能的示例脚本:
SELECT symbol, seq_search(day, 20130101, 20130331) as Q1_13,
volume@Q1_13 as "Volume_Q1_13",
seq_window_agg_max(volume@Q1_13, 7) as "max",
seq_window_agg_min(volume@Q1_13, 7) as "min"
seq_window_agg_sum(close, 7) as "sum",
seq_window_agg_avg(close, 7) as "avg",
seq_window_agg_var(close, 7) as "var",
seq_window_agg_dev(close, 7) as "dev"
FROM Quote WHERE symbol='SYM0';
symbol
Q1_13{}
Volume_Q1_13{}
max_Q1_13{}
min_Q1_13{}
------------------------------------------------------------------------------
SYM0
{20130101, 20130104, 20130106, 20130110, 20130123, 20130125, 20130129,
20130213, 20130214, 20130216, 20130311, 20130326}
{335, 808, 45, 402, 732, 48, 805, 450, 385, 420, 367, 69}
{335, 808, 808, 808, 808, 808,
808, 808, 805, 805, 805, 805}
{0, 0, 0, 0, 0, 0,
45, 45, 45, 48, 48, 48}
{335, 1143, 1188, 1590, 2322, 2370,
3175, 3290, 2867, 3242, 3207, 2544}
{47.857143, 163.285714, 169.714286, 227.142857, 331.714286, 338.571429,
453.571429, 470.000000, 409.571429, 463.142857, 458.142857, 363.428571}
{13741.836735, 82636.204082, 80784.775510, 81080.122449, 99185.918367, 94918.816327,
96397.387755, 94120.857143, 75180.816327, 53338.979592, 54100.408163, 56048.816327}
{117.225581, 287.465135, 284.226627, 284.745715, 314.937960, 308.088975,
310.479287, 306.791227, 274.191204, 230.952332, 232.594944, 236.746312}
要使用 xSQL 演示此选择语句,可从 samples/xsql/scripts/financial 目录中运行以下命令来执行示例脚本:
g 7
指数移动平均(EMA)函数
由 seq_window_agg_ema()
函数生成的 seq_window_agg_ema()
是通过以下迭代算法计算得出的,其中 n 是移动平均值的“天数”(从 1 开始):
p = 2 / (区间 + 1
EMA[0] = input[0] * p
指数移动平均线(EMA)的第 0 项等于输入值的第 0 项
指数移动平均值 EMA[n] = EMA[n-1] * (1 - p
请注意,对于此 7 个值的区间,应忽略 seq_window_agg_ema() 的前 6 个值(已突出显示)。(有关更详细的解释,请参阅“窗口与网格聚合”页面。)可以使用以下表格(使用 Microsoft Excel 2010 版本构建)验证有效窗口,其中 p = 2/8 = 0.25:

以下是一个展示此功能的示例脚本:
SELECT symbol, seq_search(day, 20130101, 20130331) as Q1_13,
volume@Q1_13 as "Volume_Q1_13",
seq_window_agg_ema(volume@Q1_13, 7) as "ema_Q1_13"
FROM Quote WHERE symbol='SYM0';
symbol
Q1_13{}
Volume_Q1_13
ema_Q1_13
------------------------------------------------------------------------------
SYM0
{20130101, 20130104, 20130106, 20130110, 20130123, 20130125,
20130129, 20130213, 20130214, 20130216, 20130311, 20130326}
{335, 808, 45, 402, 732, 48, 805, 450, 385, 420, 367, 69}
{335.000000, 453.250000, 351.187500, 363.890625, 455.917969, 353.938477,
466.703857, 462.527893, 443.145920, 437.359440, 419.769580, 332.077185}
要使用 xSQL 演示此选择语句,可从 samples/xsql/scripts/financial 目录中运行以下命令来执行示例脚本:
g 8
平均真实波动范围(ATR)函数
seq_window_agg_atr()
函数是通过真实波动幅度(True Range)和下面定义的迭代算法计算得出的。 真实波动幅度是以下三者中的最大值: • 最近一个周期的最高价减去最近一个周期的最低价 • 最近一个周期的最高价减去前一收盘价的绝对值 • 最近一个周期的最低价减去前一收盘价的绝对值 在时间 t 时刻的平均真实波动幅度(ATR)是通过以下公式计算得出的:

第一个 ATR 值是通过算术平均值公式计算得出的:

以下是一个展示此功能的示例脚本:
SELECT symbol, seq_search(day, 20130101, 20130331) as Q1_13,
volume@Q1_13 as "Volume_Q1_13",
seq_window_agg_atr(volume@Q1_13, 7) as "atr_Q1_13"
FROM Quote WHERE symbol='SYM0';
symbol
Q1_13{}
Volume_Q1_13
atr_Q1_13
------------------------------------------------------------------------------
SYM0
{20130101, 20130104, 20130106, 20130110, 20130123, 20130125, 20130129,
20130213, 20130214, 20130216, 20130311, 20130326}
{335, 808, 45, 402, 732, 48, 805, 450, 385, 420, 367, 69}
{335.00, 571.50, 396.00, 397.50, 464.40, 395.00,
453.57, 453.06, 443.34, 440.00, 429.57, 378.06}
请注意,对于此 7 个值的区间,应忽略 seq_window_agg_atr() 的前 6 个值(已突出显示)。
要使用 xSQL 演示此选择语句,可从 samples/xsql/scripts/financial 目录中运行以下命令来执行示例脚本:
g 11
示例
正如“分析函数库示例”页面中所解释的那样,以下示例中的数据取自 2013 年 IBM 的历史值。通过在 samples/xsql/scripts/financial 目录中运行各种脚本将数据加载到 xSQL 中。要重现以下示例,请运行 g.bat(在 Linux 系统上为 g.sh),并指定示例编号 8。例如,以 scripts/financial 作为当前工作目录,只需键入:
g 8
以下是一个示例代码片段,展示了 2013 年第一季度部分 grid_agg() 函数的用法。请注意,interval 参数被指定为 7,由于第一季度的报价记录数量为 12,因此会生成包含 12 个元素的结果序列,这是由于采用了“7 个元素的滑动块”(有关更多详细信息,请参阅窗口与网格聚合函数页面)。
-- Show volumes for Q1 2013
SELECT symbol, seq_search(day, 20130101, 20130331) as Q1_13,
volume@Q1_13 as "Volume_Q1_13"
FROM Quote WHERE symbol = 'SYM0';
symbol
Q1_13{}
Volume_Q1_13{}
-------------------------------------------------------------------------
SYM0
{20130101, 20130104, 20130106, 20130110, 20130123, ...<2 element(s)>...,
20130213, 20130214, 20130216, 20130311, 20130326}
{335, 808, 45, 402, 732, ...<2 element(s)>..., 450, 385, 420, 367, 69}
-- _max, _min, _sum, _avg, _var, _dev
SELECT symbol, seq_search(day, 20130101, 20130331) as Q1_13,
volume@Q1_13 as "Volume_Q1_13",
seq_window_agg_max(volume@Q1_13, 7) as "max_Q1_13",
seq_window_agg_min(volume@Q1_13, 7) as "min_Q1_13",
seq_window_agg_sum(volume@Q1_13, 7) as "sum_Q1_13",
seq_window_agg_avg(volume@Q1_13, 7) as "avg_Q1_13",
seq_window_agg_var(volume@Q1_13, 7) as "var_Q1_13",
seq_window_agg_dev(volume@Q1_13, 7) as "dev_Q1_13"
FROM Quote WHERE symbol='SYM0';
symbol
Q1_13{}
Volume_Q1_13{}
max_Q1_13{}
min_Q1_13{}
sum_Q1_13{}
avg_Q1_13{}
var_Q1_13{}
dev_Q1_13{}
-------------------------------------------------------------------------
SYM0
{20130101, 20130104, 20130106, 20130110, 20130123, ...<2 element(s)>...,
20130213, 20130214, 20130216, 20130311, 20130326}
{335, 808, 45, 402, 732, ...<2 element(s)>..., 450, 385, 420, 367, 69}
{335, 808, 808, 808, 808, ...<2 element(s)>..., 808, 805, 805, 805, 805}
{0, 0, 0, 0, 0, ...<2 element(s)>..., 45, 45, 48, 48, 48}
{335, 1143, 1188, 1590, 2322, ...<2 element(s)>..., 3290, 2867, 3242, 3207, 2544}
{47.8571428571429, 163.285714285714, 169.714285714286, 227.142857142857, 331.714285714286,
...<2 element(s)>..., 470, 409.571428571429, 463.142857142857, 458.142857142857, 363.428571428571}
{13741.8367346939, 82636.2040816327, 80784.7755102041, 81080.1224489796, 99185.9183673469,
...<2 element(s)>..., 94120.8571428571, 75180.8163265306, 53338.9795918367, 54100.4081632653, 56048.8163265306}
{117.225580547481, 287.465135419293, 284.226627025344, 284.745715418125, 314.937959552905,
...<2 element(s)>..., 306.791227291227, 274.191203955434, 230.952331860574, 232.594944406075, 236.74631217092}
-- _ema (Exponential Moving Average)
SELECT symbol, seq_search(day, 20130101, 20130331) as Q1_13,
volume@Q1_13 as "Volume_Q1_13",
seq_window_agg_ema(volume@Q1_13, 7) as "ema_Q1_13"
FROM Quote WHERE symbol='SYM0';
symbol
Q1_13{}
Volume_Q1_13{}
ema_Q1_13{}
-------------------------------------------------------------------------
SYM0
{20130101, 20130104, 20130106, 20130110, 20130123, ...<2 element(s)>...,
20130213, 20130214, 20130216, 20130311, 20130326}
{335, 808, 45, 402, 732, ...<2 element(s)>..., 450, 385, 420, 367, 69}
{335, 453.25, 351.1875, 363.890625, 455.91796875, ...<2 element(s)>...,
462.527893066406, 443.145919799805, 437.359439849854, 419.76957988739, 332.077184915543}