Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сжатие нескольких записей в одну, временной ряд  [new]
JcJet
Member

Откуда:
Сообщений: 11
Сжатие нескольких записей в одну
Целый день пытаюсь реализовать, пока неочень... Может быть, тут кто-нибудь подскажет как можно такое сделать.
Есть данные временного ряда (графика цен на акцию). Например, 1-минутные бары с со значениями (максимум и минимум цены, цена в начале бара и в конце, и объём торгов за этот период)
Нужно превратить их в 5-и минутные. То есть, для каждых 5 подобных баров сделать 1, с рассчётом всех значений за 5 минут. Старые бары удалять не нужно.

Кое-что уже есть, но косяк в том, что 5-и минутное окно смещается на 1 позицию, вместо того, чтобы перемещаться на 5. Не могу сообразить, что нужно изменить :(

Use Quotes

SELECT 
[DateTime], 
Ticker, 
Timeframe, 
(SELECT OpenPrice FROM Candles WHERE Ticker = 'SiM6' AND TimeFrame = '1Minute' AND [DateTime] BETWEEN C.[DateTime] AND DATEADD(SECOND, 5,  C.[DateTime])),
(SELECT MAX(HighPrice) FROM Candles WHERE Ticker = 'SiM6' AND TimeFrame = '1Minute' AND [DateTime] BETWEEN C.[DateTime] AND DATEADD(Minute, 5,  C.[DateTime])),
(SELECT MIN(LowPrice) FROM Candles WHERE Ticker = 'SiM6' AND TimeFrame = '1Minute' AND [DateTime] BETWEEN C.[DateTime] AND DATEADD(Minute, 5,  C.[DateTime])),
(SELECT ClosePrice FROM Candles WHERE Ticker = 'SiM6' AND TimeFrame = '1Minute' AND [DateTime] BETWEEN C.[DateTime] AND DATEADD(SECOND, 5,  C.[DateTime])),
(SELECT SUM(Volume) FROM Candles WHERE Ticker = 'SiM6' AND TimeFrame = '1Minute' AND [DateTime] BETWEEN C.[DateTime] AND DATEADD(Minute, 5,  C.[DateTime])) FROM Candles as C
WHERE Ticker = 'SiM6' AND TimeFrame = '1Minute'


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

К сообщению приложен файл. Размер - 84Kb
19 апр 16, 21:08    [19079751]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие нескольких записей в одну, временной ряд  [new]
Glory
Member

Откуда:
Сообщений: 104760
JcJet
То есть, для каждых 5 подобных баров сделать 1,

Т.е. округлить datetime с точностью до 5 минут что ли ?

JcJet
с рассчётом всех значений за 5 минут.

И как выглядят эти рассчеты ?
19 апр 16, 21:26    [19079822]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие нескольких записей в одну, временной ряд  [new]
JcJet
Member

Откуда:
Сообщений: 11
Glory,

В каждой записи(баре) есть 5 значений:
1) Цена акции за период(таймфрейм)
а) Минимум
б) Максимум
в) Первая
г) Последняя
2) Объём сделок за период

Операции я реализовал в SELECT (хотя правильность еще под большим вопросом)
То есть, если период баров - это 1 минута, то значения отображаются за 1 минуту.
Если нужны 5 минутные - то это максимум, минимум цены и суммарный объём за все 5 баров.
То есть, в результате получается в 5 раз меньше записей, дата и время которых отличается на 5 минут.

Текущий алгоритм перебирает все записи 1-минутных и выводит вместо них то же количество новых записей, учитывая те записи, которые учитывать уже не нужно(рис.)

К сообщению приложен файл. Размер - 89Kb
19 апр 16, 22:25    [19079992]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие нескольких записей в одну, временной ряд  [new]
iljy
Member

Откуда:
Сообщений: 8711
JcJet,

если записи строго раз в минуту, то ROW_NUMBER + GROUP BY rn/5
если возможны варианты, то соединяйте с таблицей 5минутных интервалов и потом группируйте
19 апр 16, 23:06    [19080121]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие нескольких записей в одну, временной ряд  [new]
JcJet
Member

Откуда:
Сообщений: 11
Интересный вариант, эта функция - как раз то, что нужно, буду пробовать.

Еще возник вопрос, почему в этом коде, в последней строке ругается на недопустимое имя столбца RowNumber?
Много вариантов попробовал, но так и не понял. Вроде какая-то банальность должна быть...

Use Quotes

SELECT 
[DateTime], 
Ticker, 
Timeframe, 
(SELECT OpenPrice FROM Candles WHERE Ticker = 'SiM6' AND TimeFrame = '1Minute' AND [DateTime] BETWEEN C.[DateTime] AND DATEADD(SECOND, 5,  C.[DateTime])) AS OpenPrice,
(SELECT MAX(HighPrice) FROM Candles WHERE Ticker = 'SiM6' AND TimeFrame = '1Minute' AND [DateTime] BETWEEN C.[DateTime] AND DATEADD(Minute, 5,  C.[DateTime])) AS HighPrice,
(SELECT MIN(LowPrice) FROM Candles WHERE Ticker = 'SiM6' AND TimeFrame = '1Minute' AND [DateTime] BETWEEN C.[DateTime] AND DATEADD(Minute, 5,  C.[DateTime])) AS LowPrice,
(SELECT ClosePrice FROM Candles WHERE Ticker = 'SiM6' AND TimeFrame = '1Minute' AND [DateTime] BETWEEN C.[DateTime] AND DATEADD(SECOND, 5,  C.[DateTime])) AS ClosePrice,
(SELECT SUM(Volume) FROM Candles WHERE Ticker = 'SiM6' AND TimeFrame = '1Minute' AND [DateTime] BETWEEN C.[DateTime] AND DATEADD(Minute, 5,  C.[DateTime])) AS Volume,
(ROW_NUMBER() OVER (ORDER BY [DateTime] DESC)) AS RowNumber
FROM Candles as C
WHERE Ticker = 'SiM6' AND TimeFrame = '1Minute'
GROUP BY [DateTime], Ticker, TimeFrame, OpenPrice, HighPrice, LowPrice, ClosePrice, Volume, RowNumber/5;


К сообщению приложен файл. Размер - 80Kb
20 апр 16, 08:06    [19080422]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие нескольких записей в одну, временной ряд  [new]
o-o
Guest
Потому что rownumber это псевдоним выходного столбца в селекте, в group by его еще не переименовали, только order by видит псевдонимы.
Ну или надо псевдонимы выдавать в apply
20 апр 16, 08:23    [19080439]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие нескольких записей в одну, временной ряд  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
select 
 a.dt, 
 c.Ticker, 
 c.Timeframe, 
 sum(...),
 min(...),
 max(...)
from
 Candles c cross applpy
 (select dateadd(minute, (datediff(mi, '1900', c.[DateTime]) / 5) * 5, '1900')) a(dt)
where
 Ticker = 'SiM6' AND TimeFrame = '1Minute'
group by
 a.dt, c.Ticker, c.Timeframe
20 апр 16, 10:09    [19080762]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие нескольких записей в одну, временной ряд  [new]
JcJet
Member

Откуда:
Сообщений: 11
invm,

Спасибо! Действительно, так стало работать верно :)

Буду разбираться с тем, как дальше :)
21 апр 16, 17:49    [19089961]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить