买卖日历是数据剖析常常用到的东西,能够协助快速获取对应买卖所的买卖日及进行相应的日期核算。DolphinDB 自 2.00.9/1.30.21 版别开端,供给买卖日历功用,并内置世界五十多个买卖所的买卖日历。用户既能够直接运用内置的买卖日历,也能够自定义买卖日历,根据场景进行个性化定制。
本教程将会从买卖日历的查询和运用、怎么自定义买卖日历、以及买卖日历的来源等三个方面介绍怎么运用 DolphinDB 的买卖日历。
1. 买卖日历的查询和运用
DolphinDB 内置的买卖日历能够支持多个场景的运用:
- 搭配
getMarketCalendar
函数查询指定范围内的买卖日; - 搭配
temporalAdd
,transFreq
,asFreq
,resample
等内置函数,根据买卖日进行核算。
1.1 查询买卖日历-getMarketCalendar
可运用函数 `[getMarketCalendar(marketName, [startDate], [endDate])](https://gitee.com/link?target=https%3A%2F%2Fwww.dolphindb.cn%2Fcn%2Fhelp%2FFunctionsandCommands%2FFunctionReferences%2Fg%2FgetMarketCalendar.html "getMarketCalendar(marketName, [startDate], [endDate])")`
获取对应买卖地点 startDate 和 endDate 确定的时刻范围内的的买卖日历。以纽交所(XNYS)为例,获取2022年1月1日至2022年1月10日间的买卖日历的脚本如下:
getMarketCalendar("XNYS",2022.01.01, 2022.01.10)
#output
[2022.01.03,2022.01.04,2022.01.05,2022.01.06,2022.01.07,2022.01.10]
1.2 根据买卖日历的日期偏移核算 – temporalAdd
如需对买卖日历做时刻偏移,能够运用 `[temporalAdd(date, duration, exchangeId)](https://link.zhihu.com/?target=https%3A//gitee.com/link%3Ftarget%3Dhttps%253A%252F%252Fwww.dolphindb.cn%252Fcn%252Fhelp%252FFunctionsandCommands%252FFunctionReferences%252Ft%252FtemporalAdd.html "temporalAdd(date, duration, exchangeId)")`
函数,获取给定时刻的偏移的买卖日。以纽交所(XNYS)为例,获取2023年1月1日至2023年1月6日增加2个买卖日的日期的脚本如下:
dates=[2023.01.01, 2023.01.02, 2023.01.03, 2023.01.04, 2023.01.05, 2023.01.06]
temporalAdd(dates,2,"XNYS")
#output
[2023.01.04,2023.01.04,2023.01.05,2023.01.06,2023.01.09,2023.01.10]
1.3 根据买卖日历取最近的买卖日 – transFreq
`[getMarketCalendar](https://link.zhihu.com/?target=https%3A//gitee.com/link%3Ftarget%3Dhttps%253A%252F%252Fwww.dolphindb.cn%252Fcn%252Fhelp%252FFunctionsandCommands%252FFunctionReferences%252Fg%252FgetMarketCalendar.html "getMarketCalendar")`
函数能够获取相应时刻范围内的买卖日。但是如若某天不是买卖日,又想取得该日期前最近的一个买卖日,能够运用 `[transFreq(X,rule)](https://link.zhihu.com/?target=https%3A//gitee.com/link%3Ftarget%3Dhttps%253A%252F%252Fwww.dolphindb.cn%252Fcn%252Fhelp%252FFunctionsandCommands%252FFunctionReferences%252Ft%252FtransFreq.html%253Fhighlight%253Dtransfreq "transFreq(X,rule)")`
函数。指定 rule
参数为对应买卖所编码,可获取对应日期的最近的买卖日。以纽交所 (XNYS) 为例,获取2023年1月1日至1月6日最近的买卖日历的脚本如下:
dates=[2023.01.01, 2023.01.02, 2023.01.03, 2023.01.04, 2023.01.05, 2023.01.06]
dates.transFreq("XNYS")
#output
[2022.12.30,2022.12.30,2023.01.03,2023.01.04,2023.01.05,2023.01.06]
1.4 根据买卖日的数据采样 – asFreq/resample
根据买卖日的数据采样,可运用函数 `[asFreq(X,rule)](https://link.zhihu.com/?target=https%3A//gitee.com/link%3Ftarget%3Dhttps%253A%252F%252Fwww.dolphindb.cn%252Fcn%252Fhelp%252FFunctionsandCommands%252FFunctionReferences%252Fa%252FasFreq.html%253Fhighlight%253Dasfreq "asFreq(X,rule)")`
或者函数 `[resample(X,rule,func)](https://link.zhihu.com/?target=https%3A//gitee.com/link%3Ftarget%3Dhttps%253A%252F%252Fwww.dolphindb.cn%252Fcn%252Fhelp%252FFunctionsandCommands%252FFunctionReferences%252Fr%252Fresample.html%253Fhighlight%253Dresample "resample(X,rule,func)")`
,两者的区别在于是否对数据做聚合操作,resample 能够合作聚合函数运用,而 asFreq 函数是朴实的取值。
函数 [asFreq(X,rule)
] 会将数据按买卖日(维度为天)打开,假如某一天的买卖日数据有多个,只取第一个值。如若数据中没有买卖日序列中的数据,会以 NULL 填充。以纽交所 (XNYS) 某支股票数据为例,获取2022年12月30日至2023年01月06日的买卖日数据的脚本如下:
timestampv = [2022.12.30T23:00:00.000,2023.01.01T00:00:00.000,2023.01.03T00:10:00.000,2023.01.03T00:20:00.000,2023.01.04T00:20:00.000,2023.01.04T00:30:00.000,2023.01.06T00:40:00.000]
close = [100.10, 100.10, 100.10, 78.89, 88.99, 88.67, 78.78]
s=indexedSeries(timestampv, close)
s.asFreq("XNYS")
#output
#0
------
2022.12.30|100.10
2023.01.03|100.10
2023.01.04|88.99
2023.01.05|
2023.01.06|78.78
函数`[resample(X,rule,func)](https://link.zhihu.com/?target=https%3A//gitee.com/link%3Ftarget%3Dhttps%253A%252F%252Fwww.dolphindb.cn%252Fcn%252Fhelp%252FFunctionsandCommands%252FFunctionReferences%252Fr%252Fresample.html%253Fhighlight%253Dresample "resample(X,rule,func)")`
能够在采样的基础上,搭配聚合函数获取想要的买卖日数据。以纽交所 (XNYS) 某支股票收盘价数据为例,查询每日收盘价的脚本如下:
timestampv = [2022.12.30T23:00:00.000,2023.01.01T00:00:00.000,2023.01.03T00:10:00.000,2023.01.03T00:20:00.000,2023.01.04T00:20:00.000,2023.01.04T00:30:00.000,2023.01.06T00:40:00.000]
close = [100.10, 100.10, 100.10, 78.89, 88.99, 88.67, 78.78]
s=indexedSeries(timestampv, close)
s.resample("XNYS", last)
#output
#0
------
2022.12.30|100.10
2023.01.03|78.89
2023.01.04|88.67
2023.01.05|
2023.01.06|78.78
2. 自定义及更新内置买卖日历
DolphinDB 自 1.30.21/2.00.9 版别开端供给买卖日历功用。内置的世界上五十多个买卖所的节假日的 csv 文件存放于 marketHolidayDir
配置项对应的文件夹下(默以为 marketHoliday 文件夹),并以买卖所的编码命名该文件,例如:“XNYS”(纽交所)。
DolphinDB 发动时会解析 marketHolidayDir 下一切的 csv 文件,发动后便可在 resample
, asfreq
, transFreq
, temporalAdd
等函数内运用该买卖所的编码。
DolphinDB 也支持管理员用户自定义买卖日历,或者对现有买卖日历修正和更新。管理员用户可经过 DolphinDB 内置函数更新买卖日历:
- 运用
addMarketHoliday
新建买卖日历 - 运用
updateMarketHoliday
更新买卖日历
本章节余下部分将介绍怎么经过上述两个函数自定义及更新内置买卖日历。
2.1 新增买卖日历
假设需求新增买卖所 “DDB” 的买卖日历,能够经过 [addMarketHoliday(marketName, holiday)](https://link.zhihu.com/?target=https%3A//gitee.com/link%3Ftarget%3Dhttps%253A%252F%252Fwww.dolphindb.cn%252Fcn%252Fhelp%252FFunctionsandCommands%252FCommandsReferences%252Fa%252FaddMarketHoliday.html%253Fhighlight%253Daddmarket)
函数,增加 “DDB” 的买卖日历。addMarketHoliday
函数会在 /marketHoliday/ 目录下增加新的 DDB.csv 文件。
DolphinDB 在处理 holiday 文件时会自动过滤周末(周六、周日),因此在提交 holiday 文件时,不需求增加周末日期,只增加非周末的节假日信息即可。
新增买卖日历后,可直接调用 getMarketCalendar
等函数对新的买卖日历进行操作:
//将 2023.01.03 2023.01.04(周二, 周三) 设置为节假日
holiday = 2023.01.03 2023.01.04
//用户登录
login(`admin,`123456)
//增加买卖日历
addMarketHoliday("DDB",holiday)
//获取指定日期区间的买卖日历
getMarketCalendar("DDB",2023.01.01, 2023.01.10)
#output
[2023.01.02,2023.01.05,2023.01.06,2023.01.09,2023.01.10]
temporalAdd(2023.01.01,2,"DDB")
#output
2023.01.05
新增的买卖所与模块的适用范围一样,目前都是只对当时节点有用。假如需求对其他节点生效,在其他节点进行相同的操作即可。
2.2 替换买卖日历
假设需求更新已建好的 “DDB” 买卖所的买卖日历,能够运用函数 `[updateMarketHoliday(marketName, holiday)](https://link.zhihu.com/?target=https%3A//gitee.com/link%3Ftarget%3Dhttps%253A%252F%252Fwww.dolphindb.cn%252Fcn%252Fhelp%252FFunctionsandCommands%252FCommandsReferences%252Fu%252FupdateMarketHoliday.html%253Fhighlight%253Dupdatemarketholiday "updateMarketHoliday(marketName, holiday)")`
从头设置该文件的节假日信息,从而更新该买卖所的买卖日历。
注意:该函数设置的节假日信息将覆盖旧的买卖日历文件,不行单独对该文件更新或新增节假日信息。
以下做法能够将已有的 “DDB” 买卖所从头指定 2023.03.07、2023.03.08 为买卖所节假日,且不保存之前的 holiday 日期。经过 temporalAdd
查询 2022.01.01 的下一个买卖日的脚本如下:
//将 2023.03.07 2023.03.08(周二, 周三) 从头设置为节假日
updateMarketHoliday("DDB",2023.03.07 2023.03.08)
//2023.01.03 2023.01.04(周二, 周三) 不再是节假日
getMarketCalendar("DDB",2023.01.01, 2023.01.10)
#output
[2023.01.02,2023.01.03,2023.01.04,2023.01.05,2023.01.06,2023.01.09,2023.01.10]
//2023.03.07, 2023.03.08(周二, 周三) 作为节假日,不会出现在买卖日历中
getMarketCalendar("DDB",2023.03.01, 2023.03.10)
#output
[2023.03.01,2023.03.02,2023.03.03,2023.03.06,2023.03.09,2023.03.10]
3. 买卖日历出处
本章里列举了 marketHoliday 目录下的一切买卖所的信息。为了便利国内用户运用,除了用买卖所的 ISO Code 标识买卖所名(买卖所 ISO CODE 列表)之外,增加了对国内六大买卖所(上交所、深交所、中金所、上期所、郑商所、大商所、上动力)选用国内买卖所简称作为标识名(我国买卖所简称列表)。
3.1 国际买卖所 ISO CODE 列表
针对世界各国闻名买卖所(含上交所和深交所),一致选用 ISO Code 作为买卖所的标识码。买卖日历数据来源于各买卖所官网发布的买卖所节假日以及各地政府发布的法定节假日公告。
3.2 我国大陆买卖所简称列表
为便利我国大陆用户运用,DolphinDB 也供给了我国大陆六大买卖所(上交所、深交所、中金所、上期所、郑商所、大商所、上动力)的简称作为标识码。