DolphinDB使用案例6: 时间序列处理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/The_Time_Runner/article/details/102700348
  • 数据构建

    官网所用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 bytopcsortorder 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]是一个普通vector
      window 滑动窗口的大小

      应用函数/运算符到给定对象的一个滚动窗口上。

      moving 模板总是返回一个向量,长度等于输入参数的行数。当第一个滑动窗口出现时模板开始计算,然后每计算一次,滑动窗口向右移动一个元素。

      对于矩阵,滑动窗口是以的单位的,而其他模板通常是以列为单位的。

      moving模板的参数函数的参数必须要有相同的行数,但是如果参数函数的参数有着不同的维度呢?在这种情况下,可以使用部分应用

    1. 导入数据
      # 查看数据类型
      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)
      
    2. 计算每个公司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
      
    3. 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")
      

      在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/The_Time_Runner/article/details/102700348