DolphinDB使用案例6: 时间序列处理
-
数据构建
官网所用USstocks.csv无法获取,前面5篇文章还可以用btcusdt数据替代一下,从本文开始,单纯用btcusdt已经不行了。
因此,本ID构建了一个包含
['PERMNO', 'TICKER', 'date', 'PRC', 'SHROUT', 'RET', 'VOL']
的国内股票组合,用于测试。如有需要,可留言,我发送给各位老板。
-
context by
传统的关系型数据库不支持时间序列数据处理。在关系型数据库管理系统(RDBMS)中,一张表由行的集合组成,行之间没有顺序。我们可以使用如min, max, avg, stdev等聚合函数来对行进行分组,但是不能在分组内的行使用顺序敏感的聚集函数,比如first, last等,或者对顺序敏感的向量函数,如cumsum, cummax, ratios, deltas等。
DolphinDB支持时间序列数据处理。context by子句使组内处理时间序列数据更加方便,简化了时间序列数据的操作。
context by是DolphinDB独有的特性,是对标准SQL语句的拓展。
-
context by与group by
context by在分组上和group by类似。但是,用group by时,每一组返回一个标量值,而用context by时,每一组返回一个和组内元素个数相同大小的向量。
换句话说,group by返回的结果个数等于组的个数,而context by返回结果个数总是等于表中记录个数。context by给数据操作增加了灵活性,因为它可以用来将函数应用到组内每个成员上。
>sym = `C`MS`MS`MS`IBM`IBM`C`C`C$symbol; price= 49.6 29.46 29.52 30.02 174.97 175.23 50.76 50.32 51.29; qty = 2200 1900 2100 3200 6800 5400 1300 2500 8800; timestamp = [09:34:07,09:36:42,09:36:51,09:36:59,09:32:47,09:35:26,09:34:16,09:34:26,09:38:12]; t1 = table(timestamp, sym, qty, price); >t1; timestamp sym qty price --------- --- ---- ------ 09:34:07 C 2200 49.6 09:36:42 MS 1900 29.46 09:36:51 MS 2100 29.52 09:36:59 MS 3200 30.02 09:32:47 IBM 6800 174.97 09:35:26 IBM 5400 175.23 09:34:16 C 1300 50.76 09:34:26 C 2500 50.32 09:38:12 C 8800 51.29 >select wavg(price,qty) as wvap, sum(qty) as totalqty from t1 group by sym; sym wvap totalqty --- ---------- -------- C 50.828378 14800 IBM 175.085082 12200 MS 29.726389 7200 >select sym, price, qty, wavg(price,qty) as wvap, sum(qty) as totalqty from t1 context by sym; sym price qty wvap totalqty --- ------ ---- ---------- -------- C 49.6 2200 50.828378 14800 C 50.76 1300 50.828378 14800 C 50.32 2500 50.828378 14800 C 51.29 8800 50.828378 14800 IBM 174.97 6800 175.085082 12200 IBM 175.23 5400 175.085082 12200 MS 29.46 1900 29.726389 7200 MS 29.52 2100 29.726389 7200 MS 30.02 3200 29.726389 7200
计算每家公司的股票利润,我们不能使用group by,但是可以使用context by和ratios函数来达到目的。
在使用context by之前,需要确保记录组内已排好序。
可以使用contextby (:X) 模板来达到同样的效果。
context by与top、csort、order by配合使用。
-
计算每个股票6个月滚动窗口的波动和β值
-
undef 从内存中释放变量和函数定义
undef(obj, [objType= VAR]) # 或 undef all # 删除所有用户自定义变量
参数 意义 备注 obj 需要取消定义的对象 如果需要取消所有变量,所有全局变量或所有用户自定义函数的定义,obj用all objType 需要取消定义对象的类型 VAR本地变量;
SHARED共享变量;
DEF函数定义另一种从内存中释放变量的做法是使用“=NULL”
x=1; undef(`x, VAR);
-
objs() 查看内存中的所有变量定义
select * from defs() where userDefined=1 objs() # 如题
-
moving模板函数
moving(func, funcArgs, window)
参数 意义 备注 func 函数 funcArgs 函数func的参数 可以是向量、字典、表,并且每个参数的大小必须相同。如果有多个参数,则用元组表示。
()生成一个tuple,[]生成一个vector,如果元素是标量,会有区别,(1, 2, 3)是一个tuple,[1,2,3]是一个普通vectorwindow 滑动窗口的大小 应用函数/运算符到给定对象的一个滚动窗口上。
moving 模板总是返回一个向量,长度等于输入参数的行数。当第一个滑动窗口出现时模板开始计算,然后每计算一次,滑动窗口向右移动一个元素。
对于矩阵,滑动窗口是以行的单位的,而其他模板通常是以列为单位的。
moving模板的参数函数的参数必须要有相同的行数,但是如果参数函数的参数有着不同的维度呢?在这种情况下,可以使用部分应用 。
-
导入数据
# 查看数据类型 schema = extractTextSchema("D:/DolphinDB/Data/CHstocks.csv") name type -------------- col0 INT PERMNO INT TICKER SYMBOL date DATE PRC DOUBLE SHROUT DOUBLE RET DOUBLE VOL DOUBLE # 更改col0列的类型,针对CHstocks.csv用不到 update schema set type = `SYMBOL where name = `RET # 计算回报 rets = select PERMNO, date, RET, SHROUT*abs(PRC) as MV from CHstocks where 1<=weekday(date)<=5 and isValid(PRC) and isValid(VOL) order by PERMNO, date # 从内存中释放变量和函数定义 undef(`USstocks, VAR)
-
计算每个公司1个月的滚动波动值和β值
# 滑动窗口 rollingWindow = 20 vols = select PERMNO, date, mstd(RET, rollingWindow) as vol, mcount(RET, rollingWindow) from rets context by PERMNO vols = select PERMNO, date, vol from vols where mcount_RET= rollingWindow mktRets = select wavg(RET, prevMV) as mktRet from (select date, RET, prev(MV) as prevMV from rets context by PERMNO) group by date data = select PERMNO, date, RET, mktRet from ej(rets, mktRets, `date) where isValid(mktRet) betas = select PERMNO, date, moving(def(x,y):covar(x,y)/var(y), [RET, mktRet], rollingWindow) as beta from data context by PERMNO betas = select * from betas where isValid(beta) betas
-
GUI中绘制滑动波动率的分布图
dist = select percentile(vol, 25) as q1, median(vol) as q2, percentile(vol, 75) as q3 from vols group by date plot((select q1, q2, q3 from dist), dist.date, "The distribution of 1-month volatilities of China stocks")
-