CloseToAlgoTrading
CloseToAlgoTrading Ответы на вопросы
25 марта 2019, 19:33

Алготрейдерам: Скажите, кто занимается сбором тиковых данных или 1-5сек баров, стоит ли заморачиваться по поводу оптимизации данных сохраняемых в базу данных? если кто делает поделитесь как :)

Алготрейдерам: Скажите, кто занимается сбором тиковых данных или 1-5сек баров, стоит ли заморачиваться по поводу оптимизации данных сохраняемых в базу данных? если кто делает поделитесь как :)
40 Комментариев
  • Андрей К
    25 марта 2019, 19:49
    я думаю стоит. Иначе гигабайтами обрастете быстро. 
      • Андрей К
        25 марта 2019, 20:30

        Denis, да надо просто погуглить «алгоритмы упаковки данных».

        Кстати такую задачу решил Николай Морошкин со своим приводом qscalp. И выложил формат данных и упаковки на своем сайте, вдруг будет полезным

      • Андрей К
        25 марта 2019, 20:38
        Denis, банальный пример. Чтобы хранить цену, например фьюча РТС, нужно 4 байта. А можно например хранить не цену, а разницу между текущей ценой и предыдущей. Тогда понадобится уже не 4 байта, а максимум 2 и если натужиться, можно и даже байт.
  • _sg_
    25 марта 2019, 21:12

    Придумывать ничего не нужно:
    1. Для ленивых:
    Пишешь бары в БД сразу DtOHLCV

    База данных 5-секундных баров по RI, Si, SR c 2015 года по наст. время занимает всего лишь ~ 5 гигов. Очень даже приемлимо.
     
    2. Не для ленивых 
    Делаешь примерно так, описывать неохота
    2.1:
    var bytesBar = BinarySerialization.SerializeToByteArray(bars);
    var bsBarsZip = Compressor.Compress(bytesBar);
    Далее пишешь в БД образ по дням.

    Здесь делаешь BinarySerialization 
    сжимаешь,
    пишешь в БД по дням.

    2.2.
    var barsStr = bars.Select(b => b.ToStr()).ToList(); 
    var bytesBarStr = BinarySerialization.SerializeToByteArray(barsStr);
    var bsBarsStrZip = Compressor.Compress(bytesBarStr);
    Далее пишешь в БД образ по дням.

    Здесь в начале Бары сериализуешь в List<string>,
    потом делаешь BinarySerialization
    и далее сжимаешь.
    Этот вариант работает быстрее — проверено юнит-тестами

    В БД информация хранится по дням и тикерам.

    Желаю успехов.

    • Андрей К
      25 марта 2019, 21:19
      _sg_, зачетно, запомню как надо быстро сделать =) Это я про второй вариант.
      • _sg_
        25 марта 2019, 21:26
        Андрей К, там улучшение копеечное, но все же есть.
        Там string-ы быстрее сериализуются,  чем класс bar-ы.
        У меня так получилось.
      • _sg_
        25 марта 2019, 21:55
        Андрей К, 
        t1 = time для варианта 2.1
        t2 = time для варианта 2.2
        t3 = это при упаковке каждой строки, не описал 2.3

        BytesBar, BytesBarStr, BytesBarStrPacked — это размер образов в байтах для вариантов 2.1, 2.2, 2.3  для одного дня по RI,
        если мне память совсем еще не отшибло по-моему так.

        Получается самый компактный — это 2.2
          • _sg_
            25 марта 2019, 22:17
            Denis, 
             public class BarDto: IBarBase

            {
            public BarDto();

            public DateTime DT { get; set; }
            public double Open { get; set; }
            public double High { get; set; }
            public double Low { get; set; }
            public double Close { get; set; }
            public double Volume { get; set; }

            public override string ToString();

            }

      • _sg_
        25 марта 2019, 22:07

        Denis, нет я не знаю.
        Я использую технологии Microsoft: MS SQL , С# — сейчас
        А компрессор можно взять для С# в using System.IO.Compression;
        Мне уже поздно распыляться, я уже забываю что я вчера делал.

  • Rostislav Kudryashov
    25 марта 2019, 21:26
    Внешний HDD в 1 террабайт на USB-3-подключении стоил в прошлом году примерно 3 тыс.руб. Это лучшая оптимизация.
    Но непонятно, что поучительного в тиковой истории котировок за 4 года? Неужто кто-то научился выуживать из этих данных некие внутренние различия?
  • _sg_
    25 марта 2019, 22:47
    1. Получение Bars из Торгового Терминала и сохранение их построчно в файле, либо в БД побарно.
    2. В конце дня эти бары читаются из файла дневого либо из БД за один последний день (у меня из БД) и далее выполняются варианты 2.1 либо 2.2 — пишутся образы в БД.
    3. На полноту не проверяю
  • Cristopher Robin
    25 марта 2019, 22:48
    Выше написали много, но ничего толкового. Проблемы дискового пространства нету как таковой. Есть проблема скорости вычитывания этих данных. Данные абсолютно линейные, я бы субд не рассматривал в принципе.
      • Cristopher Robin
        25 марта 2019, 23:01
        Denis, файловую систему
          • Cristopher Robin
            25 марта 2019, 23:25
            Denis, это вам так кажется, что время доступа не критично.
      • tranquility
        26 марта 2019, 22:10
        Denis, формат qscalp очень быстро распаковывается… АПД: Если смотреть по времени работы утилиты qsh2txt, то небыстро получается. Но это все из-за записи большого объема данных на диск. Без этих операций в десятки раз быстрее получается.
          • tranquility
            27 марта 2019, 01:01
            Denis, хорошая идея) А если тот же qsh gzip-ом сжимать, то размер еще раза в 2 уменьшается. Дальше уже некуда, наверное. А для начала можете использовать только leb128 кодирование, если qsh внедрять под свой проект покажется слишком трудозатратным. Но вроде как все есть под c#, только научиться классами пользоваться.
  • Тарас Громницкий
    26 марта 2019, 09:10

    Не очень понятен вопрос.

    Сколько тикеров вы собираете ?

    За какой период ?

    В каком фрейме ?

    Как дальше будут использоваться эти данные ?

      • Тарас Громницкий
        27 марта 2019, 07:41

        Denis, как я понимаю для инициализации робота нужно не очень много данных.

        Так что этот хвостик можно держать не запакованным.

        Для анализа скорость выборки не имеет значения.

        Соответственно можете паковать в любом формате.

        Если оно занимает существенный объём диска.

        И если вам не нужна какая-то выборка по условиям.

        Если места хватает, то можно использовать обычную либо nosql базу и удобно хранить, выбирать, сортировать.

        Про форматы хранения написали выше.

  • day0markets.ru
    29 марта 2019, 15:09
    Тики нет смысла в базу ложить. Храните в бинарниках разбитых по дням или часам.
    Это лучше при тестах — можно не выгружать сразу все в память. и будет быстрее чем запрос в бд тиков за один день. все зависит от того, что вы тестируете и как. у меня не получалось получать быстрее тики из бд, чем из бинарников. если уж хочется бд, то посмотрите на influx

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн