Level 2 行情数据存储处理

python 复制代码
DolphinDB 处理 Level 2 行情数据实例
Level 2 高频行情数据包含大量有价值的信息,利用这些数据生成交易信号和获取收益已经成为量化研究中的一种主流策略。作为一个高性能时序数据库,DolphinDB 非常适合存储、处理 GB 级别甚至 PB 级别的海量数据集,包括 Level 2 高频行情数据的存储、因子计算、建模、回测和实盘交易等。

本文基于国内 A 股市场 Level 2 高频行情数据的特点来展示高频行情数据存储和因子计算实例。根据历史批量因子计算、实时因子计算两个场景,以及针对不同的高频数据源,本文总结出了在 DolphinDB 中处理 Level 2 行情数据实例。

本文涉及的脚本见附件,DolphinDB server 版本为 2.00.9。

1. Level 2 行情数据介绍
1.1 数据概况
1.2 数据结构
2. DolphinDB 高效存储 Level 2 行情数据
2.1 分区方案
2.2 分区内分组排序
2.3 Level 2 行情数据存储方案
3. 基于历史数据的批量因子计算
3.1 快照数据的因子计算
3.2 逐笔成交数据的因子计算
3.3 逐笔委托数据的因子计算
4. 基于 Level 2 实时行情数据的流式实现
4.1 快照实时行情数据的高频因子流批一体实现
4.2 延时成交订单因子的流式实现
5. 总结
6. 附件
1. Level 2 行情数据介绍
1.1 数据概况
Level 2 行情数据是目前国内证券市场上最为完整,颗粒度最为精细的交易信息数据。其涵盖了在沪深两市上市的股票、可交易型基金、沪深交易所指数等大量品种。

Level 2 行情数据分类表如下:

数据类型	数据频率
分钟 K 线	1分钟
盘口快照	3秒
委托队列	3秒
逐笔成交	0.01秒
逐笔委托	0.01秒
分钟K线:即当日全天的分钟K线行情。相比传统K线,包含了分钟成交笔数信息。

盘口快照:即常用的每3秒一个切片的十档委托行情。其中,也包括该时刻的委托总量和平均委托价格信息。

委托队列:即买一、卖一的总委托单数,以及前50笔委托的明细信息。

成交明细:即两个3秒快照之间,详细的逐笔成交与逐笔委托信息。

需要注意的是,沪深交易所的 Level 2 行情数据存在一定的差异,主要体现在成交明细数据方面。深交所的逐笔成交数据中,包括了逐笔委托数据,其中有详细的挂撤单信息,和标记为撤单的逐笔成交。

1.2 数据结构
上交所提供的1分钟数据是 Level 2 行情数据中数据字段最少、频率最低的数据。其主要包含昨日收盘价、开盘价、最高价、最低价、收盘价、成交量和成交额等数据。

A股票行情快照数据每3秒钟记录一次,包括前后两个时刻的盘口变化数据。每天的数据量约为15G。

股票行情快照数据原始字段说明对照表(表中的空字段,说明当前市场的行情数据中没有该字段)

深交所数据	上交所数据	字段含义
security_id	SecurityID	证券代码
orig_time	DateTime	时间戳:2021-03-01 12:45:00.000
preclose_px	PreClosePx	昨日收盘价
open_px	OpenPx	开盘价
high_px	HighPx	最高价
low_px	LowPx	最低价
last_px	LastPx	收盘价
up_limit_px		涨停
down_limit_px		跌停
trading_phase_code	InstrumentStatus	交易状态
num_trades	NumTrades	成交笔数
total_volume_trade	TotalVolumeTrade	成交总量
total_value_trade	TotalValueTrade	成交总金额
total_bid_qty	TotalBidQty	委托买入总量
total_offer_qty	TotalOfferQty	委托卖出总量
WithdrawBuyNumber	买入撤单笔数
WithdrawSellNumber	卖出撤单笔数
WithdrawBuyAmount	买入撤单数量
WithdrawSellAmount	卖出撤单数量
WithdrawBuyMoney	买入撤单金额
WithdrawSellMoney	卖出撤单金额
weighted_avg_bid_px	WeightedAvgBidPx	加权平均委买价格
bid_px	BidPrice[10]	委买价格10
offer_px	OfferPrice[10]	委卖价格10
bid_size	BidOrderQty[10]	买10量
offer_size	OfferOrderQty[10]	卖10量
order_qty_b1	BidOrders[50]	委买订单50
order_qty_s1	OfferOrders[50]	委卖订单50
股票逐笔委托数据记录的最小时间间隔为0.01秒,每个0.01秒内有可能有多笔委托,Level 2 行情数据对0.01秒内的委托时点进行模糊处理,不进行区分。 股票逐笔委托数据的单日数据量在 12GB 左右,由于交易活跃度不同,不同标的之间的单日数据量会有很大差异。

股票逐笔委托原始数据字段说明对照表(表中的空字段,说明当前市场的行情数据中没有该字段)

