DolphinDB使用案例16:Python实现流数据订阅

  • 流数据对量化交易的意义

    做量化,首要目标是回测结果好。常规情况下,回测代码与实盘代码是不同的,因为获取数据的方式不同。

    实盘交易策略,目前一般是事件驱动型,就是来一个事件(比如:得到一个新的K线),程序做出一次响应;而回测代码一般是逐行遍历历史数据。两者略有不同,实盘时候使用的数据就是一种流数据。

    DolphinDB提供流数据订阅,也就是实现了一个小型模拟交易所,为回测提供了仿真环境,这也是我用DolphinDB的初衷。

    关于DolphinDB的流处理,参见《理解DolphinDB流数据处理框架

  • Python API实现流处理

  • 配置DolphinDB

    对于单节点,配置server下dolphindb.cfg文件:

    # Streaming 
    # pub
    maxPubConnections=1
    persistenceDir=D:\DolphinDB\DolphinDBFlow
    # sub
    subPort=8888
    

    其他参数使用默认就可以。

    具体参见手册中第10章>>参数配置>>单实例配置

  • 创建DolphinDB连接

    import dolphindb as ddb
    s = ddb.session()
    
  • 指定订阅端口8888

    s.enableStreaming(8888) # 原则上这样是正确的,当前版本099会出错,通过下述代码可行
    # >>>>>>>>>>>>>>>>
    import dolphindb as ddb
    from threading import Event
    # 创建连接
    s = ddb.session()
    s.enableStreaming(28003)
    
    def handler(lst):
        print(lst)
    
    s.subscribe("127.0.0.1", 8921, handler, "st", actionName= "action1", offset=0)
    Event().wait()
    
  • 创建发布表(在DolphinDB GUI创建)

    发布表必须是可共享的流数据表,一共分三步实现:

    1. 创建流数据表
    2. 共享流数据表
    3. 向流数据表中写入数据实现发布

    创建共享的流数据表,指定进行过滤的列,并插入一些随机数据:

    # 创建共享的流数据表,此段代码在DolphinDB的GUI中执行
    share streamTable(10000:0,`time`sym`price`id, [TIMESTAMP,SYMBOL,DOUBLE,INT]) as trades
    setStreamTableFilterColumn(trades, `sym)
    insert into trades values(take(now(), 10), rand(`ab`cd`ef`gh`ij, 10), rand(1000,10)/10.0, 1..10)
    

    在这里插入图片描述

  • 订阅

    DolphinDB 服务器上使用函数subscribeTable()实现订阅,在Python API中,使用subscribe()函数实现同样功能。

    s.subscribe(host, port, handler, tableName, actionName="", offset=-1, resub=False, filter=None)
    
    参数意义备注
    host发布端节点的ip地址
    port发布端节点的端口号
    handler用户自定义的回调函数,用于处理每次流入的数据
    tableName发布表的名称
    actionName订阅任务的名称
    offset表示订阅任务开始后的第一条消息所在的位置,是一个整数消息是流数据表中的行。如果没有指定offset,或它为负数或超过了流数据表的记录行数,订阅将会从流数据表的当前行开始。offset与流数据表创建时的第一行对应。如果某些行因为内存限制被删除,在决定订阅开始的位置时,这些行仍然考虑在内。
    resub表示订阅中断后,是否会自动重订阅,是一个布尔值
    filter表示过滤条件,是一个向量流数据表过滤列在filter中的数据才会发布到订阅端,不在filter中的数据不会发布。

    关于其更详细的内容解释,参见《理解DolphinDB流数据处理框架

  • 取消订阅

    s.unsubscribe(host,port,tableName,actionName="")
    

    因为订阅是异步执行的,所以订阅完成后需要保持主线程不退出,比如:

    from threading import Event     # 加在第一行
    Event().wait()                  # 加在最后一行
    

    否则订阅线程会在主线程退出前立刻终止,导致无法收到订阅消息。

  • References

  1. DolphinDB Python API (全部Python内容,包括流数据)
  2. DolphinDB流数据教程(GUI)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值