Является ли 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)?

person alt-f4    schedule 23.06.2020    source источник


Ответы (2)


  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)
person Ariel    schedule 24.06.2020

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

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

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

person Danni    schedule 24.06.2020
comment
Привет Дэнни. Было весело использовать Redis TimeSeries! Мне не совсем понятно, что делает Политика уплотнения. Применяются ли эти правила к каждому создаваемому мной ключу? Куда идут образцы? - person alt-f4; 24.06.2020