交易所 Level-2 历史行情数据自动化导入攻略

用户部署完 DolphinDB 后,需要将历史股票数据批量导入数据库,再进行数据查询、计算和分析等操作。DolphinDB 开发了 ExchData 模块,主要用于沪深交易所 Level-2 行情原始数据的自动化导入,目前已支持的数据源包括:

  • 沪深 Level-2 快照行情
  • 沪深逐笔委托
  • 沪深逐笔成交
  • 上交所逐笔合并

注意:本教程代码基于 DolphinDB 2.00.11.3 开发,建议用户使用 2.00.11.3 及以上版本 。

1. 模块介绍

ExchData 模块主要包含预加载数据表结构、创建数据库及分区表、导入数据三部分。

1.1 数据表结构

schema 文件夹下的模块是根据本文第二章节中的合并规则整理的数据结构。该文件夹按照数据源格式,包含以下几个模块文件:

  • tradeSchema 用于指定逐笔成交数据存入数据库的数据格式以及 DolphinDB 读取 CSV 文件时的数据格式。
  • orderSchema 用于指定逐笔委托数据存入数据库的数据格式以及 DolphinDB 读取 CSV 文件时的数据格式。
  • snapshotSchema 用于指定 Level-2 快照行情数据存入数据库的数据格式以及 DolphinDB 读取 CSV 文件时的数据格式。
  • tradeOrderSchema 用于 DolphinDB 读取上交所逐笔合并数据的 CSV 文件时的数据格式。

1.2 创建数据库和分区表

数据库和分区表创建可参考 createTB.dos,其用于创建存储交易所数据的分布式库表。根据业务需求,这里对沪深股票 Level-2 高频行情数据采用一库三表的建库建表方案,分区方案如下:

表 1-1 分区方案

表名分区方案分区列排序列
trade时间维度按天分区+交易所 VALUE 分区 + 证券代码维度 HASH 25分区TradeDate、Market、SecurityIDSecurityID 和 TradeTime
order时间维度按天分区 +交易所 VALUE 分区+ 证券代码维度 HASH 25分区TradeDate、Market、SecurityIDSecurityID 和 OrderTime
snapshot时间维度按天分区+交易所 VALUE 分区+ 证券代码维度 HASH 25分区TradeDate、Market、 SecurityIDSecurityID 和 OrigTime

1.3 数据导入

数据导入部分涉及 ExchData 文件夹和 ExchData.dos,作用如下:

  • ExchData 包含了 Order.dos 、Snapshot.dosTrade.dosTradeOrder.dos 三个模块文件,分别用于导入沪深交易所的逐笔委托、行情快照和逐笔成交 Level-2 高频行情数据。
  • ExchData.dos 用于导入指定目录下的所有交易所数据,是对前面所有模块的整合。

下面列出模块中的主要函数 ExchData 的语法和参数介绍。

语法

ExchData(dbName, tbNames, filePath, startDate, endDate, dataTypes, market="ALL", tmpPath=NULL, rowCount=1000000, deleteDuplicate=true, initialTB=false, initialDB=false)

详情

将 fileDir 路径下从 startDate 到 endDate 日期的 dataSource 数据导入 dbName 数据库中的 tableName 表里。

参数

  • dbName  字符串,数据库名称。
  • tbNames 字符串型的向量,分布式表名称。若需要导入逐笔合并数据,需要传入如 [“Order”, “Trade”] 的逐笔成交和逐笔委托表名;若需要导入其他行情数据,只需要传入导入的单一表名即可。
  • filePath 字符串,指定的存放数据的路径,需要确保和第一章的文件结构一致。
  • startDate 字符串,导入数据的起始日期,比如 2022.01.01(包括这一天)。默认值为 NULL,此时从上一个交易日开始导入。
  • endDate 字符串,导入数据的结束日期,比如 2022.12.31(包括这一天)。默认值为 NULL,此时从上一个交易日开始导入。
  • dataTypes 字符串型的向量,导入行情的数据源类型, “Snapshot”, “Order”, “Trade” 三选一或者 [“Order”, “Trade”]。
  • market 字符串,交易所,目前只能 “ALL”, “SZ”, “SH” 三选一。当 market=“ALL” 时,会将沪深的数据全部导入一张名为 tableName 的分布式表;否则,会只导入一个交易所的数据。
  • tmpPath 字符串,指定的临时文件存放路径,用于存放解压后的深交所的中间文件,解压后会将解压的临时文件删除。默认为 NULL,此时不会去解压缩,并基于指定的文件夹去识别数据文件导入数据。
  • rowCount 整数,分段写入的最高数据量。指定后会对 CSV 数据分段写入分布式库表。默认值为 0,此时全量导入数据。
  • deleteDuplicate 布尔值,表示是否需要删除数据库已导入的数据。默认值为 true,此时导入数据前不会删除库表中已存在的数据。
  • initialDB 布尔值,是否需要初始化数据库。如果已经存在名为 dbName 的数据库,当 initialDB=true 时,会删除原来的数据库并重新创建;否则会保留原来的数据库并输出 "[dbName] 数据库已经存在" 的提示。
  • initialTB  布尔值,是否需要初始化分布式表。如果在 dbName 数据库下已经存在名为 tbName 的表,当 initialTB=true 时,会删除原来的表并重新创建;否则会保留原来的表并输出 "数据库 [dbName] 已经存在表 [tbName]" 的提示。

