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

通联历史数据导入的最佳实践分享

289
随着中国资本市场多层次建设的推进与高频交易策略的普及,金融数据呈现出“体量大、结构杂、频次高”的特性。以通联历史数据为例,其原始数据既包含股票、债券逐笔委托等微观结构数据,又涵盖 ETF 实时申赎等特色数据集,还涉及分钟级 K 线等时序聚合数据。传统数据入库方案在处理此类复杂场景时,往往面临分区策略失当、数据处理转换逻辑冗余、存储效率低下等痛点,严重制约量化投研的时效性。

针对通联数据特有的多层次结构和高频时序特征,DolphinDB 推出了高效数据导入解决方案 —— ImportTLData 模块。该模块通过结构化数据处理流水线,能够实现多品种金融数据的高效导入,为 Alpha 挖掘、风险建模等场景提供高质量的基础数据支撑。今天就带大家了解一下 DolphinDB 通联历史数据导入模块的实现过程。

通联历史数据导入模块涵盖了哪些数据?

目前 ImportTLData 模块已覆盖以下几类核心数据源:
  1. 证券基础行情:涵盖沪深市场股票、债券、可转债逐笔委托/成交数据及行情快照
  2. 衍生品数据:包含期货期权 L2 行情快照及期货 L1 行情快照
  3. 时序聚合数据:权益、债券、指数等品种 1-60 分钟多粒度 K 线数据
  4. 特色数据集:深交所 ETF 实时申赎行情、指数盘后数据

如何导入数据?

数据导入操作可以总结为如下几个环节:
  1. 下载通联数据导入模块 ImportTLData,将其同步到服务器的相应目录上
  2. 使用 DolphinDB 脚本调用该模块
  3. 通过 ImportTLData 定义符合自有环境的数据导入函数
  4. 设定需要导入数据的起止时间,调用定义的导入函数,执行数据导入任务,即通过前台任务、后台任务、定时任务等方式来导入历史数据和增量数据

下面的代码展示了导入股票逐笔委托数据时,定义导入函数和导入数据的操作:
    // 导入模块
    use ImportTLData::loadTLEntrust
    // 定义数据导入函数
    def loadEntrustStock(startDate, endDate, loadType){
    // 设定参数, 需根据实际情况改动
    userName = "admin"
    password = "123456"
    dbname = "dfs://level2_tl"
    tableName = "entrust"
    filePath = "/hdd/hdd3/customer/tlData/"
    // 增量导入
    if(loadType == "daily"){
    idate = today()
    infoTb = loadTLEntrustStock(userName, password, idate, idate, dbname, tableName, filePath, loadType)
    }
    // 批量导入
    else if (loadType == "batch"){
    infoTb = loadTLEntrustStock(userName, password, date(startDate), date(endDate), dbname, tableName, filePath, loadType)
    }
    return infoTb
    }
    具体的数据导入流程、以及数据处理逻辑,可以参考阅读原文了解细节。

    导入常见问题

    我们整理了三个数据导入时的常见问题,或许会为你的数据导入实践提供帮助。


    Q1:是否可以并发执行同一时间段多个数据导入任务?


    可以。
    假设要将 2023.01.01 - 2023.11.01 这一时间段内的股票委托数据、股票快照数据、股票成交数据、指数数据、盘后数据以及 equity 分钟线数据同时导入 DolphinDB ,由于每个任务导入不同的数据表,不会产生冲突,因此修改参数之后就可以直接通过后台任务并发执行多个数据导入任务。
    需要注意的是,在并发导入过程中应注意内存情况,避免产生内存溢出。


    Q2:是否可以根据时间段的不同,

    并发执行同一数据导入任务?

    依情况而定。
    DolphinDB 按分区存储数据。当一个写入任务涉及多个分区时,系统会首先锁定这些分区。如果在该任务完成之前,其他写入任务也涉及这些分区,由于锁定状态,这些任务会因分区冲突而报错 S00002,从而导致任务失败。
    尽管数据导入任务已根据不同时间段划分,但仍可能出现因同时写入同一分区而导致冲突的情况。接下来,我们将介绍每个库的分区类型,并探讨如何设计并发任务以避免分区冲突。
    每个数据库的分区类型

    如何避免分区冲突
    根据以上每个数据库的分区类型可以得知,dfs://level2_tl 和 dfs://level2_tlExtra 的时间分区粒度为日,所以不用担心分区冲突问题,只需保证多个并发任务之间的时间段不产生重合即可。
    dfs://level2_tlEquity1_5Min 以月分区。为了避免分区冲突,应保证每个任务的导入时间段不产生月份重合。假设任务 A 的导入时间段为 2023.01.01 - 2023.01.15 ,任务B的导入时间段为 2023.01.16 - 2023.02.15 ,会产生分区冲突。应该改为:任务 A 的导入时间段为 2023.01.01 - 2023.01.31 ,任务 B 的导入时间段为 2023.02.01 - 2023.02.15
    以此类推,dfs://level2_tlEquity15_60Min 以年分区,为了避免分区冲突,应保证每个任务的导入时间段不产生年份重合,假设任务 A 的导入时间段为 2023.01.01 - 2023.05.15 ,任务B的导入时间段为 2023.05.16 - 2024.04.15,会产生分区冲突,应该改为:任务 A 的导入时间段为 2023.01.01 - 2023.12.31 ,任务 B 的导入时间段为 2024.01.01 - 2024.04.15


    Q3:如何获取具体数据导入任务的运行信息?


    前台任务
    以深交所交易统计数据导入为例,通过以下代码获取数据导入任务的运行信息:
      infoTb = loadSZTradeStat(startDate, endDate, loadType)
      这里的 infoTb 为一张表。该表只有一列 msg ,每一行记录深交所交易统计数据导入过程中的每一条运行信息。
      后台任务和定时任务
      • 获取后台任务的状态

        getRecentJobs()
        • 通过以上函数返回的结果查询所需的 jobId ,再通过以下函数获取相应的运行信息
          • getJobMessage(jobId) :以字符串形式返回运行信息
          • getJobReturn(jobId) :以表的形式返回运行信息
        总的来说,DolphinDB ImportTLData 模块为通联历史数据提供了从解析、转换到分布式存储的全链路解决方案,不仅显著提升了数据入库效率,更以灵活的兼容性覆盖了股票、期货、ETF、分钟 K 线等多层次数据场景,让复杂数据治理回归简单。阅读原文,深入了解 ImportTLData 模块的技术细节与最佳实践~
        扫码添加 DolphinDB 小助手,进入技术交流群
        点击阅读原文,了解数据导入技术细节

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

        评论