Алготрейдерам: Скажите, кто занимается сбором тиковых данных или 1-5сек баров, стоит ли заморачиваться по поводу оптимизации данных сохраняемых в базу данных? если кто делает поделитесь как :)
Придумывать ничего не нужно:
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;
Мне уже поздно распыляться, я уже забываю что я вчера делал.
1. Получение Bars из Торгового Терминала и сохранение их построчно в файле, либо в БД побарно.
2. В конце дня эти бары читаются из файла дневого либо из БД за один последний день (у меня из БД) и далее выполняются варианты 2.1 либо 2.2 — пишутся образы в БД.
3. На полноту не проверяю
Тики нет смысла в базу ложить. Храните в бинарниках разбитых по дням или часам.
Это лучше при тестах — можно не выгружать сразу все в память. и будет быстрее чем запрос в бд тиков за один день. все зависит от того, что вы тестируете и как. у меня не получалось получать быстрее тики из бд, чем из бинарников. если уж хочется бд, то посмотрите на influx
Alex Hurko, да не то что бы прям очень хочется бд :) просто я ее уже давно прикрутил к своему софту. Пока что остановился на концепте, который вот реализовываю, таком: так как я в течении дня всяк складирую тики в базу, то это менять не буду, просто в конце дня буду паковать их в бинарник, а данный с базы удалять по истечении дня или недели… хранить ли сам бинарник в базе, я так еще и не решил :)
Denis, банальный пример. Чтобы хранить цену, например фьюча РТС, нужно 4 байта. А можно например хранить не цену, а разницу между текущей ценой и предыдущей. Тогда понадобится уже не 4 байта, а максимум 2 и если натужиться, можно и даже байт.
Внешний HDD в 1 террабайт на USB-3-подключении стоил в прошлом году примерно 3 тыс.руб. Это лучшая оптимизация.
Но непонятно, что поучительного в тиковой истории котировок за 4 года? Неужто кто-то научился выуживать из этих данных некие внутренние различия?
_sg_, А так вы весь класс, без всяких заморочек, в массив перегоняете и потом компрессию делаете?
Что то мне кажется я слишком много оптимизацией занимаюсь :)
Т.е. получается вы сохраняете сперва где то на диске весь день данных, потом потом пакуете и базу. А позвольте поинтерисоваться, вы перед тем как данные загонять в базу, проверяете их целостность? все ли бары были получены, и если были разрывы то заполняети ли все из истории?
Сорри за столько вопросов… я просто как погрузился в сохранение данных, всплыло масса деталей.
Выше написали много, но ничего толкового. Проблемы дискового пространства нету как таковой. Есть проблема скорости вычитывания этих данных. Данные абсолютно линейные, я бы субд не рассматривал в принципе.
Cristopher Robin, хмм… ну возможно доступ к диску будет и быстрее чем считывание данных из бд. Но вопрос удобнее ли? Мне не нужно считывать данные из базы данных во время торгов, да и в целом время доступа не критично.
Denis, формат qscalp очень быстро распаковывается… АПД: Если смотреть по времени работы утилиты qsh2txt, то небыстро получается. Но это все из-за записи большого объема данных на диск. Без этих операций в десятки раз быстрее получается.
tranquility, да, я уже посмотрел его спецификацию… в целом я думаю остановлюсь на бинарном формате… может даже откажусь от базы данных… но тут еще надо подумать
Denis, хорошая идея) А если тот же qsh gzip-ом сжимать, то размер еще раза в 2 уменьшается. Дальше уже некуда, наверное. А для начала можете использовать только leb128 кодирование, если qsh внедрять под свой проект покажется слишком трудозатратным. Но вроде как все есть под c#, только научиться классами пользоваться.
Тарас Громницкий, смартлаб не позволяет большие вопросы задавать. :)
1. на данный момент всего 10
2. за весь период пока мой домашний сервер подключен к брокеру. Я не выкачиваю историю… собираю реалтайм, хотят тут разницы нет.
3. что значит фрейм? тики+бид/аск и еще 5сек бары
4. в осоновном для анализа и для стадии инициалицации алгоритма, т.е. первого его старта. все банально.
Придумывать ничего не нужно:
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;
Мне уже поздно распыляться, я уже забываю что я вчера делал.
2. В конце дня эти бары читаются из файла дневого либо из БД за один последний день (у меня из БД) и далее выполняются варианты 2.1 либо 2.2 — пишутся образы в БД.
3. На полноту не проверяю
Это лучше при тестах — можно не выгружать сразу все в память. и будет быстрее чем запрос в бд тиков за один день. все зависит от того, что вы тестируете и как. у меня не получалось получать быстрее тики из бд, чем из бинарников. если уж хочется бд, то посмотрите на influx
Дилема как бы такая сложность упаковки распоковки против стоимости гигабайтов :).
В целом к тикам я сейчас еще и бид/аск сохраняю… вдруг когда понадобится.
Denis, да надо просто погуглить «алгоритмы упаковки данных».
Кстати такую задачу решил Николай Морошкин со своим приводом qscalp. И выложил формат данных и упаковки на своем сайте, вдруг будет полезным
Но непонятно, что поучительного в тиковой истории котировок за 4 года? Неужто кто-то научился выуживать из этих данных некие внутренние различия?
про память, я выше писал, это как раз таки и есть дилема, террабайты нынче дешев особенно если хдд… но и ссд не так дорог.
Что то мне кажется я слишком много оптимизацией занимаюсь :)
Помотрите его внимательно, там присутствует бинарная сериализация.
В варианте 2.2 в начале List<Bar> — перегоняется в List<string>,
а затем делается сериализация List<string>
Т.е. получается вы сохраняете сперва где то на диске весь день данных, потом потом пакуете и базу. А позвольте поинтерисоваться, вы перед тем как данные загонять в базу, проверяете их целостность? все ли бары были получены, и если были разрывы то заполняети ли все из истории?
Сорри за столько вопросов… я просто как погрузился в сохранение данных, всплыло масса деталей.
Не очень понятен вопрос.
Сколько тикеров вы собираете ?
За какой период ?
В каком фрейме ?
Как дальше будут использоваться эти данные ?
1. на данный момент всего 10
2. за весь период пока мой домашний сервер подключен к брокеру. Я не выкачиваю историю… собираю реалтайм, хотят тут разницы нет.
3. что значит фрейм? тики+бид/аск и еще 5сек бары
4. в осоновном для анализа и для стадии инициалицации алгоритма, т.е. первого его старта. все банально.
Denis, как я понимаю для инициализации робота нужно не очень много данных.
Так что этот хвостик можно держать не запакованным.
Для анализа скорость выборки не имеет значения.
Соответственно можете паковать в любом формате.
Если оно занимает существенный объём диска.
И если вам не нужна какая-то выборка по условиям.
Если места хватает, то можно использовать обычную либо nosql базу и удобно хранить, выбирать, сортировать.
Про форматы хранения написали выше.
Только зарегистрированные и авторизованные пользователи могут оставлять ответы.
Залогиниться
Зарегистрироваться