QuestDB数据表
QuestDB 没有 database 数据库独立实例,默认为 qdb,因此只需要建数据表即可
为了实现行情数据的灵活分区存储,可以采用”时间+标的“的方式进行数据分区,QuestDB 只支持时间分区(RoadMap 中预计在 2025Q1 支持)
- 逐笔委托(ORDER)
股票逐笔委托数据记录的最小时间间隔为 0.01 秒,每个 0.01 秒内有可能有多笔委托,Level-2 行情数据对 0.01 秒内的委托时点进行模糊处理,不进行区分。 股票逐笔委托数据的单日数据量由于交易活跃度不同,不同标的之间会有很大差异
CREATE TABLE IF NOT EXISTS order_book (
security_id SYMBOL, -- 证券代码
transact_time TIMESTAMP, -- 委托时间
price DOUBLE, -- 委托价格
balance INT, -- 委托数量
order_bs_flag BOOLEAN -- 买卖方向: true - 买; false - 卖
) timestamp(transact_time) PARTITION BY DAY WAL;
transact_time 为数据库引擎时序分区字段,此表需要基于 DAY (天) 时间分区,必需要有 timestamp 字段以进行数据写入时自动表分区
- 逐笔成交(TRADE)
股票逐笔成交数据记录了股票交易的每一笔成交信息。每笔成交包含价格、成交量、成交金额、成交时间等信息。单日数据量与不同标的的交易活跃度有关
CREATE TABLE IF NOT EXISTS trade_book (
security_id SYMBOL, -- 证券代码
trade_bs_flag BOOLEAN, -- 成交类别: true - 成交; false - 撤销
trade_time TIMESTAMP, -- 委托时间
trade_price DOUBLE, -- 委托价格
trade_qty INT, -- 成交数量
trade_amount DOUBLE, -- 成交金额
buy_no STRING, -- 买方委托编号
sell_no STRING -- 卖方委托编号
) timestamp(trade_time) PARTITION BY DAY WAL;
实现利⽤⻓度为 300tt、步进为 1tt 的滑动窗⼝ win300, win300 存储每 1tt 内所有委托⾦额的 sum, 随后实时计算 win300 中未被撤单的委托⾦额的 std 值, 并同时计算 win300 内⼤于 0 的委托⾦额的 std 值
计算每 10ms 内所有委托金额的总和: