Алготрейдерам: Скажите, кто занимается сбором тиковых данных или 1-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
и далее сжимаешь.
Этот вариант работает быстрее — проверено юнит-тестами

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

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

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

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

Получается самый компактный — это 2.2
avatar
_sg_, я так понимаю около 30% выигрышь… интересно
avatar
_sg_, скажите а в вашем примере, бар какие типы данных имеет? 
avatar
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();

}

avatar
_sg_, Спасибо, хмм… вот писать в базу по дням не думал, вполне может решить задачу с уменьшением места.
avatar
_sg_, может быть вы еще знаете, возможно в постгресе реальзовать внутренние функции которые бы на лету паковали?
avatar

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

avatar
1. Получение Bars из Торгового Терминала и сохранение их построчно в файле, либо в БД побарно.
2. В конце дня эти бары читаются из файла дневого либо из БД за один последний день (у меня из БД) и далее выполняются варианты 2.1 либо 2.2 — пишутся образы в БД.
3. На полноту не проверяю
avatar
_sg_, Спасибо
avatar
Тики нет смысла в базу ложить. Храните в бинарниках разбитых по дням или часам.
Это лучше при тестах — можно не выгружать сразу все в память. и будет быстрее чем запрос в бд тиков за один день. все зависит от того, что вы тестируете и как. у меня не получалось получать быстрее тики из бд, чем из бинарников. если уж хочется бд, то посмотрите на influx
avatar
Alex Hurko, да не то что бы прям очень хочется бд :) просто я ее уже давно прикрутил к своему софту. Пока что остановился на концепте, который вот реализовываю, таком: так как я в течении дня всяк складирую тики в базу, то это менять не буду, просто в конце дня буду паковать их в бинарник, а данный с базы удалять по истечении дня или недели… хранить ли сам бинарник в базе, я так еще и не решил :)
avatar
я думаю стоит. Иначе гигабайтами обрастете быстро. 
avatar
Андрей К, А как лучше это делать не подскажите?
Дилема как бы такая сложность упаковки распоковки против стоимости гигабайтов :). 

В целом к тикам я сейчас еще и бид/аск сохраняю… вдруг когда понадобится.
avatar

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

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

avatar
Андрей К, надо будет посмотреть, спасибо.
avatar
Denis, банальный пример. Чтобы хранить цену, например фьюча РТС, нужно 4 байта. А можно например хранить не цену, а разницу между текущей ценой и предыдущей. Тогда понадобится уже не 4 байта, а максимум 2 и если натужиться, можно и даже байт.
avatar
Внешний HDD в 1 террабайт на USB-3-подключении стоил в прошлом году примерно 3 тыс.руб. Это лучшая оптимизация.
Но непонятно, что поучительного в тиковой истории котировок за 4 года? Неужто кто-то научился выуживать из этих данных некие внутренние различия?
avatar
Rostislav Kudryashov, да просто из тиковых лечге создавать другие бары, но и из 5 секундных баров почти тоже самое получается.

про память, я выше писал, это как раз таки и есть дилема, террабайты нынче дешев особенно если хдд… но и ссд не так дорог.
avatar
Eugene Logunov, так если все в файлы писать, как потом по базе данных поиск делать?
avatar
_sg_, А так вы весь класс, без всяких заморочек, в массив перегоняете и потом компрессию делаете? 
Что то мне кажется я слишком много оптимизацией занимаюсь :)
avatar
Denis, Вы говорите про вариант 2.1.
Помотрите его внимательно, там присутствует бинарная сериализация.

В варианте 2.2  в начале List<Bar> — перегоняется в List<string>,
а затем делается сериализация List<string>
avatar
_sg_, ах да, я что то ступил. 

Т.е. получается вы сохраняете сперва где то на диске весь день данных, потом потом пакуете и базу. А позвольте поинтерисоваться, вы перед тем как данные загонять в базу, проверяете их целостность? все ли бары были получены, и если были разрывы то заполняети ли все из истории? 

Сорри за столько вопросов… я просто как погрузился в сохранение данных, всплыло масса деталей.
avatar
Выше написали много, но ничего толкового. Проблемы дискового пространства нету как таковой. Есть проблема скорости вычитывания этих данных. Данные абсолютно линейные, я бы субд не рассматривал в принципе.
avatar
Cristopher Robin, что вы предлагаете использовать? 
avatar
Denis, файловую систему
avatar
Cristopher Robin, хмм… ну возможно доступ к диску будет и быстрее чем считывание данных из бд. Но вопрос удобнее ли? Мне не нужно считывать данные из базы данных во время торгов, да и в целом время доступа не критично. 
avatar
Denis, это вам так кажется, что время доступа не критично.
avatar
Denis, формат qscalp очень быстро распаковывается… АПД: Если смотреть по времени работы утилиты qsh2txt, то небыстро получается. Но это все из-за записи большого объема данных на диск. Без этих операций в десятки раз быстрее получается.
avatar
tranquility, да, я уже посмотрел его спецификацию… в целом я думаю остановлюсь на бинарном формате… может даже откажусь от базы данных… но тут еще надо подумать
avatar
Denis, хорошая идея) А если тот же qsh gzip-ом сжимать, то размер еще раза в 2 уменьшается. Дальше уже некуда, наверное. А для начала можете использовать только leb128 кодирование, если qsh внедрять под свой проект покажется слишком трудозатратным. Но вроде как все есть под c#, только научиться классами пользоваться.
avatar

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

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

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

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

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

Тарас Громницкий, смартлаб не позволяет большие вопросы задавать. :)
1. на данный момент всего 10
2. за весь период пока мой домашний сервер подключен к брокеру. Я не выкачиваю историю… собираю реалтайм, хотят тут разницы нет.
3. что значит фрейм? тики+бид/аск и еще 5сек бары
4. в осоновном для анализа и для стадии инициалицации алгоритма, т.е. первого его старта. все банально.

avatar

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

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

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

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

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

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

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

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


Только зарегистрированные и авторизованные пользователи могут оставлять ответы.

Залогиниться

Зарегистрироваться

теги блога CloseToAlgoTrading

....все тэги



UPDONW
Новый дизайн