国内股票行情数据导入实例
本页描述国内股票行情 CSV 数据的规模与组织方式、新旧两种数据格式差异,并说明导入 DolphinDB 分布式库表的目标表结构要求与样例下载。
What this page covers
- 背景与应用需求(数据规模、格式差异、目标表结构、样例下载)
- 建库建表(分区机制、分区设计建议、建库脚本示例与链接)
- 新格式数据导入(脚本位置、函数与关键处理、批量与并行导入)
- 旧格式数据导入(编码与schema处理、字段筛选、缺失列补齐、规范化差异)
技能认证特训营第二期报名信息
页面顶部包含活动推广内容与限时报名入口链接。
- 该部分用于提供报名或活动入口导航。
- 该部分不属于行情数据导入技术内容本体。
国内股票行情数据导入实例(新闻页标题与日期)
新闻页展示文章标题与发布日期信息。
- 发布日期为 2022.05.17。
- 该页面为“国内股票行情数据导入实例”的新闻文章页。
背景与应用需求
本节给出行情 CSV 数据规模、目录与文件命名规则、新旧格式差异,以及导入 DolphinDB 分布式库表的目标表结构改造要求与样例下载。
- 历史行情数据范围为最近 10 年。
- 数据规模包含 4000 余只股票。
- 文件组织为“每只股票每天一个 CSV 文件”。
- 源文件目录结构示例为 ~/yyyy/yyyyMMdd/。
- 文件名规则为“市场代码+证券代码+[yyyyMMdd].csv”。
数据格式与字段差异(概览)
- 数据分为两种格式:2015 年至今为新格式;2015 年之前为旧格式。
- 旧格式编码为 GB2312。
- 新格式 Symbol 对应旧格式的“市场代码+证券代码”。
- 新格式包含 TotalVolume 与 TotalAmount;旧格式包含“成交量/成交额”。
- 新格式盘口为 10 档;旧格式为 5 档。
导入目标与目标表结构要求
- 导入目标是写入 DolphinDB 分布式库表,用于量化分析计算。
- 目标表结构以新格式列为基准。
- 将 Symbol 拆分为 Symbol(证券代码)与 market(市场代码)。
- 将 TotalVolume 列名改为 Volume。
- 将 TotalAmount 列名改为 Amount。
样例下载
- 新格式数据样本下载地址为 https://www.dolphindb.cn/downloads/tutorial/2020.zip。
- 旧格式数据样本下载地址为 https://www.dolphindb.cn/downloads/tutorial/2013.zip。
建库建表
本节介绍 DolphinDB 分区机制与一致性、分区设计建议(时间/产品维度与复合分区),并给出建库脚本片段与脚本下载链接。
- 数据库以分区(chunk)为单位管理。
- 系统通过事务机制与二阶段提交协议保证强一致性与完整性。
- 最多支持三个维度分区。
- 不提供行级索引;分区作为物理索引。
- 建议每表每分区压缩前数据量控制在约 100MB 左右以获得较佳性能。
分区设计建议(时间与产品)
- 多数情况下时间维度可按天进行值分区。
- 若每天数据量非常大且时间跨度不长,可按小时分区并使用 DATEHOUR 类型。
- 产品标识维度可使用哈希、范围、值、列表等方法。
- 多维分区是平级组合关系,分区数可能为 n×m。
- 本文案例采用复合分区:时间按天 VALUE 分区;产品按证券代码 HASH 分为 40 个分区。
建库脚本与链接
- 示例脚本片段包含 dbDate = database("", VALUE, 2020.01.01..2020.01.03)。
- 建库脚本下载位置为 script/csvImportDemo/createDB.txt · dolphindb/Tutorials_CN - Gitee.com。
新格式数据导入
本节给出新格式 CSV 导入脚本位置、脚本函数与关键处理逻辑,并描述批量写入与并行批处理对导入性能的影响及相关配置参数。
- 新格式导入脚本参考链接为 script/csvImportDemo/importNewData.txt · dolphindb/Tutorials_CN - Gitee.com。
- 脚本定义 4 个函数:getSchema、LoadOneFile、LoadOneDayFiles、loopLoadOneYears。
- getSchema 会修改列名:TotalVolume→Volume,TotalAmount→Amount。
- 加载单文件时会将 Symbol 拆分为 market 与 Symbol。
- 加载单文件时会用 eachPre 将累计成交量/成交额处理为成交量/成交额。
- 写入一天数据时将文件名分组(每 100 个文件一组)后批量插入分布式表。
- 按年导入时会对“每天一个任务”提交批处理作业。
- 批处理并发上限由 maxBatchJobWorker 配置参数控制。
性能与批量策略(文中测试描述)
- 每批写入 1 个文件时,导入一天数据约 25 分钟。
- 每批写入 100 个文件约 2 分钟。
- 上述对比中写入性能差 10 余倍。
- 建议增大每批写入量以提升性能,但批量不宜过大(一般几十 MB 较合适)。
旧格式数据导入
本节说明旧格式 CSV 导入脚本位置,并描述其与新格式脚本在函数结构上的一致性,以及在 schema、编码转换、字段筛选、缺失列补齐与字段规范化上的差异。
- 旧格式导入脚本链接为 script/csvImportDemo/importOldData.txt · dolphindb/Tutorials_CN - Gitee.com。
- 旧格式脚本同样定义 4 个函数:getSchema、LoadOneFile、LoadOneDayFiles、loopLoadOneYears。
- LoadOneDayFiles 与 loopLoadOneYears 与新格式基本一致。
- 旧格式中文字段名在 extractTextSchema 中可能乱码,需要 convertEncode 转为 utf-8。
- 旧格式中“方向”列不需要导入,并通过修改 schema 来筛选字段。
- 旧格式存在缺失列,需要用 addColumn 预先补齐以便插入分布式表。
- 旧格式会将市场代码使用 upper 规范为大写。
- 旧格式会对 Volume 做 Volume*100 的缩放以保持一致。
Facts index
| Entity | Attribute | Value | Confidence |
|---|---|---|---|
| 国内股票行情数据导入实例 | 发布日期 | 2022.05.17 | high |
| DolphinDB 文本数据加载教程与本文关系 | 用途说明 | DolphinDB 提供详细的文本数据加载教程帮助用户导入数据;本文基于该教程给出“每只股票每天一个 CSV 文件”导入场景的高性能解决方案实践案例。 | medium |
| 历史行情数据 | 时间范围 | 最近10年的历史行情数据 | high |
| 历史行情数据文件组织 | 股票数量规模 | 4000余只股票 | high |
| 历史行情数据文件组织 | 每日文件数规模 | 每天生成4000余个文件(每股票每天一个 CSV 文件) | high |
| 单个 CSV 文件大小 | 大小范围 | 60KB 到 2MB | high |
| 每日总数据量 | 大小范围 | 每天总数据量 3 到 5GB | high |
| 源文件目录结构 | 组织方式 | ~/yyyy/yyyyMMdd/(按年月日存储;示例:~/2020/20200102) | high |
| 源文件命名规则 | 文件名格式 | 市场代码+证券代码+[yyyyMMdd].csv;示例:SH501000.csv、SZ399985_20130104.csv | high |
| 数据格式分类 | 格式种类 | 两种:2015年至今为“新格式数据”;2015年之前为“旧格式数据”。 | high |
| 新格式数据字段 | 包含字段示例 | 包含 Symbol, DateTime, Status, PreClose, Open, High, Low, Price, TotalVolume, TotalAmount,以及 10 档买卖价/量等字段(列名以示例行给出)。 | high |
| 旧格式数据字段 | 包含字段示例 | 字段名为中文(如:市场代码, 证券代码, 时间, 最新, 成交笔数, 成交额, 成交量, 方向, 买一价…卖五量等)。 | high |
| 旧格式数据 | 编码方式 | GB2312 | high |
| 新旧格式字段关系 | 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.zip | high |
| 旧格式数据样本 | 下载地址 | https://www.dolphindb.cn/downloads/tutorial/2013.zip | high |
| 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.com | medium |
| 中国证券市场行情数据增量 | 每日新增量级 | 每日新增数据约 20-40G | high |
| 中国证券市场行情数据存量 | 历史累积量级 | 历史累积数据约 20-40T | high |
| 传统关系型数据库处理行情数据 | 性能描述 | 传统关系型数据库处理该量级数据性能非常低下;即使分库分表效果也不理想。 | 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.com | medium |
| 新格式导入脚本 | 参考链接 | script/csvImportDemo/importNewData.txt · dolphindb/Tutorials_CN - Gitee.com | medium |
| 新格式导入脚本函数 | 函数列表 | 定义 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.com | medium |
| 旧格式导入脚本函数 | 函数列表与一致性 | 同样定义 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 |