Redis TimeSeries - правильный инструмент для отслеживания свечей в ценах акций

В настоящее время я пытаюсь сделать простую реализацию для свечей цены акций. Допустим, у нас есть акция под названием XYZ. Эта акция получает поток цен (без определенной частоты), который (например) выглядит так: XYZ: [10.2, 10.7, 12, 11 ....].

Цель состоит в том, чтобы записывать некоторые показатели за каждую прошедшую минуту, чтобы отразить состояние этой акции. У свечи есть такие показатели, как цена закрытия (последняя известная цена в течение минуты), максимальная цена (максимальная цена в течение минуты) и т. Д.

Я думал, что могу реализовать это одним из способов - использовать Redis TimeSeries. Я рассмотрел это решение, потому что я могу создавать правила для потока цен, и каждые 60 секунд оно сбрасывает некоторые агрегации (например: max, min, first... и т. Д.) В целевую корзину.

Моя текущая реализация с использованием Redis TimeSeries (на Python) для свечей для каждой цены акций выглядит примерно так (снова с использованием акции XYZ в качестве примера) и без меток для простоты:

from redistimeseries.client import Client
r = Client()
r.flushdb()

# Create source & destination buckets
r.create('XYZ_PRICES')  # source
r.create(closing_price)
r.create(highest_price)
# Create rules to send data from src -> closing_price & highest_price buckets
r.createrule(src, 'closing_price', 'last', bucket_size_msec=60000)
r.createrule(src, 'highest_price', 'max', bucket_size_msec=60000)

Мои вопросы:

  1. Есть ли способ отправить более одной агрегации (например, max, last... и т. Д.) В одном правиле вместо создания нескольких исходных и целевых сегментов для каждой акции?
  2. Подходит ли Redis TimeSeries для этой задачи? Или будет проще использовать другое решение (например, потоки Redis)?

3 ответа

Решение
  1. Нет возможности отправить более одного агрегирования в серию субдискретизации, так как каждая временная метка может содержать одну. Вы можете использовать метки для одновременного запроса всех серий.
  2. RedisTimeSeries был бы хорошим решением, поскольку он будет понижать дискретизацию ваших данных при вставке, поэтому запросы к ним будут очень быстрыми. Он также использует двойное дельта-сжатие, что означает, что вашим данным потребуется меньше памяти, чем некоторым другим решениям. Вы даже можете использовать удержание, чтобы удалить исходные данные, если все, что вас волнует, - это свечи.
r.create('XYZ_PRICES', retention_msecs=300000, labels={'name':'xyz', 'type:src'})
 
r.create(opeing_price, labels={'name':'xyz', 'type:opening'})
r.create(closing_price, labels={'name':'xyz', 'type:closing'})
r.create(highest_price, labels={'name':'xyz', 'type:highest'})
r.create(lowest_price, labels={'name':'xyz', 'type:lowest'})

r.createrule(src, 'opening_price', 'first', bucket_size_msec=60000)
r.createrule(src, 'closing_price', 'last', bucket_size_msec=60000)
r.createrule(src, 'lowest_price', 'min', bucket_size_msec=60000)
r.createrule(src, 'highest_price', 'max', bucket_size_msec=60000)

F 4, спасибо, что попробовали RedisTimeSeries.

Вы можете настроить модуль на автоматическое создание правил в соответствии с предопределенными правилами. Это описано в документации: https://oss.redislabs.com/redistimeseries/configuration/.

Надеюсь, это решит вашу проблему.

Я создал пакет под названием RedisTimeseriesManager , который может автоматически создавать все правила понижения частоты дискретизации. Для полнофункциональной реализации см. https://github.com/ahmadazizi/redis_timeseries_manager/blob/main/examples/market_data.ipynb .

Другие вопросы по тегам