2. 历史股票数据文件结构

在使用本功能模块时,需要准备解压缩后的历史股票数据文件(未解压缩的文件结构见附件),并确保在主目录下创建了对应的文件目录,不同时间段下(见第二章不同数据源的文件说明)的文件结构如下,假设最上层文件夹为 Data 文件夹,Data 文件夹下存放对应上交所(SH)、深交所(SZ)的交易所股票行情原始数据。

Data
└──SH
|   ├── 2015
|   │   └── 20150105
|   │      ├── Entrust.csv
|   │      ├── Snapshot.csv
|   │      └── Tick.csv
|   |      ……    
|   ├── 2020
|   │   └── 20200104
|   │      ├── Entrust.csv
|   │      ├── Snapshot.csv
|   │      └── Tick.csv
|   |      ……    
|   └── 2023
|      └── 20231205
|         ├── Snapshot.csv
|         └── StockTick.csv
|         ……    
└──SZ├── 2016│   └── 0506│   │   ├── SZL2_ORDER_20160506.TXT│   │   ├── SZL2_SNAPSHOT_20160506.TXT│   │   ├── SZL2_SNAPSHOTDW_20160506.TXT│   │   └── SZL2_TRADE_20160506.TXT│   └── 0509│       ├── am_hq_order_spot.txt│       ├── am_hq_snap_spot.txt│       ├── am_hq_trade_spot.txt      │       ├── am_snap_level_spot.txt│       ├── pm_hq_order_spot.txt│       └── pm_hq_trade_spot.txt|      ……  

3. 行情数据存储模型设计

ExchData 模块将两个交易所的数据合并为一张表,其中表中的字段是两个交易所数据字段的并集,并新增字段 Market 为分区列用于标识数据来自哪个交易所。

上交所和深交所两个交易所数据的结构不同,且不同时期同一个交易所的数据结构也不同。根据《深圳证券信息有限公司高频增强行情数据服务》和《上海证券交易所历史股票数据接口说明书》,我们整理了两个交易所提供的各个时期的数据结构,最终确定以下述的表结构将数据存入数据库。

3.1 逐笔成交数据

  • 沪深交易所导入逐笔成交数据的源文件

  • 沪深交易所逐笔成交库表结构
字段含义入库字段名入库数据类型上交所字段上交所字段说明深交所字段深交所字段说明
成交日期TradeDateDATE-TradeDate
数据生成时间OrigTimeTIMESTAMP-OrigTime2016 年 5 月 9 日新增
发送时间SendTimeTIMESTAMPSendingTime业务时间20150803093008,精确到百分之一秒自 2021年 4 月 26 日启SendTime
接收时间RecvtimeTIMESTAMP-Recvtime2016 年 5 月9 日新增
入库时间DbtimeTIMESTAMP-Dbtime2016 年 5 月 9 日新增
证券代码SecurityIDSYMBOLSecurityIDSecurityID
成交时间TradeTimeTIMESTAMPTradeTime业务时间 2015112309163002 ,精确到百分之一秒TradeTime
成交价格TradePriceDOUBLETradePricePrice
成交量TradeQtyINTTradeQtyTradeQty
成交金额TradeAmountDOUBLETradeAmount-
买方订单号BuyNoLONGBuyNoBidApplSeqNum
卖方订单号SellNoLONGSellNoOfferApplSeqNum
成交序号TradeIndexINTTradeIndex
频道代码ChannelNoINTChannelNoChannelNo
内外盘标志TradeBSFlagSYMBOLTradeBSFlag内外盘标志: B – 外盘,主动买 S – 内盘,主动卖 N – 未知
业务序列号ApplSeqNumLONGBizIndex业务序列号 与竞价逐笔委托消息合并后 的连续编号,从 1 开始,按Channel 连续ApplSeqNum
成交类别ExecTypeSYMBOL-ExecType4=撤消F=成交
行情类别MDStreamIDSYMBOL-MDStreamIDMDStreamID=0112016 年 5 月 9 日新增
证券代码源SecurityIDSourceSYMBOL-SecurityIDSource102 = 深圳证券交易所2016 年 5 月 9 日新增
交易所名称MarketSYMBOL-取值为SH-取值为SZ

3.2 逐笔委托数据

  • 沪深交易所导入逐笔委托数据的源文件列表

  • 沪深交易所逐笔委托库表结构
字段含义入库字段名入库数据类型上交所字段上交所字段说明深交所字段深交所字段说明
成交日期TradeDateDATETradeDate
数据生成时间OrigTimeTIMESTAMPOrigTime交易所数据生成时间2016年5月9日新增
发送时间SendTimeTIMESTAMPSendTime
接收时间RecvtimeTIMESTAMPRecvtime2016年5月9日新增
入库时间DbtimeTIMESTAMPDbtime2016年5月9日新增
证券代码SecurityIDSYMBOLSecurityIDSecurityID
委托时间OrderTimeTIMESTAMPTransactTime如 20150803093008000 精确到毫秒TransactTime
委托订单号OrderNoINTOrderNo
委托价格(元)OrderPriceDOUBLEPricePrice
委托数量OrderQtyINTBalance剩余的委托数量OrderQty相对于上交所,该字段为总委托数量
已成交的委托数量TradeMoneyINTTradeQty逐笔合并新增字段,用以区分Balance,表明成交的委托数量
买卖标志SideSYMBOLOrderBSFlag对于委托订单: B – 买单 S – 卖单Side1=买,2=卖G=借入,F=借出
订单类别OrderTypeSYMBOLOrdType订单类型A – 新增委托订单D – 删除委托订单,即撤单OrderType1=市价,2=限价,U=本方最优
委托序号OrderIndexINTOrderIndex从 1 开始,按 Channel 连
频道代码ChannelNoINTChannelNo通道ChannelNo证券集代号
业务序列号ApplSeqNumLONGBizIndex业务序列号 与竞价逐笔成交消息合并后的连续编号,从 1 开始,按Channel 连续ApplSeqNum消息ID
行情类别MDStreamIDSYMBOLMDStreamID2016年5月9日新增
证券代码源SecurityIDSourceSYMBOLSecurityIDSource102 = 深圳证券交易所2016年5月9日新增
定价行情约定号ConfirmIDINTConfirmID2016年5月9日新增
联系人ContactorSTRINGContactor2016年5月9日新增
联系方式ContactInfoSTRINGContactInfo2016年5月9日新增
期限ExpirationDaysINTExpirationDays2016年5月9日新增
期限类型ExpirationTypeINTExpirationType2016年5月9日新增
交易所MarketSYMBOL-SH-SZ

3.3 Level-2 快照数据

  • 沪深交易所导入 Level-2 快照数据的源文件列表

  • 沪深交易所 Level-2 快照行情表结构
字段含义入库字段名入库数据类型上交所字段上交所字段说明深交所字段深交所字段说明
成交日期TradeDateDATETradeDate
数据生成时间OrigTimeTIMESTAMPDateTime业务时间 格式如20151123091630OrigTime
发送时间SendTimeTIMESTAMPSendingTime自 2021 年 12 月 1 日启用SendTime
接收时间RecvtimeTIMESTAMPRecvtime
入库时间DbtimeTIMESTAMPDbtime
行情类别MDStreamIDSYMBOLMDStreamID
证券代码SecurityIDSYMBOLSecurityIDSecurityID
交易状态TradeStatusSYMBOLInstrumentStatusINIT 启动时段 PCALL 集中撮合时段 POSMT 连续交易时段 ENDPT 闭市时段 POSSP 停牌
快照类型NumImageStatusINTNumImageStatus1: 全量 2: 增量 自 2021 年12 月 1 日启用
频道代码ChannelNoINTChannelNo
证券代码源SecurityIDSourceSYMBOLSecurityIDSource102 = 深圳证券交易所
昨收价PreClosePxDOUBLEPreClosePxPreClosePx
开盘价OpenPxDOUBLEOpenPxOpenPx
最高价HighPxDOUBLEHighPxHighPx
最低价LowPxDOUBLELowPxLowPx
最新价LastPxDOUBLELastPxLastPx
均价AvgPxDOUBLEAvgPx自 2021 年 12 月 1 日启用
收盘价ClosePxDOUBLEClosePx自 2021 年 12 月 1 日启用
升跌1PxChange1DOUBLEPxChange1
升跌2PxChange2DOUBLEPxChange2
成交总量TotalVolumeTradeINTTotalVolumeTrade股票:股 基金:份 债券:千元面额 指数:手TotalVolumeTrade
成交总金额TotalValueTradeDOUBLETotalValueTradeTotalValueTrade
市盈率1PE1DOUBLEPERatio1
市盈率2PE2DOUBLEPERatio2
申买十价BidPriceDOUBLE[10]BidPriceBidPX1/…/BidPX10
申买十量BidOrderQtyINT[10]BidOrderQtyBidSize1/…/BidSize10
申买十实际总委托笔数BidNumOrdersINT[10]BidNumOrdersNUMORDERS_B1
买一揭示委托笔数BidNoOrders1INTNOORDERS_B1
申买一前50笔订单BidOrdersINT[50]BidOrdersORDERQTY_B1
申卖十价OfferPriceDOUBLE[10]OfferPriceOfferPX1/…/OfferPX10
申卖十量OfferOrderQtyINT[10]OfferOrderQtyOfferSize1/…/OfferSize10
申卖十实际总委托笔数OfferNumOrdersINT[10]OfferNumOrdersNUMORDERS_S1
申卖一前50笔订单OfferOrdersINT[50]OfferOrdersORDERQTY_S1
卖一揭示委托笔数OfferNoOrders1INTNOORDERS_S1
成交笔数NumTradesINTNumTradesNumTrades
基金T-1净值PreNAVDOUBLEPreNAV基金
基金实时参考净值IOPVRealTimeNAVDOUBLERealTimeNAV基金
ETF 净值估值IOPVDOUBLEIOPV从 20221104 日开始
权证溢价率WarrantPremiumRateDOUBLEWarrantPremiumRate权证
买入总量TotalBidQtyINTTotalBidQty股票:股 基金:份 债券:千元面额totalbidqty协议 量和价是合一个条目中
卖出总量TotalOfferQtyINTTotalOfferQty股票:股 基金:份 债券:千元面额totalofferqty
买入加权平均价WeightedAvgBidPxDOUBLEWeightedAvgBidPxweightedavgbidpx协议 量和价是合一个条目中
卖出加权平均价WeightedAvgOfferPxDOUBLEWeightedAvgOfferPxweightedavgofferpx
买入总比数TotalBidNumberINTTotalBidNumber
卖出总比数TotalOfferNumberINTTotalOfferNumber
总持仓量TotalLongPositionINTTotalLongPosition
涨停价UpLimitPxDOUBLEUpLimitPx
跌停价DownLimitPxDOUBLEDownLimitPx
买入成交最大等待时间BidTradeMaxDurationLONGBidTradeMaxDuration
卖出成交最大等待时间OfferTradeMaxDurationLONGOfferTradeMaxDuration
买方委托价位数NumBidOrdersLONGNumBidOrders
卖方委托价位数NumOfferOrdersLONGNumOfferOrders
买入撤单笔数WithdrawBuyNumberLONGWithdrawBuyNumber
买入撤单数量WithdrawBuyAmountLONGWithdrawBuyAmount
买入撤单金额WithdrawBuyMoneyDOUBLEWithdrawBuyMoney
卖出撤单笔数WithdrawSellNumberINTWithdrawSellNumber
卖出撤单数量WithdrawSellAmountINTWithdrawSellAmount
卖出撤单金额WithdrawSellMoneyDOUBLEWithdrawSellMoney
ETF 申购笔ETFBuyNumberINTETFBuyNumberxwnum自 2024 年 01 月 04 日新增
ETF 申购数量ETFBuyAmountINTETFBuyAmountxwsize自 2024 年 01 月 04 日新增
ETF 申购金额ETFBuyMoneyDOUBLEETFBuyMoney
ETF 赎回笔数ETFSellNumberINTETFSellNumberxxnum自 2024 年 01 月 04 日新增
ETF 赎回数量ETFSellAmountINTETFSellAmountxxsize自 2024 年01 月 04 日新增
ETF 赎回金额ETFSellMoneyDOUBLEETFSellMoney
消息序号MsgSeqNumINTMsgSeqNum自 2021 年 12 月 1 日启用
债券质押式回购品种加权平均价WarLowerPxDOUBLEWarLowerPx自 2021 年 12 月 1 日启
产品实时阶段TradingPhaseCodeSYMBOLTradingPhaseCode自 2021 年 12 月 1日启用TradingPhaseCode产品所处的交易阶段代码第 0 位:S=启动(开市前)O=开盘集合竞价T=连续竞价B=休市C=收盘集合竞价E=已闭市H=临时停牌A=盘后交易V=波动性中断第 1 位:0=正常状态1=全天停牌
加权平均价涨跌xjDOUBLExj自 2017 年 5月 12 日新增
昨收盘加权平均价xkDOUBLExk自 2017 年 5月 12 日新增
加权平均价VwapDOUBLEVwap自 2017 年 5月 12 日新增

4. 使用示例

  • 第一步:用户按照第 2 章文件结构中准备好数据。假设数据放在 /home/wwluo/data/stockData 目录下,文件结构如下图:

图 4-1 文件结构示例

  • 第二步: 将模块同步至 DolphinDB的 getHomeDir()+/modules 的目录下

图 4-2 更新模块示例

  • 第三步:载入模块和导入数据方法如下,其中为了数据完整性以及避免执行 shell 函数引入安全问题,推荐基于本模块(见附录中的 ExchData.zip 文件)直接导入全量数据,若需要解压缩、分段导入,则分别需要指定tmpPathrowCount等参数。
