tmoving

语法

tmoving(func, T, funcArgs, window, [excludedPeriod])

详情

应用函数/运算符到给定对象的一个滚动窗口上。tmoving 高阶函数返回一个向量,长度与输入参数的长度相同。

内置函数 tmsum, tmcounttmavg 为各自的计算场景进行了优化,因此比 tmoving 高阶函数有更好的性能。

参数

  • func 是一个函数。

  • T 是一个递增的整型或时间类型的向量,且不能包含NULL值。

  • funcArgs 是函数func的参数。可为向量、字典或表。如果有多个参数,则用元组表示,并且每个参数的长度(向量/字典的元素个数或表的行数)必须相同。

  • window 是一个正整数或一个 duration,表示滚动窗口的区间大小。 对于 T 中每个元素Ti,确定一个区间为[Ti - window + 1, Ti]的移动窗口,所有包含在这个区间的数据均属于该窗口。

  • excludedPeriod 是一个支持 TIME、NANOTIME、MINUTE 和 SECOND 数据类型的时间对,可用于设定一天内的非交易时段。该参数的设置必须遵循以下原则:

    1. 起始时间和结束时间必须同属于相同一天,并且结束时间晚于起始时间:[startTime:endTime),其中 startTime < endTime。

    2. 参数 window 的值表达的时间长度小于 24 小时。

    3. 时间对的长度不大于(24 - window 值)。

    4. 参数 T 的值的数据类型必须是 TIMESTAMP、NANOTIMESTAMP、TIME、NANOTIME 中的任意一个。

    5. 时间数据对中的起始时间和结束时间不能与 T 存在任何重合。

其他相关的 tm 系列函数的参数说明和窗口计算规则请参考: tmFunctions

例子

date=2021.08.01 2021.08.02 2021.08.02 2021.08.02 2021.08.03 2021.08.04 2021.08.05 2021.08.06 2021.08.09 2021.08.10 2021.08.14
value=1..11
t = table(date,value)
timer(100) select date, value, tmoving(avg,date,value,3d) from t;

//output: Time elapsed: 7.9 ms
timer(100) select date, value, tmavg(date, value, 3d) from t;

//output: Time elapsed: 6.805 ms

单独打印计算结果,可以看到,当窗口滑动到2021.08.09,计算窗口范围为 [2021.08.07, 2021.08.08, 2021.08.09],但 7 日和 8 日值缺失,因此不参与计算。

date value tmoving_sum
2021.08.01 1 1
2021.08.02 2 1.5
2021.08.02 3 2
2021.08.02 4 2.5
2021.08.03 5 3
2021.08.04 6 4
2021.08.05 7 6
2021.08.06 8 7
2021.08.09 9 9
2021.08.10 10 9.5
2021.08.14 11 11

在以下例子中,marketCloseStart 和 marketCloseEnd 分别模拟股市上午休市的开始时间和结束时间。

// 生成数据
startTime = timestamp(2024.04.01);
n = 1000;
time = timestamp(startTime + (1..n) * 1000);
input = table(time as time, 1..n as val);

// 定义股市休市时间区间
marketCloseStart = time(00:13:00);
marketCloseEnd = time(00:15:00);

// tmoving计算
select time, val, tmoving(avg, time, val, 3s, excludedPeriod=(marketCloseStart:marketCloseEnd)) from input
where time(time) <= marketCloseStart or time(time) > marketCloseEnd;