暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

模拟实时交易,Ready? Replay!

1381

在之前的推送中,我们给大家介绍了一套可以自己动手搭建的行情回放系统,多个用户可以同时通过 C++、Python 等客户端提交数据回放请求,通过工程化管理的方式来模拟交易环境,详情见《自己动手,搭一套行情回放系统》。

这套回放系统以 DolphinDB 分布式数据库和 replay 回放函数为核心,用户按照教程步骤即可快速搭建。

今天我们将为大家简要介绍回放功能的原理,以帮助大家更好地理解行情多表回放的数据处理流程感兴趣的小伙伴可以点击文末阅读原文查看完整教程。

►►►

行情回放难点在哪?

DolphinDB 提供了 replay 函数来将内存表或数据库表中的记录以一定的速率写入到目标表中,以模拟实时注入的数据流
假设我们现在有逐笔委托、逐笔成交、快照这三种数据,分别有不同的结构、频率、时间戳等,我们希望能严格按照时间顺序将三张表的数据回放出来,并供下游订阅消费。
对于多表同时回放,如果分别回放至三个目标表,并且一一对应,有可能会出现一些问题。比如,逐笔委托和逐笔成交在同一秒内的两条数据先后写入目标表中,但顺序可能和时间字段的先后关系不一致。此外,下游如果由三个处理线程分别对三个目标表进行订阅与消费,也很难保证表与表之间的数据能严格按照时间顺序来处理。
因此,在对多个数据源回放时,为了能每条数据都严格按照时间顺序注入目标表,我们需要解决以下问题
  • 不同结构的数据如何统一进行排序和注入以保证整体的顺序?
  • 如何保证对多表回放结果的实时消费也是严格按照时序进行的?

►►►

N 对 1 多表异构回放

面对上述多表回放的难点,DolphinDB 提供了异构模式的多表回放,支持将多个不同表结构的数据表写入到同一张异构流数据表中。以下是异构模式的多表回放示例:

    orderDS = replayDS(sqlObj=<select * from loadTable("dfs://order", "order") where Date = 2020.12.31>, dateColumn=`Date, timeColumn=`Time)
    tradeDS = replayDS(sqlObj=<select * from loadTable("dfs://trade", "trade") where Date = 2020.12.31>, dateColumn=`Date, timeColumn=`Time)
    snapshotDS = replayDS(sqlObj=<select * from loadTable("dfs://snapshot", "snapshot") where Date =2020.12.31>, dateColumn=`Date, timeColumn=`Time)
    inputDict = dict(["order", "trade", "snapshot"], [orderDS, tradeDS, snapshotDS])
    replay(inputTables=inputDict, outputTables=messageStream, dateColumn=`Date, timeColumn=`Time, replayRate=10000, absoluteRate=true)

    输出表的表结构如下:

    目标表中每行记录对应输入表中的一行记录,msgTime 字段是输入表中的时间列,msgType 字段用来区分来自哪张输入表,msgBody 字段以二进制格式存储了输入表中的记录内容。

    在回放的过程中,这样的数据结构可以对多个数据源进行全局排序,因而保证了多个数据源之间的严格时间顺序。同时,异构流数据表和普通流数据表一样可以被订阅,即多种类型的数据存储在同一张表中被发布并被同一个线程实时处理,因而也保证了消费的严格时序性

    ►►►

    行情回放与消费场景

    若要对异构流数据表进行数据处理操作,如指标计算等,则需要将二进制格式的消息内容反序列化为原始结构的一行记录。
    DolphinDB 在脚本语言以及在 API 中均支持了对异构流数据表的解析功能。脚本支持流数据分发引擎 streamFilter 对异构流数据表进行反序列化以及反序列后结果的数据处理;同时,各类 API 在支持流数据订阅功能的基础上,扩展支持了在订阅时对异构流数据表进行反序列化。
    基于异构回放、异构流数据表解析以及 DolphinDB 流处理框架中的其他特性等,我们可以将回放功能应用在各类实际场景中,并结合具体的回放结果消费方案。
    行情多表回放的数据处理流程图
    回放与消费流程围绕异构流数据表 messageStream 展开。
    图中异构流数据表模块以上,为异构模式的多表回放的示意图,由数据回放工具即 replay 和 replayDS 函数,将存储在多个数据库中的原始数据回放至异构流数据表中。
    图中异构流数据表模块以下,分为三条支路,分别对应对回放结果的三种不同的处理方式,我们以下面三种具体的消费场景为例:

    消费场景 1:在 DolphinDB 订阅中实时计算个股交易成本

    使用 asof join 引擎实时关联逐笔成交与快照数据,计算个股交易成本并写入结果流数据表,查看结果如下:

    消费场景 2:在 DolphinDB 订阅中将回放结果实时推送 Kafka

    在终端查看发送结果返回如下:


    消费场景 3:在外部程序中通过 C++API 实时订阅与处理

    在终端查看程序实时打印的内容如下:

    以上每一种场景我们都给出了详细的脚本,感兴趣的小伙伴可以点击文末阅读原文查看完整教程~

    Explore More



    扫描二维码,添加 DolphinDB小助手
    点击阅读原文,了解行情回放完整教程

    文章转载自DolphinDB智臾科技,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论