Нужно собрать признаки для HFT lead-lag датасета.
Даны:
grid;Для каждого 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]: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}]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}]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}]