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 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")
      

      在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apache DolphinScheduler是一个新一代分布式大数据工作流任务调度系统,致力于“解决大数据任务之间错综复杂的依赖关系,整个数据处理开箱即用”。它以 DAG(有向无环图) 的方式将任务连接起来,可实时监控任务的运行状态,同时支持重试、从指定节点恢复失败、暂停及 Kill任务等操作。目前已经有像IBM、腾讯、美团、360等400多家公司生产上使用。 调度系统现在市面上的调度系统那么多,比如老牌的Airflow, Oozie,Kettle,xxl-job ,Spring Batch等等, 为什么要选DolphinScheduler ? DolphinScheduler 的定位是大数据工作流调度。通过把大数据和工作流做了重点标注. 从而可以知道DolphinScheduler的定位是针对于大数据体系。 DolphinScheduler是非常强大的大数据调度工具,有以下一些特点:1、通过拖拽以DAG 图的方式将 Task 按照任务的依赖关系关联起来,可实时可视化监控任务的运行状态;2、支持丰富的任务类型;3、支持工作流定时调度、依赖调度、手动调度、手动暂停/停止/恢复,同时支持失败重试/告警、从指定节点恢复失败、Kill 任务等操作;4、支持工作流全局参数及节点自定义参数设置;5、支持集群HA,通过 Zookeeper实现 Master 集群和 Worker 集群去中心化;6、支持工作流运行历史树形/甘特图展示、支持任务状态统计、流程状态统计;7、支持补数,并行或串行回填数据。课程会带大家构建DolphinScheduler大数据调度平台,实战讲解多种任务调度配置,会基于案例讲解DolphinScheduler使用,让大家在实战中掌握DolphinScheduler。 DolphinScheduler 发展很快 很多公司调度都切换到了DolphinScheduler,掌握DolphinScheduler调度使用势在必行,抓住新技术机遇,为跳巢涨薪做好准备。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值