国内股票行情数据导入实例

本页描述国内股票行情 CSV 数据的规模与组织方式、新旧两种数据格式差异,并说明导入 DolphinDB 分布式库表的目标表结构要求与样例下载。

Source: https://dolphindb.cn/news/detail/166

What this page covers

技能认证特训营第二期报名信息

页面顶部包含活动推广内容与限时报名入口链接。

国内股票行情数据导入实例(新闻页标题与日期)

新闻页展示文章标题与发布日期信息。

背景与应用需求

本节给出行情 CSV 数据规模、目录与文件命名规则、新旧格式差异,以及导入 DolphinDB 分布式库表的目标表结构改造要求与样例下载。

数据格式与字段差异(概览)

导入目标与目标表结构要求

样例下载

建库建表

本节介绍 DolphinDB 分区机制与一致性、分区设计建议(时间/产品维度与复合分区),并给出建库脚本片段与脚本下载链接。

分区设计建议(时间与产品)

建库脚本与链接

新格式数据导入

本节给出新格式 CSV 导入脚本位置、脚本函数与关键处理逻辑,并描述批量写入与并行批处理对导入性能的影响及相关配置参数。

性能与批量策略(文中测试描述)

旧格式数据导入

本节说明旧格式 CSV 导入脚本位置,并描述其与新格式脚本在函数结构上的一致性,以及在 schema、编码转换、字段筛选、缺失列补齐与字段规范化上的差异。

Facts index

