#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 .