深交所数据	上交所数据	字段含义
SecurityID	SecurityID	证券代码
OrigTime	TransactTime	时间戳:2021-03-01 12:45:00.000
Price	Price	委托价格
OrderQty	Balance	委托数量
Side	OrderBSFlag	买卖方向:
沪市为B -- 买单;S -- 卖
深市为1 - 买;2 - 卖
OrderNo	委托订单号
ApplSeqNum		委托索引(仅深交所)
ChannelNo	ChannelNo	频道代码
OrderType	OrdType	委托类别:
沪市为A -- 委托订单(增加);D -- 委托订单(删除)
深市为1-市价;2-限价;U - 本方最优
BizIndex	业务序列号,与逐笔成交统一编号,从 1 开始按 Channel 连续
OrderIndex	委托序号, NUMBER 从 1 开始,按 Channel 连续
与股票逐笔委托数据相似,股票逐笔成交数据记录了股票交易的每一笔成交信息。每笔成交包含价格、成交量、成交金额、成交时间等信息。单日数据量在 6GB 左右,与不同标的的交易活跃度有关。

股票逐笔成交数据原始字段说明对照表(表中的空字段,说明当前市场的行情数据中没有该字段)

深交所数据	上交所数据	数据说明
SecurityID	SecurityID	证券代码
ExecType	TradeBSFlag	成交类别:
沪市为B -- 外盘,主动买;S -- 内盘,主动卖;N -- 未知
深市为4 - 撤销;F - 成交
OrigTime	TradeTime	
Price	TradePrice	成交价格
TradeQty	TradeQty	成交数量
TradeAmount	成交金额
BidApplSeqNum	BuyNo	买方序号
OfferApplSeqNum	SellNo	卖方序号
TradeIndex	成交序号
BizIndex	业务序列号
ChannelNo	ChannelNo	频道代码
2. DolphinDB 高效存储 Level 2 行情数据
A股股票高频数据每日数据增量在30+G,基金债券等标的每日数据量在45+G。历史数据和每日增量数据数据量在 10TB 级别以上。面对如此庞大的数据量, 如何保证高效的数据写入、数据压缩和快速的数据查询计算是高频数据存储的一大挑战。

为解决这一挑战,我们将 DolphinDB 的存储特性组合使用,提供了灵活的存储解决方案。

2.1 分区方案
为了实现行情数据的灵活分区存储,可以采用"时间+标的"的方式进行数据分区。DolphinDB 支持对不同分区数据进行多线程并行操作。

2.2 分区内分组排序
DolphinDB 的 TSDB 引擎提供了排序键设置,可以为每个数据分区设置一个排序键,以便在数据随机读取时更准确地定位数据。例如,通过设置 SortColumn=["SecurityID", "TradeTime"],数据可以按照 SecurityID 字段分组,并在每个组内按照时间字段 TradeTime 排序。

2.3 Level 2 行情数据存储方案
在上交所股票 Level 2 行情数据中,市价单信息只存储于逐笔成交表中,而逐笔委托表中没有市价单的记录,因此计算委托量和委托金额等指标时需要对两个表进行关联。在深交所 Level 2 行情数据中,逐笔委托表中的市价单价格标记为0;而撤单记录在逐笔成交表中,撤单记录中价格也标记为0;因此在计算委托金额、撤单金额等指标时都需要对两个表进行关联再计算。此外,在计算其他因子指标时,也需要对逐笔成交表和行情快照数据表进行关联。

根据业务需求,这里对沪深股票 Level 2 高频数据采用一库三表的建库建表方案,即把两个交易所相同的行情数据存入同一张表,使用 market 字段标识不同的交易所,且将 market 设置在索引列(SortColumn)中。

数据源	数据量	分区方案(组合分区)	库、表名称	SortColumn 字段
行情快照	15G+	交易日按值分区+标的哈希20分区	"dfs://level_2","snapshot"	market,SecurityID,TradeTime
逐笔委托	11G+	交易日值分区+标的哈希20分区	"dfs://level_2","entrust"	market,SecurityID,TradeTime
逐笔成交	6G+	交易日值分区+标的哈希20分区	"dfs://level_2","trade"	market,SecurityID,TradeTime
库表创建之后,数据的导入教程可以参考DolphinDB的数据导入相关教程,如金融 PoC 用户历史数据导入指导手册之股票 level2 逐笔篇。

参考:https://gitee.com/dolphindb/Tutorials_CN/blob/master/Level-2_stock_data_processing.md#3--基于历史数据的批量因子计算

相关推荐
18号房客1 天前
高级sql技巧进阶教程
大数据·数据库·数据仓库·sql·mysql·时序数据库·数据库架构
TDengine (老段)5 天前
TDengine 新功能 通过 UID 删除不可见表
大数据·数据库·物联网·时序数据库·tdengine
Cool----代购系统API5 天前
电商数据采集电商,行业数据分析,平台数据获取|稳定的API接口数据
python·算法·时序数据库
涛思数据(TDengine)5 天前
通过 TDengine 提升物联网平台性能的秘诀,联犀深度解析
大数据·时序数据库·tdengine
VinciYan13 天前
国产物联网平台(IotSharp+IoTGateway+Influxdb)快速上手
物联网·时序数据库·iot·国产
Elastic 中国社区官方博客14 天前
Elasticsearch Serverless 中的数据流自动分片
大数据·数据库·elasticsearch·搜索引擎·serverless·时序数据库
北漂IT民工_程序员_ZG14 天前
docker安装victoriametrics(单机版)
时序数据库
TDengine (老段)16 天前
TDengine 新功能 复合主键
java·大数据·c语言·数据库·时序数据库·tdengine·涛思数据
Elastic 中国社区官方博客17 天前
Elasticsearch ILM 故障排除:常见问题及修复
大数据·数据库·elasticsearch·搜索引擎·全文检索·时序数据库
mqiqe19 天前
TDengine 详解
大数据·时序数据库·tdengine