实用性再提升!DURATION 数据类型现已支持交易日历!

DolphinDB 自 2.00.9/1.30.21 版本开始,提供交易日历功能,并内置世界五十多个交易所的交易日历。借助交易日历,用户可以在 DolphinDB 中便捷查询指定范围内的交易日,或搭配内置函数,基于交易日进行日期偏移计算、数据采样等操作。

最近,交易日历功能再次进行了更新。自 2.00.11.1 版本起,DURATION 数据类型已支持交易日历。

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, <avg(close)>, `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 数据类型已支持交易日历,用户可以更加灵活地处理交易数据。我们将继续定期更新交易日历功能,为用户的投资研究提供更多便利。

相关推荐
CoderIsArt44 分钟前
Redis的三种模式:主从模式,哨兵与集群模式
数据库·redis·缓存
师太,答应老衲吧3 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
Channing Lewis4 小时前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
毕业设计制作和分享5 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
ketil275 小时前
Redis - String 字符串
数据库·redis·缓存
Hsu_kk6 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql
编程学无止境6 小时前
第02章 MySQL环境搭建
数据库·mysql
knight-n6 小时前
MYSQL库的操作
数据库·mysql
包饭厅咸鱼7 小时前
QML----复制指定下标的ListModel数据
开发语言·数据库
生命几十年3万天7 小时前
redis时间优化
数据库·redis·缓存