KDB / Q: лучший способ восстановить книгу заказов на основе исторических обновлений уровня / цен?

#kdb

#kdb

Вопрос:

Учитывая следующую спецификацию данных:

 q) ob
src sym  price   size  side   time                         
---------------------------------------------------------- 
 1   2    930700  439   -1    2020.06.20D00:00:00.053000000
 1   2    930708  444   -1    2020.06.20D00:00:00.054000000
 1   2    930739  817   1     2020.06.20D00:00:00.055000000
 1   2    930739  0     1     2020.06.20D00:00:00.056000000
...
 

при этом src представляет обмен, symbol и т. Д. где каждая строка представляет мгновенное состояние размера (количество невыполненных заказов) по каждой цене.

Каков наилучший механизм, для которого можно восстановить историческую книгу заказов в пределах заданного окна, например, 1000 тиков (с каждой стороны), где размер тика равен 1? (нижняя цена предложения = максимальная цена предложения — 1000; нижняя цена запроса = максимальная цена запроса 1000) и т.д.

Я думал о том, чтобы сделать следующее, но уступил предшественнику, что должен быть более формальный / эффективный механизм достижения этого, который я надеюсь извлечь из вашего совета. Обновления не обязательно агрегировать в режиме реального времени, т.Е. По событию, и в следующем примере предполагается, что окно агрегации составляет 10 секунд.

 // doesn't account for deleted levels (where size = 0) inefficient?
x:select last size by `src`sym`side`price 10 xbar `second$time from ob; // window by time
x:update fills size by `src`sym`side`price from x; // forward fill the sizes
x:delete from x where size=0;
x:delete from (select last size, last price, mnp:min price, mxp:max price by `src`sym`side`time) where $[side>0;price<(mxp-1000);price>(mnp 1000)]; // delete out of bounds asks and bids
 

Этот многоступенчатый подход кажется неэффективным, и поэтому я надеялся получить от вас представление о том, как сделать это более эффективно.
Я с нетерпением жду ваших ответов.
Заранее спасибо.

Комментарии:

1. Указывает ли size =0 на удаление? Редактировать: это упоминается в комментарии к исходному коду, извините.

Ответ №1:

Надеюсь, я правильно вас понял, но это то, что вам нужно?

 select last fills size by src,sym,side,price,10 xbar `second$time from tab where size<>0,?[side=-1;price<(min price) 1000;price>(max price)-1000]
 

Здесь мы просто используем предложение where для удаления ненужных строк вместо отдельных операторов delete .