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

相关推荐
月光水岸New1 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6751 小时前
数据库基础1
数据库
我爱松子鱼2 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo2 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser3 小时前
【SQL】多表查询案例
数据库·sql
Galeoto3 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)3 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231113 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
喝醉酒的小白4 小时前
PostgreSQL:更新字段慢
数据库·postgresql
敲敲敲-敲代码4 小时前
【SQL实验】触发器
数据库·笔记·sql