Level 2 高频行情数据包含大量有价值的信息富盈基金代码,利用这些数据生成交易信号和获取收益已经成为量化研究中的一种主流策略。本文基于国内 A 股市场 Level 2 高频行情数据的特点,展示高频行情数据存储和因子计算实例。
1
Level 2 行情数据分类
Level 2 行情数据是目前国内证券市场上最为完整,颗粒度最为精细的交易信息数据。其涵盖了在沪深两市上市的股票、可交易型基金、沪深交易所指数等大量品种。
Level 2 行情数据分类表如下:
分钟K线富盈基金代码:即当日全天的分钟K线行情。相比传统K线,包含了分钟成交笔数信息。
盘口快照:即常用的每3秒一个切片的十档委托行情。其中,也包括该时刻的委托总量和平均委托价格信息。
委托队列:即买一、卖一的总委托单数,以及前50笔委托的明细信息。
成交明细:即两个3秒快照之间,详细的逐笔成交与逐笔委托信息。
需要注意的是,沪深交易所的 Level 2 行情数据存在一定的差异,主要体现在成交明细数据方面。深交所的逐笔成交数据中,包括了逐笔委托数据,其中有详细的挂撤单信息,和标记为撤单的逐笔成交。
2
Level 2 行情数据结构
上交所提供的1分钟数据是 Level 2 行情数据中数据字段最少、频率最低的数据。其主要包含昨日收盘价、开盘价、最高价、最低价、收盘价、成交量和成交额等数据。
A股票行情快照数据每3秒钟记录一次,包括前后两个时刻的盘口变化数据。每天的数据量约为15G。
股票行情快照数据原始字段说明对照表(表中的空字段,说明当前市场的行情数据中没有该字段)
展开全文
股票逐笔委托数据记录的最小时间间隔为0.01秒,每个0.01秒内有可能有多笔委托,Level 2 行情数据对0.01秒内的委托时点进行模糊处理,不进行区分。股票逐笔委托数据的单日数据量在12GB左右,由于交易活跃度不同,不同标的之间的单日数据量会有很大差异。
股票逐笔委托原始数据字段说明对照表(表中的空字段,说明当前市场的行情数据中没有该字段)
与股票逐笔委托数据相似,股票逐笔成交数据记录了股票交易的每一笔成交信息。每笔成交包含价格、成交量、成交金额、成交时间等信息。单日数据量在6GB左右,与不同标的的交易活跃度有关。
股票逐笔成交数据原始字段说明对照表(表中的空字段,说明当前市场的行情数据中没有该字段)
3
Level 2 行情数据的存储与计算
A股股票高频数据每日数据增量在30+G,基金债券等标的每日数据量在45+G。历史数据和每日增量数据数据量在10TB级别以上。面对如此庞大的数据量, 如何保证高效的数据写入、数据压缩和快速的数据查询、计算,是高频数据处理的一大挑战。
这里我们给大家介绍一个基于高性能时序数据库,支持数据分析和流计算的低延时平台——DolphinDB。
DolphinDB 具备强大的存储、处理 GB 级别甚至 PB 级别海量数据集的能力,包括 Level 2 高频行情数据的存储、因子计算、建模、回测和实盘交易等。DolphinDB 不仅提供了高速存取时序数据的基本功能,还内置了向量化的多范式编程语言和强大的计算引擎,可高效用于量化金融的因子开发。
4月27日(周四)晚七点半,DolphinDB CEO 周小华博士与数据分析负责人毛忻玥老师将线上开讲,围绕“打破 Python 束缚:Level 2 因子的脚本优化实践”主题,以多个复杂因子计算为案例,展示 DolphinDB 计算 Level 2 因子的最佳实践,并与 Python 进行性能对比,教授代码转换攻略。
下面将分别给大家介绍如何将 DolphinDB 的存储特性组合使用,构建一个灵活的存储解决 方案富盈基金代码; 以及如何在 DolphinDB 中实现常用 Level 2 因子的批计算。
3.1
Level 2 行情数据的存储
分区方案
为了实现行情数据的灵活分区存储,可以采用”时间+标的“的方式进行数据分区。DolphinDB 支持对不同分区数据进行多线程并行操作。
分区内分组排序
DolphinDB 的 TSDB引擎提供了排序键设置,可以为每个数据分区设置一个排序键,以便在数据随机读取时更准确地定位数据。例如,通过设置 SortColumn=[“SecurityID”, “TradeTime”],数据可以按照 SecurityID 字段分组,并在每个组内按照时间字段 TradeTime 排序。
存储方案
在上交所股票 Level 2 行情数据中,市价单信息只存储于逐笔成交表中,而逐笔委托表中没有市价单的记录,因此计算委托量和委托金额等指标时需要对两个表进行关联。在深交所 Level 2 行情数据中,逐笔委托表中的市价单价格标记为0富盈基金代码;而撤单记录在逐笔成交表中,撤单记录中价格也标记为0;因此在计算委托金额、撤单金额等指标时都需要对两个表进行关联再计算。此外,在计算其他因子指标时,也需要对逐笔成交表和行情快照数据表进行关联。
根据业务需求,这里对沪深股票 Level 2 高频数据采用一库三表的建库建表方案,即把两个交易所相同的行情数据存入同一张表,使用 market 字段标识不同的交易所,且将 market 设置在索引列(SortColumn)中。
3.2
基于历史数据的高频因子计算
Level 2 历史行情数据中有许多常用的行情快照、逐笔成交和逐笔委托高频因子,基于快照数据的常用因子有:
时间加权订单斜率
加权平均订单失衡率因子
成交价加权净委买比例
十档净委买增额
十档买卖委托均价线性回归斜率
基于逐笔成交数据的常用因子有:
单笔订单主动买入卖出均价
股票延时成交订单因子
基于逐笔委托数据的常用因子有:
委买委卖金额
买卖撤单金额
行情快照中的大部分高频因子基于限价订单簿的静态指标,例如价差、深度、宽度、斜率、订单不平衡等,研究市场的交易行为,进而预测股票的短期价格走势。
本节介绍基于 Level 2 行情快照中十档买卖价格和买卖数量数据计算的时间加权订单斜率、十档平均委卖订单斜率、成交价加权净委买比例、十档委买增额和十档买卖委托均价线性回归斜率等高频因子。
以下是 Level 2 行情快照数据十档部分字段的样例:
时间加权订单斜率
订单斜率因子衡量订单价差对订单量差的敏感度。其计算公式如下:
qt 衡量 t 时刻的订单斜率。其中,Bidt 和 Askt 分别表示买一价和卖一价,BidQtyt 和 AskQtyt 分别表示买一量和卖一量。
使用函数 mavg 计算过去20行的移动平均时间加权订单斜率,其中@state表示用户自定义的状态函数。状态算子计算时需要用到历史状态,DolphinDB 在流式计算中对自定义状态函数,通过增量的方式实现,性能有很大的提升。
加权平均订单失衡率因子
订单失衡率(SOIR)因子衡量买卖委托量在总量中的不均衡程度。其计算公式如下:
表示 $t$ 时刻第i档的订单失衡率因子。其中$BidQty_{i,t)$,$AskQty_{i,t)$表示第i档买方委托量和卖方委托量。为了充分利用各档数据信息,计算各档位加权和订单失衡率因子时,根据买卖压力的影响力赋予不同档位相应的权重。通常,靠近交易价格的档位被赋予更高的权重。计算公式如下:
SOIR 反应盘口各档综合的买卖委托量不均衡程度。如果 SOIR 为正,则说明市场买压大于卖压,未来价格趋势上涨的概率较高。此外,SOIR 值越大,上涨的概率越高,反之亦然。
BidQty, AskQty 为数组向量数据类型,分别为买方十档委托量和卖方十档委托数量。使用数组向量进行加减运算非常便捷,而使用 rowWavg 函数则可轻松计算加权平均值。在本例中,我们使用 rowWavg 函数计算各档加权平均的买卖委托量不均衡程度因子,即订单失衡率因子。最后对一段时间的指标进行移动标准化处理。
成交价加权净委买比例
净委买比率是衡量一段时间内买盘相对强度的指标,计算公式为:(盘口买一变化量-盘口卖一变化量)/ (abs(盘口买一变化量)+abs(盘口卖一变化量))×100%。当净委买比率为正值数值较大时,说明市场买盘强劲。当委比值为负值且数值较大时,说明市场卖盘强劲。数值从-100%逐步增加到+100%表示买盘逐渐增强,卖盘逐渐减弱;而从+100%逐步减少到-100%则表示买盘逐渐减弱,卖盘逐渐增强的过程。其计算公式如下:
chg(BidQtyi) 和 chg(AskQtyi) 分别表示在 i 时刻盘口买一和卖一变化量,而 $avgPrice_{t}$表示在 i-1 时刻到 i 时刻成交的平均价格。
return nullFill!(mfactorValue,0)
以上代码,首先通过计算买卖一档前后价格的变化,得到盘口买卖一委托量的绝对变化量;然后利用净委买比率公式,计算过去一段时间的成交价加权净委买比例。
十档净委买增额
十档净委买增额因子指的是在有效十档范围内买方资金总体增加量,即所有买价变化量的总和,计算公式如下:
有效十档范围内表示不考虑已不在十档范围内的档位,即表示只考虑以下区间的档位:
以上代码,首先通过行对齐函数 rowAlign 实现当前十档价格和前一个一十档价格进行行对齐,然后通过rowAt 和 nullFill 函数分别获取对应档位的委托量和实现价格进行对齐,最后计算总的变化额。
十档买卖委托均价线性回归斜率
十档买卖委托均价即为十档买卖委托额之和除以十档买卖委托量之和:
十档买卖委托均价线性回归斜率为十档买卖委托均价对时间t的线性回归的斜率。
以上代码,Bid, Ask, BidQty和AskQty 均为数组向量数据类型,分别为买卖十档价格和十档委托数量。通过 linearTimeTrend 函数获取因子值对时间 t 的滑动线性回归斜率,该函数返回线性回归的截距和斜率。linearTimeTrend(price_,lag1)[1]表示获取十档买卖委托均价对时间t的线性回归的斜率。
与 Python 计算性能的对比
在 Python 中实现上面5个因子的计算逻辑。获取一天中两只股票的数据进行对比测试。
下表为 DolphinDB 和 Python 计算性能的对比,可以发现,DolphinDB 显著优于 Python。
逐笔成交数据的因子计算逐笔成交数据包含的信息很丰富,可以构建很多中高频因子。以下为逐笔成交的样例数据:
利用逐笔成交数据中的买卖订单号,可以将其合并为单笔订单成交数据,并从单笔订单的角度区分大小单和主买卖方向等。本节从单笔订单和主买卖角度出发,计算主动买入和卖出的单笔订单均价,并统计成交时间与开始委托下单时长超过1分钟的订单数量。
单笔订单主动买入卖出均价
单笔订单主动买入、卖出均价为单笔主买、主卖订单的成交均价价格之和除以订单数量。
n 表示截至 t 时刻主买、主卖订单数量,avgTradePrice 表示单笔订单主买、主卖的成交均价。
return totolMoney\totolqty res=select avg(singleOrderAveragePrice(BidApplSeqNum,OfferApplSeqNum,TradePrice,TradeQty,"B")) as ActBuySingleOrderAveragePriceFactor, avg(singleOrderAveragePrice(BidApplSeqNum,OfferApplSeqNum,TradePrice,TradeQty,"S")) as ActSellSingleOrderAveragePriceFactor from tradeTB where TradePrice>0 group by SecurityID cgroup by minute(DateTime) as minute order by minute;
这里首先通过自定义函数实现单笔订单的成交均价,然后再计算单笔订单的成交均价。自定义函数中使用 groupby 函数分别计算单笔订单的成交金额和成交数量。
最后通过 group by + cgroup by 计算每只股票当日最新一分钟单笔订单主动买入、卖出均价。计算结果如下:
股票延时成交订单因子
延时成交挂单数和成交量,一定程度上能反应大单或者机构成交情况。本节统计从下单到成交的时间间隔超过1分钟的订单数和成交量。
tb=select count(iif(TradeTime-TransactTime>60000,SeqNo,NULL)) , sum(iif(TradeTime-TransactTime>60000,TradeQty,NULL)) from tb return tb.values() t1=select DelayedTradeOrder(DateTime,entrust.DateTime,BidApplSeqNum,TradeQty) as `DelayedTradeBuyOrderNum`DelayedTradeBuyOrderQty from lsj( trade,entrust,['SecurityID', 'BidApplSeqNum'], ['SecurityID', 'ApplSeqNum']) where trade.DateTime.date()=idate and TradePrice>0 group by SecurityID,trade.DateTime.date() as DateTime t2=select DelayedTradeOrder(DateTime,entrust.DateTime,OfferApplSeqNum,TradeQty) as `DelayedTradeSellOrderNum`DelayedTradeSellOrderQty from lsj(trade,entrust,['SecurityID', 'OfferApplSeqNum'], ['SecurityID', 'ApplSeqNum']) where trade.DateTime.date()=idate and TradePrice>0 group by SecurityID ,trade.DateTime.date() as DateTime map
下单信息记录在逐笔委托表里,如果统计下单到成交之间的时间间隔,则需要把逐笔成交表和逐笔委托表进行关联。这里首先通过左半连接(lsj)返回逐笔成交表中所有与逐笔委托表匹配的记录,如果逐笔委托表中有多条匹配记录(如上交所的下单和撤单记录),lsj 将会取第一条(下单时的订单记录)匹配记录。因此,lsj 可以把订单委托下单的时间以及下单量准确关联到成交记录中。
在计算股票延时成交订单因子的自定义函数中,先按每个订单号分组,计算订单下单到该笔订单最后成交时的最大时间差和订单的总成交量;然后根据最大延时是否超过1分钟来计算股票的延时订单数量和成交总量。
逐笔委托数据的因子计算Level 2 行情逐笔委托数据包含所有的委托订单信息(除了上交所的市价单(即时成交)和部分撤单,深交所的撤单),本节根据买卖订单的委托信息,计算深交所股票的委买委卖金额和撤单金额指标数据。
逐笔委托数据数据样例如下:
委买委卖金额
委托买卖金额是对一段时间内委托订单的买卖方向的资金总量进行统计。由于深交所的市价订单的价格在逐笔委托表里标记为0,因此计算委托金额时,我们需要在逐笔成交记录中找到最近的成交价格来作为其近似值。
timer res= mr(ds, calcSZwithdrawOrderValue{,entrustTB}, , unionAll{,false})
这里通过lj(left join)分别把买卖撤单的委托价格关联到撤单信息表中,然后计算每只股票每分钟的买卖撤单金额。
从这些因子的计算中可以看到,使用 DolphinDB 存储和计算 A 股市场 Level 2 高频行情数据非常高效、灵活。上文涉及到了大量 DolphinDB 脚本,以及与 Python 脚本性能的对比,完整的详细对比代码,将在4月27日(周四)晚七点半的 DolphinDB 直播间进行展示。
届时,DolphinDB CEO 周小华博士与数据分析负责人毛忻玥老师,将一同主讲,帮助大家更高效地实现从 Python 到 DolphinDB 的转换。
扫描下方二维码即可报名!