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)
Мои вопросы:
- Есть ли способ отправить более одной агрегации (например, max, last... и т. Д.) В одном правиле вместо создания нескольких исходных и целевых сегментов для каждой акции?
- Подходит ли Redis TimeSeries для этой задачи? Или будет проще использовать другое решение (например, потоки Redis)?
3 ответа
- Нет возможности отправить более одного агрегирования в серию субдискретизации, так как каждая временная метка может содержать одну. Вы можете использовать метки для одновременного запроса всех серий.
- 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 .