Estoy utilizando la API de Coinbase WebSocket para extraer datos en tiempo real sobre el libro de órdenes para BTC-USD.
Estoy utilizando el siguiente código para almacenar las instantáneas de las ofertas y demandas y los cambios en el libro de órdenes cada vez que hay una actualización de la bolsa.
import websocket,json
import pandas as pd
import numpy as np
from datetime import datetime, timedelta,timezone
from dateutil.parser import parse
pd.DataFrame(columns=['time','side','price','changes']).to_csv("changes.csv")
def on_open(ws):
print('opened connection')
subscribe_message ={
"type": "subscribe",
"channels": [
{
"name": "level2",
"product_ids": [
"BTC-USD"
]
}
]
}
print(subscribe_message)
ws.send(json.dumps(subscribe_message))
timeZero = datetime.now(timezone.utc)
timeClose = timeZero+timedelta(seconds=61)
def on_message(ws,message):
js=json.loads(message)
#print([js['time'],js['trade_id'],js['last_size'],js['best_ask'],js['best_bid']])
if js['type']=='snapshot':
print('Start: ',timeZero)
pd.DataFrame(js['asks'],columns=['price','size']).to_csv("snapshot_asks.csv")
pd.DataFrame(js['bids'],columns=['price','size']).to_csv("snapshot_bids.csv")
elif js['type']=='l2update':
mydate=parse(js['time'])
if mydate >= timeClose:
print('Closing at ', mydate)
ws.close()
side = js['changes'][0][0]
price = js['changes'][0][1]
change = js['changes'][0][2]
pd.DataFrame([[js['time'],side, price, change]],columns=['time','side','price','changes']).to_csv("changes.csv",mode='a', header=False)
socket = "wss://ws-feed.exchange.coinbase.com"
ws = websocket.WebSocketApp(socket,on_open=on_open, on_message=on_message)
ws.run_forever()
De esta manera, todos los cambios se guardan en un archivo csv. Este código se ejecuta durante aproximadamente 1 minuto, pero me gustaría hacerlo funcionar durante un día y luego reconstruir el libro de órdenes.
Una vez hecho esto, quiero analizar el libro de órdenes cada segundo para estudiar cuál es el impacto del precio de comprar (o vender) una cantidad específica de bitcoins.
Por supuesto, este código crea un archivo muy grande 'changes.csv', y si trato de hacerlo funcionar en AWS, el uso de la CPU alcanza el 90% después de algún tiempo y el proceso se mata. ¿Cuál es la forma más eficiente de almacenar el libro de órdenes en cada segundo?