Алготрейдерам: Скажите, кто занимается сбором тиковых данных или 1-5сек баров, стоит ли заморачиваться по поводу оптимизации данных сохраняемых в базу данных? если кто делает поделитесь как :)
Алготрейдерам: Скажите, кто занимается сбором тиковых данных или 1-5сек баров, стоит ли заморачиваться по поводу оптимизации данных сохраняемых в базу данных? если кто делает поделитесь как :)
Denis, банальный пример. Чтобы хранить цену, например фьюча РТС, нужно 4 байта. А можно например хранить не цену, а разницу между текущей ценой и предыдущей. Тогда понадобится уже не 4 байта, а максимум 2 и если натужиться, можно и даже байт.
Придумывать ничего не нужно:
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
и далее сжимаешь.
Этот вариант работает быстрее — проверено юнит-тестами
Андрей К,
t1 = time для варианта 2.1
t2 = time для варианта 2.2
t3 = это при упаковке каждой строки, не описал 2.3
BytesBar, BytesBarStr, BytesBarStrPacked — это размер образов в байтах для вариантов 2.1, 2.2, 2.3 для одного дня по RI,
если мне память совсем еще не отшибло по-моему так.
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; }
Denis, нет я не знаю.
Я использую технологии Microsoft: MS SQL , С# — сейчас
А компрессор можно взять для С# в using System.IO.Compression;
Мне уже поздно распыляться, я уже забываю что я вчера делал.
Внешний HDD в 1 террабайт на USB-3-подключении стоил в прошлом году примерно 3 тыс.руб. Это лучшая оптимизация.
Но непонятно, что поучительного в тиковой истории котировок за 4 года? Неужто кто-то научился выуживать из этих данных некие внутренние различия?
1. Получение Bars из Торгового Терминала и сохранение их построчно в файле, либо в БД побарно.
2. В конце дня эти бары читаются из файла дневого либо из БД за один последний день (у меня из БД) и далее выполняются варианты 2.1 либо 2.2 — пишутся образы в БД.
3. На полноту не проверяю
Выше написали много, но ничего толкового. Проблемы дискового пространства нету как таковой. Есть проблема скорости вычитывания этих данных. Данные абсолютно линейные, я бы субд не рассматривал в принципе.
Cristopher Robin, хмм… ну возможно доступ к диску будет и быстрее чем считывание данных из бд. Но вопрос удобнее ли? Мне не нужно считывать данные из базы данных во время торгов, да и в целом время доступа не критично.
Denis, формат qscalp очень быстро распаковывается… АПД: Если смотреть по времени работы утилиты qsh2txt, то небыстро получается. Но это все из-за записи большого объема данных на диск. Без этих операций в десятки раз быстрее получается.
tranquility, да, я уже посмотрел его спецификацию… в целом я думаю остановлюсь на бинарном формате… может даже откажусь от базы данных… но тут еще надо подумать
Denis, хорошая идея) А если тот же qsh gzip-ом сжимать, то размер еще раза в 2 уменьшается. Дальше уже некуда, наверное. А для начала можете использовать только leb128 кодирование, если qsh внедрять под свой проект покажется слишком трудозатратным. Но вроде как все есть под c#, только научиться классами пользоваться.
Тарас Громницкий, смартлаб не позволяет большие вопросы задавать. :)
1. на данный момент всего 10
2. за весь период пока мой домашний сервер подключен к брокеру. Я не выкачиваю историю… собираю реалтайм, хотят тут разницы нет.
3. что значит фрейм? тики+бид/аск и еще 5сек бары
4. в осоновном для анализа и для стадии инициалицации алгоритма, т.е. первого его старта. все банально.
Тики нет смысла в базу ложить. Храните в бинарниках разбитых по дням или часам.
Это лучше при тестах — можно не выгружать сразу все в память. и будет быстрее чем запрос в бд тиков за один день. все зависит от того, что вы тестируете и как. у меня не получалось получать быстрее тики из бд, чем из бинарников. если уж хочется бд, то посмотрите на influx
Alex Hurko, да не то что бы прям очень хочется бд :) просто я ее уже давно прикрутил к своему софту. Пока что остановился на концепте, который вот реализовываю, таком: так как я в течении дня всяк складирую тики в базу, то это менять не буду, просто в конце дня буду паковать их в бинарник, а данный с базы удалять по истечении дня или недели… хранить ли сам бинарник в базе, я так еще и не решил :)
Дмитрий А., что вы так нервничаете в самом деле? хочется на войну? серьезно? Нет преграды для героя. Сейчас там зарплаты неплохие и кредит можно взять и не отдавать. Или вы только другим советуете?...
Максим Лебедев, Отчасти согласен с Вами, отчасти нет. Не согласен касательно того, что 21 ставка в цене, по мне так 21 ставка в цене только на близком и среднем конце, дальний конец даже 21 ставку ...
botlib, уже понятно что! Продолжение СВО с непонятным финалом, который хз ещё когда будет и ушатанную в хлам экономику с оторванной от реальности денежной массой
Кот Лео, по сути если купил бакс и другую зарубежную хню — это значит ты проспонсировал в том числе и говнато, убивающее наших земляков. Тут даже к бабке не ходи…
Тут все ломали голову по слухам про вклады. По этому поводу мое мнение не изменилось, а только окрепло. Не надо ничего ни у кого «замораживать» и отбирать. Если на текущий момент у вас средняя ставка ...
Народная примета Если индекс растет на вечерке, особенно в первый час вечерки, то дальше вниз.
Рост после повышенной инфляция, напоминает мне шпильку вверх про фьючерсу на индекс Мосбиржи до 2830...
Дилема как бы такая сложность упаковки распоковки против стоимости гигабайтов :).
В целом к тикам я сейчас еще и бид/аск сохраняю… вдруг когда понадобится.
Denis, да надо просто погуглить «алгоритмы упаковки данных».
Кстати такую задачу решил Николай Морошкин со своим приводом qscalp. И выложил формат данных и упаковки на своем сайте, вдруг будет полезным
Придумывать ничего не нужно:
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
и далее сжимаешь.
Этот вариант работает быстрее — проверено юнит-тестами
В БД информация хранится по дням и тикерам.
Желаю успехов.
Там string-ы быстрее сериализуются, чем класс bar-ы.
У меня так получилось.
t1 = time для варианта 2.1
t2 = time для варианта 2.2
t3 = это при упаковке каждой строки, не описал 2.3
BytesBar, BytesBarStr, BytesBarStrPacked — это размер образов в байтах для вариантов 2.1, 2.2, 2.3 для одного дня по RI,
если мне память совсем еще не отшибло по-моему так.
Получается самый компактный — это 2.2
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();
}
Denis, нет я не знаю.
Я использую технологии Microsoft: MS SQL , С# — сейчас
А компрессор можно взять для С# в using System.IO.Compression;
Мне уже поздно распыляться, я уже забываю что я вчера делал.
Но непонятно, что поучительного в тиковой истории котировок за 4 года? Неужто кто-то научился выуживать из этих данных некие внутренние различия?
про память, я выше писал, это как раз таки и есть дилема, террабайты нынче дешев особенно если хдд… но и ссд не так дорог.
2. В конце дня эти бары читаются из файла дневого либо из БД за один последний день (у меня из БД) и далее выполняются варианты 2.1 либо 2.2 — пишутся образы в БД.
3. На полноту не проверяю
Не очень понятен вопрос.
Сколько тикеров вы собираете ?
За какой период ?
В каком фрейме ?
Как дальше будут использоваться эти данные ?
1. на данный момент всего 10
2. за весь период пока мой домашний сервер подключен к брокеру. Я не выкачиваю историю… собираю реалтайм, хотят тут разницы нет.
3. что значит фрейм? тики+бид/аск и еще 5сек бары
4. в осоновном для анализа и для стадии инициалицации алгоритма, т.е. первого его старта. все банально.
Denis, как я понимаю для инициализации робота нужно не очень много данных.
Так что этот хвостик можно держать не запакованным.
Для анализа скорость выборки не имеет значения.
Соответственно можете паковать в любом формате.
Если оно занимает существенный объём диска.
И если вам не нужна какая-то выборка по условиям.
Если места хватает, то можно использовать обычную либо nosql базу и удобно хранить, выбирать, сортировать.
Про форматы хранения написали выше.
Это лучше при тестах — можно не выгружать сразу все в память. и будет быстрее чем запрос в бд тиков за один день. все зависит от того, что вы тестируете и как. у меня не получалось получать быстрее тики из бд, чем из бинарников. если уж хочется бд, то посмотрите на influx