use ExchData::ExchData
go;// 导入逐笔成交数据 day=2021.04.26
startDate,endDate = 2021.04.26,2021.04.26
dbName = "dfs://TSDB_level2"
tbName = "trade"
dataType = "trade"
filePath = "/home/wwluo/data/stockData/"  
tmpPath = "/home/wwluo/tmp/ALL/" 
// 沪深交易所一起导入
market="ALL"
// 手动解压后导入数据;如需要自动解压缩需要指定tmpPath路径
tmpPath = NULL
// 全量导入数据;如需要指定分段导入,指定大于0的rowCount即可
rowCount = 0
jobId1 = submitJob("loadTradeData","loadTradeData",ExchData{dbName,tbName,filePath,startDate,endDate,dataType,market,tmpPath,rowCount,false,false})
getJobStatus(jobId1)
print getJobMessage(jobId1)// 导入逐笔委托数据
dbName = "dfs://TSDB_level2"
tbName = "order"
dataType = "order"
startDate,endDate = 2021.04.26,2021.04.26
filePath = "/home/wwluo/data/stockData/"  
tmpPath = "/home/wwluo/tmp/ALL/" 
// 沪深交易所一起导入
market="ALL"
// 手动解压后导入数据;如需要自动解压缩需要指定tmpPath路径
tmpPath = NULL
// 全量导入数据;如需要指定分段导入,指定大于0的rowCount即可
rowCount = 0
jobId2 = submitJob("loadOrderData","loadOrderData",ExchData{dbName,tbName,filePath,startDate,endDate,dataType,market,tmpPath,rowCount,false,false})
print getJobMessage(jobId2)// 导入快照数据
dbName = "dfs://TSDB_level2"
tbName = "snapshot"
dataType = "snapshot"
startDate,endDate = 2021.04.26,2021.04.26
filePath = "/home/wwluo/data/stockData/"  
// 沪深交易所一起导入
market="ALL"
// 手动解压后导入数据;如需要自动解压缩需要指定tmpPath路径
tmpPath = NULL
// 全量导入数据;如需要指定分段导入,指定大于0的rowCount即可
rowCount = 0
jobId3 = submitJob("loadSnapshotData","loadSnapshotData",ExchData{dbName,tbName,filePath,startDate,endDate,dataType,market,tmpPath,rowCount,false,false})
print getJobMessage(jobId3)// 导入逐笔合并数据
startDate,endDate = 2024.01.22,2024.01.22
dbName = "dfs://TSDB_level2"
tbNames = ["trade","order"]
dataTypes = ["trade","order"]
filePath = "/home/wwluo/data/stockData/"  
tmpPath = "/home/wwluo/tmp/ALL/" 
// 只导入上交所数据
market="ALL"
// 手动解压后导入数据;如需要自动解压缩需要指定tmpPath路径
tmpPath = NULL
// 全量导入数据;如需要指定分段导入,指定大于0的rowCount即可
rowCount = 0
jobId4 = submitJob("loadSHTradeOrderData","loadSHTradeOrderData",ExchData{dbName,tbNames,filePath,startDate,endDate,dataTypes,market,tmpPath,rowCount,false,false})
print getJobMessage(jobId4)
  • 第四步:查询任务状态

(1)使用 getJobStatus(jobId) 可以查询任务状态,当 endTime 有值的时候表示任务结束。例如:

图 4-3 getJobStatus 示例

(2)使用 getJobMessage(jobId) 可以查询任务中间信息,例如:

图 4-4 getJobMessage 示例

(3)可以通过查询日志内容,查看任务执行结果。例如:

cat dolphindb.log | grep message

图 4-5 log 示例

  • 第五步:查询数据

(1)快照数据

select * from loadTable("dfs://TL_Level-2", "snapshot") limit 10

图 4-6 快照数据预览

(2)逐笔委托

select * from loadTable("dfs://TL_Level-2", "snapshot") limit 10

图 4-7 逐笔委托预览

(3)逐笔成交

select * from loadTable("dfs://TL_Level-2", "snapshot") limit 10

图 4-8 逐笔成交预览

5. 数据校验

在处理和分析交易所的 Level-2 历史行情数据时,针对原始数据的数据校验是一个至关重要的步骤。基于本模块的数据校验功能,可以监测交易所的 Level-2 历史行情数据是否存在数据遗漏、数据异常。

5.1 校验规则

ExchData 模块的 checkStockData.dos 支持对沪深交易所的逐笔成交和逐笔委托数据做数据校验,校验逻辑包括:

  • 检查导入的逐笔成交和逐笔委托数据量是否小于 1500 万,否则提示数据异常。
  • 针对2023年以后的数据,检查逐笔数据的 ChannelNo 的取值范围,检查上交所的 ChannelNo 所有取值是否包含 1~6 、深交所的 ChannelNo 所有取值是否包含2011~2014。
  • 检查逐笔数据每一支 ChannelNo 下的所有 ApplSeqNum 是否连续;若不连续检查是否存在重复数据,以及是否存在数据缺失的异常情况。

5.2 校验接口

语法

checkStockData(startDate, endDate, market)

详情

校验 startDate 和 endDate 期间的逐笔数据,若校验未通过将返回统计信息表。

参数

  • startDate 开始日期。
  • endDate 结束日期。
  • market 交易所类型,支持”SH”、”SZ”、”ALL”。

使用示例

如下校验 2021.04.26 的逐笔数据是否存在异常,结果如下:

