DolphinDB 自 2.00.9/1.30.21 版本开始,提供交易日历功能,并内置世界五十多个交易所的交易日历。借助交易日历,用户可以在 DolphinDB 中便捷查询指定范围内的交易日,或搭配内置函数,基于交易日进行日期偏移计算、数据采样等操作。
最近,交易日历功能再次进行了更新。自 2.00.11.1 版本起,DURATION 数据类型已支持交易日历。
在使用交易日历进行计算时,用户可以用“正负数字 + 4个大写字母”的形式表示交易所交易日历时间。以纽交所(XNYS)为例,假设 Ti 为基准日期,那么 3XNYS 代表第 Ti+3 个交易日,-3XNYS 代表第 Ti-3 个交易日。除了使交易日期的表达更加精准方便之外,使用 DURATION 数据类型还能避免包含自然日对研究分析的一些不利影响。
DURATION 数据类型支持交易日历之前,在不对日期进行任何处理的前提下,系统对数据进行处理时会包含连同休市日在内的所有自然日。现在,使用 DURATION 数据类型则可以自动去除休市日,在只需要考虑交易日的研究中简化数据处理过程,使计算结果准确。
例如,当计算纽交所 (XNYS) 某只股票每两个交易日的收盘价之和时,使用 DURATION 类型数据,即“2XNYS”进行运算的脚本如下:
date = [2022.12.30, 2023.01.03, 2023.01.04, 2023.01.05, 2023.01.06]
close = [100.10, 78.89, 88.99, 88.67, 78.78]
X1 = indexedSeries(date, close)
msum(X1, window=2XNYS)
# output
#0
------
2022.12.30|100.1
2023.01.03|178.99
2023.01.04|167.88000000000002
2023.01.05|177.66000000000003
2023.01.06|167.45000000000005
由于 2023.01.01 和 2023.01.02 是休市日,所以 2023.01.03 对应的收盘价之和应为 2022.12.30 和 2023.01.03 这两天的收盘价之和,即:100.10+78.89=178.99。我们可以发现,系统计算结果时自动去除了两个休市日的影响。
用户能基于交易日历 duration 进行一系列的操作和计算,如窗口连接、滑动窗口计算、偏移计算等。
用户可使用 wj(leftTable, rightTable, window, aggs, matchingCols, [rightMatchingCols])
函数对数据表做基于交易日历的窗口连接,并将交易日作为窗口区间单位。以下为以纽交所(XNYS)交易日作为窗口单位进行窗口连接的一个例子:
t1 = table(2023.01.03 2023.01.06 as date)
date = [2022.12.30, 2023.01.03, 2023.01.04, 2023.01.05, 2023.01.06]
close = [100.10, 78.89, 88.99, 88.67, 78.78]
t2 = table(date, close)
wj(t1, t2, -2XNYS:0XNYS, , `date);
# output
| date | avg_close
---|------------|-------------------
0 | 2023.01.03 | 89.495
1 | 2023.01.06 | 85.48
DolphinDB 提供了丰富的函数来支持滑动窗口计算,包括 m 系列/ tm 系列/twindow/tmovingWindowData。
其中,m 系列函数可以对滑动窗口内数据进行聚合计算。以 msum(X, window, [minPeriods])
函数为例,计算纽交所 (XNYS) 某只股票每两个交易日(2XNYS)的收盘价之和的脚本如下:
date = [2022.12.30, 2023.01.03, 2023.01.04, 2023.01.05, 2023.01.06]
close = [100.10, 78.89, 88.99, 88.67, 78.78]
X1 = indexedSeries(date, close)
msum(X1, window=2XNYS)
# output
#0
------
2022.12.30|100.1
2023.01.03|178.99
2023.01.04|167.88
2023.01.05|177.66
2023.01.06|167.45
tm 系列函数可以根据交易日历进行时序滑动窗口计算。以 tmavg(T, X, window)
函数为例、计算纽交所 (XNYS) 某只股票每两个交易日(2XNYS)的平均收盘价的脚本如下:
date = [2022.12.30, 2023.01.03, 2023.01.04, 2023.01.05, 2023.01.06]
close = [100.10, 78.89, 88.99, 88.67, 78.78]
t = table(date, close)
select tmavg(date, close, 2XNYS) from t
# output
| tmavg_date
---|------------
0 | 100.1
1 | 89.495
2 | 83.94
3 | 88.83
4 | 83.725
twindow(func, funcArgs, T, range, [prevailing=false])
函数可以将函数/运算符应用到滑动窗口的数据当中。以纽交所 (XNYS) 某只股票为例,针对T中的每个日期Ti,计算区间 [Ti-1个交易日(-1XNYS),Ti+2个交易日(+2XNYS)]内平均收盘价的脚本如下:
date = [2022.12.30, 2023.01.03, 2023.01.04, 2023.01.05, 2023.01.06]
close = [100.10, 78.89, 88.99, 88.67, 78.78]
t = table(date, close)
select twindow(avg, close, date, -1XNYS:2XNYS) from t
# output
| twindow_avg
---|-------------------
0 | 89.32666666666667
1 | 89.1625
2 | 83.8325
3 | 85.48
4 | 83.725
tmovingWindowData(T, X, window, [leftClosed = false])
函数可以基于交易日返回每个滑动窗口中包含的元素。以纽交所 (XNYS) 某只股票为例,以2个交易日(2XNYS)为窗口长度,返回每个滑动窗口包含的元素的脚本如下:
date = [2022.12.30, 2023.01.03, 2023.01.04, 2023.01.05, 2023.01.06]
close = [100.10, 78.89, 88.99, 88.67, 78.78]
tmovingWindowData(date, close, 2XNYS)
# output
[[100.1],[100.1, 78.89],[78.89, 88.99],[88.99, 88.67],[88.67, 78.78]]
用户可以根据交易日历,使用 move(X, steps)
或 tmove(T, X, window)
函数对数据做偏移计算。
move(X, steps)
函数可根据交易日历对数据进行移动操作。以纽交所(XNYS)为例,将2022.12.30至2023年1月6日中的交易日对应的收盘价格向后移动两个交易日脚本如下:
date = [2022.12.30, 2023.01.03, 2023.01.04, 2023.01.05, 2023.01.06]
close = [100.10, 78.89, 88.99, 88.67, 78.78]
X1 = indexedSeries(date, close)
move(X1, 2XNYS)
# output
#0
------
2022.12.30|
2023.01.03|
2023.01.04|100.1
2023.01.05|78.89
2023.01.06|88.99
tmove(T, X, window)
函数可根据交易日历返回 T 中每个日期向前移动 window 个交易日所对应的 X 中的元素。以纽交所(XNYS)为例,返回将2022.12.30至2023年1月6日中的交易日向前移动两个交易日所对应的收盘价格的脚本如下:
date = [2022.12.30, 2023.01.03, 2023.01.04, 2023.01.05, 2023.01.06]
close = [100.10, 78.89, 88.99, 88.67, 78.78]
t = table(date, close)
select *, tmove(date, close, 2XNYS) from t
# output
| date | close | tmove_date
------|------------|-------|-----------
0 | 2022.12.30 | 100.1 |
1 | 2023.01.03 | 78.89 |
2 | 2023.01.04 | 88.99 | 100.1
3 | 2023.01.05 | 88.67 | 78.89
4 | 2023.01.06 | 78.78 | 88.99
本次更新后,DURATION 数据类型已支持交易日历,用户可以更加灵活地处理交易数据。我们将继续定期更新交易日历功能,为用户的投资研究提供更多便利。