Entity Attribute Value Confidence
国内股票行情数据导入实例发布日期2022.05.17high
DolphinDB 文本数据加载教程与本文关系用途说明DolphinDB 提供详细的文本数据加载教程帮助用户导入数据;本文基于该教程给出“每只股票每天一个 CSV 文件”导入场景的高性能解决方案实践案例。medium
历史行情数据时间范围最近10年的历史行情数据high
历史行情数据文件组织股票数量规模4000余只股票high
历史行情数据文件组织每日文件数规模每天生成4000余个文件(每股票每天一个 CSV 文件)high
单个 CSV 文件大小大小范围60KB 到 2MBhigh
每日总数据量大小范围每天总数据量 3 到 5GBhigh
源文件目录结构组织方式~/yyyy/yyyyMMdd/(按年月日存储;示例:~/2020/20200102)high
源文件命名规则文件名格式市场代码+证券代码+[yyyyMMdd].csv;示例:SH501000.csv、SZ399985_20130104.csvhigh
数据格式分类格式种类两种:2015年至今为“新格式数据”;2015年之前为“旧格式数据”。high
新格式数据字段包含字段示例包含 Symbol, DateTime, Status, PreClose, Open, High, Low, Price, TotalVolume, TotalAmount,以及 10 档买卖价/量等字段(列名以示例行给出)。high
旧格式数据字段包含字段示例字段名为中文(如:市场代码, 证券代码, 时间, 最新, 成交笔数, 成交额, 成交量, 方向, 买一价…卖五量等)。high
旧格式数据编码方式GB2312high
新旧格式字段关系Symbol 字段对应关系新格式的 Symbol 字段对应旧格式的“市场代码+证券代码”。high
新旧格式字段差异成交量/成交额字段差异新格式有 TotalVolume(累计成交量)与 TotalAmount(累计成交额)两列、没有“成交量/成交额”;旧格式相反,有“成交量/成交额”、没有“累计成交量/累计成交额”。high
新旧格式盘口档位差异买卖价/量档位新格式买卖价和买卖量为 10 档;旧格式为 5 档。high
导入目标用途将行情导入 DolphinDB 分布式库表,用于量化分析计算。high
目标表结构以新格式列为基准的改造要求以新格式列为基准;将 Symbol 字段拆分为 Symbol(证券代码)+ market(市场代码);将 TotalVolume 改为 Volume(成交量);将 TotalAmount 改为 Amount(成交额)。high
旧格式字段映射映射关系呈现方式旧格式数据各字段与目标表结构的对应关系以图片形式给出(映射表)。high
映射表说明(AI 说明)用途描述该图展示旧格式行情字段与 DolphinDB 目标库表字段映射与转换规则,并用于指导统一化存储与量化分析。low
新格式数据样本下载地址https://www.dolphindb.cn/downloads/tutorial/2020.ziphigh
旧格式数据样本下载地址https://www.dolphindb.cn/downloads/tutorial/2013.ziphigh
DolphinDB 数据库管理单位分区管理单位数据库以分区(chunk)为单位进行管理;分区元数据在控制节点,副本数据在数据节点,由分布式文件系统统一管理。high
DolphinDB 一致性机制事务与提交协议系统内部通过事务机制和二阶段提交协议保证强一致性和完整性,对外部用户透明。high
DolphinDB 分区副本存储存储方式每个分区副本的数据采用列式增量压缩存储。high
DolphinDB 压缩算法算法与压缩比压缩算法采用 LZ4;对金融数据平均可达到 20%-25% 的无损压缩比。high
DolphinDB 分区维度最大分区维度数最多支持三个维度分区。high
DolphinDB 分区数量能力分区数规模支持百万甚至千万级的分区数。high
DolphinDB 分区方式支持类型提供 VALUE、RANGE、HASH、LIST 和 COMPO 等分区方式。high
DolphinDB 索引机制是否提供行级索引不提供行级索引;将分区作为数据库的物理索引。high
查询加载粒度最小加载单位查询时加载数据的最小单位是“一个分区的一个列”。high
分区字段在查询中的作用过滤加速机制若查询使用分区字段做数据过滤,SQL 引擎可快速定位所需数据块,无需整表扫描。medium
量化金融常用分区维度常用维度时间与产品标识是量化金融领域最常用的分区维度。high
分区数据库教程链接引用位置database.md · dolphindb/Tutorials_CN - Gitee.commedium
中国证券市场行情数据增量每日新增量级每日新增数据约 20-40Ghigh
中国证券市场行情数据存量历史累积量级历史累积数据约 20-40Thigh
传统关系型数据库处理行情数据性能描述传统关系型数据库处理该量级数据性能非常低下;即使分库分表效果也不理想。medium
DolphinDB 分区机制能力可应对数据量级可轻松应对几百 TB 甚至 PB 级别的数据量。medium
分区大小建议控制目标为最佳性能,尽量均匀分区,并将每表每分区压缩前数据量控制在约 100M 左右。high
分区数据量不宜过大原因原因说明因不提供行级索引、以分区作为物理索引,因此每个分区数据量不宜过大。high
时间维度分区建议常见方案多数情况下可按天进行值分区;若时间跨度不长但每天数据量非常大,可按小时分区,并使用 DATEHOUR 数据类型。high
时间维度分区设计按月分区适用场景若常见请求为单一股票查询/聚合且时间跨度很长(数月甚至一年),时间维度按月分区可能是较好做法。medium
产品标识维度分区方法可选方法可采用哈希、范围、值、列表等多种方法。high
产品标识维度分区建议哈希/范围适用性若每产品在固定时间内数据量均匀,可用哈希或范围分区。medium
产品标识维度分区建议范围分区适用性若不同股票 tick 数据量差异大,可用范围分区:以一天或多天为样本划分产品标识区间,使各范围内总量均衡。medium
产品标识维度分区建议值分区适用性若产品个数较少(如期货品种少),可考虑值分区。medium
不同级别行情数据存储分库建议每日数据、Level 1/2/3 等不同级别数据量差异大,建议采用不同分区机制的数据库存储。medium
多维分区关系维度关系多个分区维度不是层级关系,而是平级组合关系;若时间维度 n 个分区、产品维度 m 个分区,最多可能有 n×m 个分区。high
K 线或 signal 数据存储建议频率字段不同频率 K 线建议存储在同一分区表中,增加字段 frequency 区分时间窗口。medium
中国股票市场分钟级K线示例规模估算以 3000 个股票为例:每股票每天约 240 个数据点,总共约 72 万个数据点。high
分钟级K线分区建议(示例)分区方案建议时间维度按月分区;产品维度按范围或哈希分成 15 个分区;每分区约 100 万行左右。medium
数据库复合分区设计(本文案例)分区原则与方案遵循每表每分区压缩前约 100MB 原则:复合分区;第一维按天(时间戳列)VALUE 分区;第二维按产品标识(证券代码列)分为 40 个 HASH 分区。high
建库脚本片段dbDate 定义dbDate = database("", VALUE, 2020.01.01..2020.01.03)high
建库脚本下载地址script/csvImportDemo/createDB.txt · dolphindb/Tutorials_CN - Gitee.commedium
新格式导入脚本参考链接script/csvImportDemo/importNewData.txt · dolphindb/Tutorials_CN - Gitee.commedium
新格式导入脚本函数函数列表定义 4 个函数:getSchema、LoadOneFile、LoadOneDayFiles、loopLoadOneYears。high
getSchema(新格式)行为返回用于导入 CSV 的 schema;先自动判断 schema;将 TotalVolume、TotalAmount 列名修改为 Volume、Amount。high
loopLoadOneYears(新格式,加载单文件到内存表)处理步骤加载一个 CSV 到内存表;将 Symbol 列拆成 market(市场代码)与 Symbol(证券代码);用 eachPre 将 TotalVolume、TotalAmount 处理为成交量/成交额;最后用 reorderColumns 调整列顺序与分布式表一致。high
eachPre 用于累计成交量转成交量效率对比说明文中指出两种实现均可将累计成交量变成交量,其中调用 eachPre 的方式效率更高;另一种用 deltas 后需 nullFill! 补首元素空值,效率较低。medium
示例代码(成交量转换)代码行t["Volume"] = eachPre(-, t["volume"], 0)high
loopLoadOneYears(新格式,写入一天数据)批量写入策略读取所有 CSV 文件名并用 cut 分组(每 100 个文件一组);每组创建容量 50 万行内存表 bigTable;逐个 loadOneFile 插入 bigTable;最后将 bigTable 一批插入分布式表。high
提升导入性能措施批量大小建议增大每批写入数据量可提升导入性能,但不宜过大,一般几十 MB 较合适。medium
测试环境配置客户端/部署配置台式机:Win10;CPU 6 核 12 线程 Intel i7;内存 32GB;硬盘 2TB 7200RPM HDD;DolphinDB 单节点部署;限制使用 4G 内存、4 核 CPU,其它默认配置。high
批量写入性能对比(一天数据)1个文件/批耗时每批写入 1 个文件时,导入一天数据约 25 分钟。high
批量写入性能对比(一天数据)100个文件/批耗时每批写入 100 个文件约 2 分钟。high
批量写入性能对比(一天数据)性能差异量级写入性能差 10 余倍。high
loopLoadOneYears(新格式,按年并行导入)并行作业方式输入年目录(例如 /hdd/hdd9/data/quotes/2020);获取年目录下所有子目录;对每子目录调用 loadOneDayFiles 并提交批处理作业(每任务导入一天数据)。high
批处理作业并发限制配置参数批处理作业工作线程数上限由配置参数 maxBatchJobWorker 设置;超过限制则进入队列等待。high
作业管理教程链接引用位置job_management_tutorial.md · dolphindb/Tutorials_CN - Gitee.com(作业管理第2节)medium
旧格式导入脚本链接script/csvImportDemo/importOldData.txt · dolphindb/Tutorials_CN - Gitee.commedium
旧格式导入脚本函数函数列表与一致性同样定义 4 个函数:getSchema、LoadOneFile、LoadOneDayFiles、loopLoadOneYears;与新格式同名函数功能保持一致;LoadOneDayFiles 与 loopLoadOneYears 基本一致,主要差异在 getSchema 与 LoadOneFile。high
旧格式 schema 乱码处理原因与处理旧格式字段名为中文、编码 GB2312;extractTextSchema 得到的 schema 显示乱码,需要用 convertEncode 转为 utf-8。high
旧格式 schema 编码转换语句代码示例update schema1 set name=convertEncode(name,"gbk","utf-8")high
旧格式字段筛选不导入字段与实现方式旧格式“方向”列不需要导入;用 rowNo 为各列生成列号赋给 schema 表 col 列,再修改 schema 表,仅保留需要导入字段的行。high
旧格式 LoadOneFile 差异缺失列处理旧格式数据很多列缺失;loadText 加载的内存表不能直接插入分布式表,需预先用 addColumn 把这些列补上。high
旧格式 LoadOneFile 差异市场代码规范化使用 upper 将市场代码转换为大写。high
旧格式 LoadOneFile 差异成交量缩放Volume*100 以与新格式数据保持一致。high