use ExchData::checkStockData
go;
checkAllData(2021.04.26,2021.04.26,"ALL")

图 5-1 数据校验示例

6. 异常处理

导入交易所的 Level-2 历史行情数据过程可拆分为如下步骤,其中每一步均可能存在异常,如下表所示。

  1. 创建库表:第一次运行时创建数据库表;若已存在本地库表,会与模块中库表的表结构做对比
  2. 解压缩:若导入深交所行情文件,若文件未解压缩,需要先将文件解压缩
  3. 加载 CSV:检查行情文件是否存在;若存在,检查文件的表结构与模块中预先指定的表结构的列数是否一致
  4. 数据导入:基于预先指定的表结构导入对应行情文件
  5. 数据校验:导入完成以后,进行数据校验
阶段异常情况输出信息
创建库表创建数据库时,名为 dbName 的数据库已经存在且 initialDB=false{"code": "warning","message": "[dbName] 数据库已经存在"}
创建库表创建分布式表时,名为 tableName 的表已经存在且 initialDB=false{"code": "warning","message": "数据库 [dbName] 已经存在表 [tableName]"}
解压缩导入深交所文件时解压失败{"code": "error","message": "解压文件失败: [fileName],请检查日志"}
加载 CSV日期文件夹下,没有对应的 CSV 文件{"code": "error","message": "深交所 [day] 日期的 [CSVNames] 的 CSV 文件不全或者不存在"}{"code": "error","message": "上交所 [day] 日期的 [CSVNames] 的 CSV 文件不全或者不存在"}
加载 CSV实际 CSV 文件的数据列数和 CsvSchema.dos 模块里面预设的表结构的列数不一致{"code": "error","message": "[CSVPath] 的数据格式有误,列数不匹配"}
数据导入写入分布式库表的数据量和 CSV 的数据量不一致{"code": "error","message": "深交所 [day] 日期的 [CSVNames] 的 CSV数据和写入dfs数据不一致,t1 size:[n1],t2 size:[n2]"}{"code": "error","message": "上交所 [day] 日期的 [CSVNames] 的 CSV数据和写入dfs数据不一致,t1 size:[n1],t2 size:[n2]"}
数据导入导入上交所逐笔合并数据时,CSV 文件的格式与模块中的 schema 不一致{"code": "error","message": "CSV 文件[StockTick.csv] 与分布式表待入库数据[“dfs:\\TSDB_Level-2“,”trade”]不一致"}{"code": "error","message": "CSV 文件[StockTick.csv] 与分布式表待入库数据[“dfs:\\TSDB_Level-2“,”order”]不一致"}
数据导入导入深交所快照行情数据时,快照行情和挡位表行数不一致{"code": "error","message": "深交所 [" + string(day) + "] 日期 [CSVName1] 和 [CSVName2]!"}
数据校验数据校验发现逐笔数据缺失channelNo{"code": "error","message": "上交所 [" + string(day) + "] 日期 [" +"channelNo 数据缺失,共计 [" + string(channelSh.size()) + "] 个, 预计6个,请检查!"}{"code": "error","message": "深交所 [" + string(day) + "] 日期 [" +"channelNo 数据缺失,共计 [" + string(channelSh.size()) + "] 个, 预计4个,请检查!"}
数据校验数据校验发现逐笔数据小于 1500万{"code": "error","message": " [day] trade 数据异常! order 数据异常! "}
数据校验数据校验发现逐笔数据的某一支 channelNo 存在重复数据{"code": "error","message": "[深交所] 交易所 [day] 日期 [channelNo] channelNo 存在 [n] 条重复数据, 请检查!"}{"code": "error","message": "[上交所] 交易所 [day] 日期 [channelNo] channelNo 存在 [n] 条重复数据, 请检查!"}
数据校验数据校验发现逐笔数据的某一支 channelNo 存在 ApplSeqNum 数据缺失{"code": "error","message": "[深交所] 交易所 [day] 日期 [channelNo] channelNo [ApplSeqNum] ApplSeqNum缺失, 请检查!"}{"code": "error","message": "[上交所] 交易所 [day] 日期 [channelNo] channelNo [ApplSeqNum] ApplSeqNum缺失, 请检查!"}
数据导入/数据校验其他错误【通过 try{}catch(ex){} 捕获异常】{"code": "error","message": 输出报错信息 ex}

