Feature builder для Coinbase/Binance time grid

HardML coding
10:00
Лучше работает на десктопе
ML CodingFeature EngineeringTime SeriesHFT
Реальный собес00:15:24-00:47:472026-04-22 12-03-04.movСтраница собеса

Нужно собрать признаки для HFT lead-lag датасета.

Даны:

  • регулярная сетка времени grid;
  • нерегулярные обновления L1 order book для Binance и Coinbase;
  • нерегулярные сделки с обеих бирж.

Для каждого grid_ts нужно построить строку признаков, используя только события с timestamp <= grid_ts.

Для каждого стакана сделайте forward fill последнего известного bid/ask и верните:

  • bn_mid, bn_spread, bn_bid_size, bn_ask_size;
  • cb_mid, cb_spread, cb_bid_size, cb_ask_size.

Для сделок посчитайте суммарный notional price * amount в окне (previous_grid_ts, grid_ts] отдельно по бирже и стороне:

  • binance_buy_notional, binance_sell_notional;
  • coinbase_buy_notional, coinbase_sell_notional.

Если для стакана еще нет значения, верните None. Если сделок в окне нет, верните 0.0.

Сигнатура

def build_time_grid_features(
    grid: list[int],
    l1_binance: list[dict],
    l1_coinbase: list[dict],
    trades: list[dict],
) -> list[dict]:

Примеры

Пример 1

Вход:
grid = [100,200,300]
l1_binance = [{"ts":50,"bid_price":99,"ask_price":101,"bid_size":2,"ask_size":3}]
l1_coinbase = [{"ts":150,"bid_price":198,"ask_price":202,"bid_size":4,"ask_size":5}]
trades = []
Выход:[{"ts":100,"bn_mid":100,"bn_spread":2,"bn_bid_size":2,"bn_ask_size":3,"cb_mid":null,"cb_spread":null,"cb_bid_size":null,"cb_ask_size":null,"binance_buy_notional":0,"binance_sell_notional":0,"coinbase_buy_notional":0,"coinbase_sell_notional":0},{"ts":200,"bn_mid":100,"bn_spread":2,"bn_bid_size":2,"bn_ask_size":3,"cb_mid":200,"cb_spread":4,"cb_bid_size":4,"cb_ask_size":5,"binance_buy_notional":0,"binance_sell_notional":0,"coinbase_buy_notional":0,"coinbase_sell_notional":0},{"ts":300,"bn_mid":100,"bn_spread":2,"bn_bid_size":2,"bn_ask_size":3,"cb_mid":200,"cb_spread":4,"cb_bid_size":4,"cb_ask_size":5,"binance_buy_notional":0,"binance_sell_notional":0,"coinbase_buy_notional":0,"coinbase_sell_notional":0}]

Пример 2

Вход:
grid = [100,200]
l1_binance = [{"ts":100,"bid_price":10,"ask_price":12,"bid_size":1,"ask_size":2}]
l1_coinbase = []
trades = [{"ts":100,"exchange":"Binance","side":"Buy","price":11,"amount":3},{"ts":150,"exchange":"Coinbase","side":"Sell","price":20,"amount":2}]
Выход:[{"ts":100,"bn_mid":11,"bn_spread":2,"bn_bid_size":1,"bn_ask_size":2,"cb_mid":null,"cb_spread":null,"cb_bid_size":null,"cb_ask_size":null,"binance_buy_notional":33,"binance_sell_notional":0,"coinbase_buy_notional":0,"coinbase_sell_notional":0},{"ts":200,"bn_mid":11,"bn_spread":2,"bn_bid_size":1,"bn_ask_size":2,"cb_mid":null,"cb_spread":null,"cb_bid_size":null,"cb_ask_size":null,"binance_buy_notional":0,"binance_sell_notional":0,"coinbase_buy_notional":0,"coinbase_sell_notional":40}]

Пример 3

Вход:
grid = [100,200]
l1_binance = [{"ts":250,"bid_price":1,"ask_price":3,"bid_size":1,"ask_size":1}]
l1_coinbase = []
trades = [{"ts":50,"exchange":"Binance","side":"Buy","price":10,"amount":1}]
Выход:[{"ts":100,"bn_mid":null,"bn_spread":null,"bn_bid_size":null,"bn_ask_size":null,"cb_mid":null,"cb_spread":null,"cb_bid_size":null,"cb_ask_size":null,"binance_buy_notional":10,"binance_sell_notional":0,"coinbase_buy_notional":0,"coinbase_sell_notional":0},{"ts":200,"bn_mid":null,"bn_spread":null,"bn_bid_size":null,"bn_ask_size":null,"cb_mid":null,"cb_spread":null,"cb_bid_size":null,"cb_ask_size":null,"binance_buy_notional":0,"binance_sell_notional":0,"coinbase_buy_notional":0,"coinbase_sell_notional":0}]
Консоль
Нажмите Run или Ctrl+Enter для запуска