redis时间序列中的OHLCV数据压缩



我正在使用一个websocket连接流股票tick数据并将它们存储到redis。我想把它压缩成1分钟的烛台。

下面是我如何设置redis。这里我用'NIFTY'表示原始滴答数据,用'NIFTYV'表示滴答量数据。我创建了O, H, L, C, V时间序列来存储压缩后的数据。

当运行代码时,我可以看到滴答价格和体积被添加到NIFTY和NIFTYV时间序列。但是压缩并没有发生。

r = redis.Redis(db=0)
ts = r.ts()
inst = 'NIFTY'
ts.create(inst, labels={'name':inst})
ts.create(inst + 'V', labels={'name':inst})
ts.create('O', labels={'name':inst, 'type':'O'})
ts.create('H', labels={'name':inst, 'type':'H'})
ts.create('L', labels={'name':inst, 'type':'L'})
ts.create('C', labels={'name':inst, 'type':'C'})
ts.create('V', labels={'name':inst, 'type':'V'})
ts.createrule(inst, 'O', 'first', bucket_size_msec=60000)
ts.createrule(inst, 'H', 'max', bucket_size_msec=60000)
ts.createrule(inst, 'L', 'min', bucket_size_msec=60000)
ts.createrule(inst, 'C', 'last', bucket_size_msec=60000)
ts.createrule(inst + 'V', 'V', 'sum', bucket_size_msec=60000)

这就是我如何添加tick和volume数据。时间戳由websocket提供。

根据文档将时间戳设置为*将使用redis服务器时间。

timestamp = msg['timestamp']
ts.add(inst, timestamp, tick['price'])
ts.add(inst + 'V', timestamp, tick['qty'])

我假设redis自动压缩数据在1分钟的间隔或我需要手动触发这?

RedisTimeSeries在设计上没有时间进程的概念。它没有内部时钟。压缩桶的"关闭"完全基于它们的时间戳与传递给TS.ADD、TS.MADD、TS.INCRBY和TS.DECRBY的最近时间戳之间的差异。

只有当新样品到达时,桶才被"关闭"和压实,并"打开"一个"最新的"桶。

从RedisTimeSeries 1.8开始,您可以在TS.GET、TS.MGET、TS.RANGE、TS.REVRANGE、TS.MRANGE和TS.MREVRANGE中使用LATEST标志来检索压缩时间序列的最新"打开"桶。

最新更新