7. 注意事项

  1. 导入数据时,请确保数据源文件路径正确,否则会导致导入失败。极端情况下,可能存在数据源文件未完全同步完,导致数据导入异常。
  2. 由于分段导入非强事务操作,因此内存充足情况下,不建议使用本模块分块导入数据;若部署的 DolphinDB 服务内存不足,一次性写入的沪深交易所数据量超过了 maxMemSize 大小,建议导入数据时设置较小的 rowCount 以确保能正常导入数据
  3. 由于本模块是基于 shell 函数执行服务器解压缩 shell 命令,该过程会存在安全问题的风险,因此不建议直接基于本模块去解压缩以导入深交所数据;若需要基于本模块解压缩深交所源文件,需要提前配置enableShellFunction=true
  4. 若服务器为 ARM 版本,解压深交所文件时调用的shell命令需要指定7zz命令的绝对路径,7zz解压时需要替换 ExchData 模块下的prepare.dos文件的7zz命令,需要替换 prepare.dos 的 unzipFile 中为实际使用的7zz命令路径(例如,/usr/local/bin/7zz x …… -o…… -y)
  5. 导入深交所文件时,需要注意解压的文件是否存在分卷解压的情况,若存在需要确保各卷文件未存在数据缺失,导致解压失败

8. 总结

DolphinDB ExchData 模块为用户导入和处理沪深交易所 Level-2 行情数据提供了一套完整的解决方案, 本文介绍了模块的功能、行情文件结构及表结构、使用示例、数据校验等方面。用户基于本模块自动化的流程以及完整的校验机制,可以提高 Level-2 行情数据导入的效率以及数据完整性。

附录

  • ExchData 导入模块见:ExchData 交易所历史股票数据自动化导入功能模块使用教程 (dolphindb.cn)
  • 未压缩的文件结构:
SH
├── 2015
│   └── 20150105
│      ├── Entrust.csv
│      ├── Snapshot.csv
│      └── Tick.csv
|      ……    
├── 2020
│   └── 20200104
│      ├── Entrust.csv
│      ├── Snapshot.csv
│      └── Tick.csv
|      ……    
└── 2023
│   └── 20231205
│      ├── Snapshot.csv
│      └── StockTick.csv
|      ……    
SZ
├── 2016
│   ├── 0506
│   │   ├── SZL2_ORDER_20160506.7z.001
│   │   ├── SZL2_SNAPSHOT_20160506.7z.001
│   │   ├── SZL2_SNAPSHOTDW_20160506.7z.001
│   │   └── SZL2_TRADE_20160506.7z.001
│   └── 0509
│       ├── am_hq_order_spot.7z.001
│       ├── am_hq_snap_spot.7z.001
│       ├── am_hq_trade_spot.7z.001
│       ├── am_snap_level_spot.7z.001
│       ├── pm_hq_order_spot.7z.001
│       ├── pm_hq_snap_spot.7z.001
│       ├── pm_hq_trade_spot.7z.001
│       └── pm_snap_level_spot.7z.001
|      ……  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/484210.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zotero中pdf-translate插件和其他插件的安装

1.工具–》插件 2.找插件 3.点击之后看到一堆插件 4.找到需要的,例如pdf-translate 5.点击进入,需要看一下md文档了解下,其实最重要的就是找到特有的(.xpi file) 6.点击刚刚的蓝色链接 7.下载并保存xpi文件 8.回到zotero,安装并使…

5.12【机器学习】卷积模型搭建

softmax输出时不可能为所有模型提供精确且数值稳定的损失计算 model tf.keras.models.Sequential([tf.keras.layers.Flatten(input_shape(28, 28)),tf.keras.layers.Dense(128, activationrelu),tf.keras.layers.Dropout(0.2),tf.keras.layers.Dense(10) ]) mnist tf.keras…

头歌 Linux之线程管理

第1关:创建线程 任务描述 通常我们编写的程序都是单进程,如果在一个进程中没有创建新的线程,则这个单进程程序也就是单线程程序。本关我们将介绍如何在一个进程中创建多个线程。 本关任务:学会使用C语言在Linux系统中使用pthrea…

工业机器视觉-基于深度学习的水表表盘读数识别

字轮数字识别、指针读数识别(角度换算)、根据指针角度进行读数修正、根据最高位指针(x0.1)读数对字轮数字进行修正、得到最终读数。 基于深度学习的目标检测技术和OpenCV图像处理技术,可识别所有类型的表盘机械读数。

超详细MacBook Pro(M1)配置GO语言环境(图文超详细版)

前提 当我第一次使用MacBook配置Go语言环境时,网上的资料错综复杂,部分资料对于第一次使用MacBook的小白们非常不友好,打开终端时,终端的位置对应的访达中的位置不是很清楚,因此才有了这篇文章,该文章通过…

大数据项目-Django基于聚类算法实现的房屋售房数据分析及可视化系统

《[含文档PPT源码等]精品Django基于聚类算法实现的房屋售房数据分析及可视化系统》该项目含有源码、文档、PPT、配套开发软件、软件安装教程课程答疑等! 数据库管理工具:phpstudy/Navicat或者phpstudy/sqlyog 后台管理系统涉及技术: 后台使…

魔改版kali分享(新增50多种渗透工具)

网盘链接 我用夸克网盘分享了「Kali Linux 定制化魔改系统」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。 链接:https://pan.quark.cn/s/dda56f7e3431 提取码:…

矩阵加法        ‌‍‎‏

