Подтвердить что ты не робот

Схема базы данных для организации исторических данных запаса

Я создаю схему базы данных для хранения исторических данных запаса. В настоящее время у меня есть схема, как показано ниже.

Мои требования состоят в том, чтобы хранить "данные бара" (дата, открытие, высокий, низкий, закрытый объем) для нескольких символов запаса. Каждый символ может также иметь несколько таймфреймов (например, Google Weekly bars и Google Daily).

Моя текущая схема помещает большую часть данных в таблицу OHLCV. Я далек от эксперта по базам данных и мне интересно, если это слишком наивно. Конструктивный вход очень приветствуется.

CREATE TABLE Exchange (exchange TEXT UNIQUE NOT NULL);

CREATE TABLE Symbol (symbol TEXT UNIQUE NOT NULL, exchangeID INTEGER NOT NULL);

CREATE TABLE Timeframe (timeframe TEXT NOT NULL, symbolID INTEGER NOT NULL);

CREATE TABLE OHLCV (date TEXT NOT NULL CHECK (date LIKE '____-__-__ __:__:__'),
    open REAL NOT NULL,
    high REAL NOT NULL,
    low REAL NOT NULL,
    close REAL NOT NULL,
    volume INTEGER NOT NULL,
    timeframeID INTEGER NOT NULL);

Это означает, что мои запросы в настоящее время идут примерно так: найдите идентификатор timeframeID для заданного символа/таймфрейма, затем сделайте выбор в таблице OHLCV, где совпадает идентификатор таймфрейма.

4b9b3361

Ответ 1

Ну, с положительной стороны, у вас есть здравый смысл сначала просить ввода. Это ставит вас перед 90% людей, незнакомых с дизайном базы данных.

  • Четких отношений с внешними ключами нет. Я полагаю, что timeframeID относится к symbolID?
  • Непонятно, как вы сможете найти что-нибудь таким образом. Чтение вышеперечисленных внешних ключей должно значительно улучшить ваше понимание с минимальными усилиями.
  • Вы сохраняете данные таймфрейма как TEXT. Из производительности, а также с точки зрения удобства использования, что нет-нет.
  • В вашей нынешней схеме не может быть размещено разделение акций, которое в конечном итоге произойдет. Лучше добавить еще один слой косвенности между таблицей данных цены и символом
  • open, high, low, close цены лучше сохраняются как десятичные или валютные типы или, предпочтительно, как поле INTEGER с отдельным полем INTEGER, хранящим делитель, как наименьшая цена (центами, восьмерками доллара и т.д.) разрешена для каждого обмена.
  • Поскольку вы поддерживаете несколько обменов, вы должны поддерживать несколько валют.

Я прошу прощения, если все это не кажется слишком "конструктивным", тем более что я слишком сонный прямо сейчас, чтобы предложить более полезную альтернативу. Я надеюсь, что этого достаточно, чтобы поставить вас на ваш путь.

Ответ 2

Мы попытались найти правильную структуру базы данных для хранения большого количества данных в течение длительного времени. Решение ниже - результат более чем шестилетнего опыта. В настоящее время он работает безупречно для нашего количественного анализа.

Мы смогли хранить сотни гигабайт внутридневных и ежедневных данных, используя эту схему в SQL Server:

 Symbol -  char 6
 Date -  date
 Time -  time
 Open -  decimal 18, 4
 High -  decimal 18, 4
 Low -  decimal 18, 4
 Close -  decimal 18, 4
 Volume -  int

Все торговые инструменты хранятся в одной таблице. У нас также есть кластерный индекс для столбцов символов, даты и времени.

Для ежедневных данных у нас есть отдельная таблица и не используйте столбец "Время". Тип данных тома также является bigint вместо int.

Производительность? Мы можем получить данные из сервера в течение миллисекунд. Помните, что размер базы данных составляет почти 1 терабайт.

Мы купили все наши исторические рыночные данные с веб-сайта Kibot: http://www.kibot.com/

Ответ 3

Я не уверен, что добавлено значение Timeframe - это похоже на ненужное усложнение, но это может быть то, что я не могу понять;-) Может ли Timeframe иметь более одного OHLCV? Если нет, тогда я предлагаю объединить их.

Я хотел бы также отметить, что биржевые тикеры время от времени меняются по ряду причин. Это не частый случай, но это происходит. Если вы думаете о работе с вашими данными в виде временных рядов, вы должны знать об этой проблеме, чтобы вы могли справиться с ней, когда дело дошло, если не раньше. Если вы не отслеживаете акции (возможно, вы работаете в фьючерсном приложении, скажем), то этот совет может быть принят с соответствующим количеством соли.

Снова в основном для акций, расколы упоминаются в другом месте, и вы можете захотеть рассмотреть дивиденды - цена акций обычно будет уменьшаться на сумму дивидендов (или, точнее, ее текущую стоимость) на дату экс-дивиденда, которая может быть неверно истолкованы, если вы не знаете, что подтвержденный будущий денежный поток стал причиной. Проблемы с правами также могут быть интересными.

Если вы планируете просматривать серию данных для определенного символа, я бы предложил посмотреть, какую производительность вы собираетесь получить. По крайней мере, убедитесь, что у вас есть соответствующий индекс.