矩阵加法 C语言代码C 语言代码Java语言代码Python语言代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输入两个n行m列的矩阵A和B&#xff0c;输出它们的和AB。 输入 第一行包含两个整数n和m&#xff0c;表示矩阵的行数和列数。1 <…

前端开发 之 15个页面加载特效下【附完整源码】

文章目录 十二&#xff1a;铜钱3D圆环加载特效1.效果展示2.HTML完整代码 十三&#xff1a;扇形百分比加载特效1.效果展示2.HTML完整代码 十四&#xff1a;四色圆环显现加载特效1.效果展示2.HTML完整代码 十五&#xff1a;跷跷板加载特效1.效果展示2.HTML完整代码 十二&#xff…

微信 创建小程序码-有数量限制

获取小程序码&#xff1a;小程序码为圆图&#xff0c;有数量限制。 目录 文档 接口地址 功能描述 注意事项 请求参数 对接 获取小程序码 调用获取 小程序码示例 总结 文档 接口地址 https://api.weixin.qq.com/wxa/getwxacode?access_tokenaccess_token 功能描述 …

DP、CP、Mn是什么?有什么关系?双径节齿轮又是什么?

有一些刚刚接触齿轮的小伙伴们&#xff0c;经常听到和齿轮相关的是Mn这个代号&#xff0c;有时候拿到图纸会碰到DP和CP的图纸&#xff0c;今天就简单数一数他们三个的关系&#xff1a; 径节DP 齿轮的节距定义为两个相邻齿轮齿上两个相同点之间的距离。在理想情况下&#xff0c…

Linux之socket编程(一)

前言 网络通信的目的 我们已经大致了解了网络通信的过程: 如果主机A想发送数据给主机B, 就需要不断地对本层的协议数据单元(PDU)封装, 然后经过交换设备的转发发送给目的主机, 最终解封装获取数据. 那么网络传输的意义只是将数据由一台主机发送到另一台主机吗&#xff1f; …

视频 的 音频通道提取 以及 视频转URL 的在线工具!

视频 的 音频通道提取 以及 视频转URL 的在线工具&#xff01; 工具地址: https://www.lingyuzhao.top/toolsPage/VideoTo.html 它提供了便捷的方法来处理视频文件&#xff0c;具体来说是帮助用户从视频中提取音频轨道&#xff0c;并将视频转换为可以通过网络访问的URL链接。无…

Java环境变量配置

在Java 的开发环境的准备中&#xff0c;一般安装完JDK之后会进行Java相关的环境变量的配置&#xff0c; 那么&#xff1a; 需要配置哪些环境变量呢&#xff1f;为什么要配置这些环境变量呢&#xff1f; Java 相关的环境变量 JAVA_HOME &#xff0c; &#xff3b;新增环境变量…

sizeof和strlen区分,(好多例子)

sizeof算字节大小 带\0 strlen算字符串长度 \0之前

STM32 DMA直接存储器存取原理及DMA转运模板代码

DMA简介&#xff1a; 存储器映像&#xff1a; 注意&#xff1a;FLASH是只读的&#xff0c;DMA不能写入&#xff0c;但是可以读取写到其他存储器里 变量是存在运行内存SRAM里的&#xff0c;常量&#xff08;const&#xff09;是放在程序存储器FLASH里的 DMA框图&#xff1a; …

释放超凡性能,打造鸿蒙原生游戏卓越体验

11月26日在华为Mate品牌盛典上&#xff0c;全新Mate70系列及多款全场景新品正式亮相。在游戏领域&#xff0c;HarmonyOS NEXT加持下游戏的性能得到充分释放。HarmonyOS SDK为开发者提供了软硬协同的系统级图形加速解决方案——Graphics Accelerate Kit&#xff08;图形加速服务…

【专题】计算机网络之运输层(传输层)

1. 运输层协议概述 1.1 进程之间的通信 (1) 运输层的作用 运输层提供进程间的逻辑通信。 运输层的屏蔽作用&#xff1a; 运输层向高层用户屏蔽了下面网络核心的细节&#xff08;如网络拓扑、所采用的路由选择协议等&#xff09;&#xff0c;使应用进程看见的就是好像在两个运…

四轮阿克曼(前轮转向、后轮驱动)车子仿真控制

目录 写在前面的话调用 libgazebo_ros_ackermann_drive.so 插件属性介绍补充 steering_wheel_joint 配置键盘控制命令 结果演示 写在前面的话 这里增加一个四轮阿克曼&#xff08;前轮转向、后轮驱动&#xff09;车子仿真控制的版本&#xff0c;使用的事gazebo的插件 参考资料…

移植NIOS10.1工程,NIOS10.1路径修改

移植NIOS10.1工程&#xff0c;NIOS10.1路径修改 因工程的需要&#xff0c;使用的NIOS10.1&#xff0c;比较老&#xff0c;这个版本的路径是使用的绝对路径&#xff0c;导致移植工程市回报路径的错误&#xff0c;在13.1之后改为了相对路径&#xff0c;不存在这个问题。 需要修…