184 похожих чатов

Доброго утра подскажите пожалуйста, лыжи не едут или я тупой что не

так с exponentialMovingAverage?
с over или без, она выдает значение очень далекое от среднего, и чем больше выставляю период - тем меньше это значение становится.
к тому же, вне зависимости от периода, сохраняется прямая пропорция между значениями. если подобрать множители, то значения с разных периодов сходятся 1 в 1.

чяднт?

на всякий случай пошел в эксель, там по известной формуле ema=price*alpha + prev_ema*(1-alpha) при alpha=2/(1+N) - все выходит верно, я получаю средние значения около входных...

или если есть у кого рецепт расчета EMA в кликхаусе, поделитесь плиз

12 ответов

20 просмотров
Ян- Автор вопроса

входные данные: выборка time_open, close_price из серии минутрых свечей с биржи. в качестве значения time в ema скармливаю toUnixTimestamp(time_open)

Это читали? https://altinity.com/blog/2020/3/9/real-time-moving-average-with-clickhouse-live-views

Ян- Автор вопроса
Алексей Фирсов
Это читали? https://altinity.com/blog/2020/3/9/re...

это не то. это простое скользящее среднее, а нужно именно экспоненциальное. там не просто сумма, а накапливающаяся сумма произведения нового значения на пропорциональный сглаживающий фактор и произведения предыдущего значения на обратно пропорциональный сглаживающий фактор. если совсем просто, то ema=p*a + ema*(1-a) сама по себе функция рекурсивная. и в кх есть exponentialMovingAverage, и даже дока по нему есть... "какая-то", но считает он хрень, хотя в описании доки сказано, что он считает именно то, что мне нужно, буквально ссылка на википедию в общем понятно. сделаю отдельный скрипт, которым буду перегенерять метрику и потом чекать в графане, неудобно ну и хер с ним...

Ян- Автор вопроса
Алексей Фирсов
Это читали? https://altinity.com/blog/2020/3/9/re...

к тому же, то, что они там делают, делается одной строчкой с оконной функцией...

ну возможно баг, покажите пример на https://github.com/ClickHouse/ClickHouse/issues без конкретики тяжело понять о чем вы. например over без order by считает за все окно, select x, sum(x) over () from (select number x from numbers(10)); ┌─x─┬─sum(x) OVER ()─┐ │ 0 │ 45 │ │ 1 │ 45 │ │ 2 │ 45 │ │ 3 │ 45 │ │ 4 │ 45 │ │ 5 │ 45 │ │ 6 │ 45 │ │ 7 │ 45 │ │ 8 │ 45 │ │ 9 │ 45 │ └───┴────────────────┘ VS select x, sum(x) over (order by x) from (select number x from numbers(10)); ┌─x─┬─sum(x) OVER (ORDER BY x ASC)─┐ │ 0 │ 0 │ │ 1 │ 1 │ │ 2 │ 3 │ │ 3 │ 6 │ │ 4 │ 10 │ │ 5 │ 15 │ │ 6 │ 21 │ │ 7 │ 28 │ │ 8 │ 36 │ │ 9 │ 45 │ └───┴──────────────────────────────┘

Ян- Автор вопроса
Denny [Altinity]
ну возможно баг, покажите пример на https://github...

еще раз, sum, avg и прочие - простые аггрегирующие функции, они берут всю кучу и считают. exponentialMovingAverage должен высчитываться рекурсивно из последнего значения. https://clickhouse.com/docs/en/sql-reference/aggregate-functions/reference/exponentialmovingaverage/

Ян
еще раз, sum, avg и прочие - простые аггрегирующие...

я не про это. OVER без ORDER BY выдает КОНЕЧНЫЙ результат в каждой строке для всего окна , он всегда ОДИН/EДИН.

Ян- Автор вопроса
Ян
еще раз, sum, avg и прочие - простые аггрегирующие...

вот взять сейчас курс битка. 33к-35к. среднее щначение должно быть где то в этом диапазоне, вне зависимости от периода. эта же функция с периодами 9, 12, 26 может выдавать значения около 3000, 2000, 1000 соответственно. и это ни разу не среднее, даже если пробовать их перемнобать на период. и опять же, пропорция у всех этих значений вне зависимости от периода, сохраняется абсолютно прчмая, без какого либо сдвига, в котором заключается суть этого среднего значения

Ян- Автор вопроса
Denny [Altinity]
я не про это. OVER без ORDER BY выдает КОНЕЧНЫЙ ре...

? т.е. rows between X preceding and current row выдаст не тот набор, который выдаст вложенный селект с лимитом X?

Ян
? т.е. rows between X preceding and current row вы...

в КХ не работают "выдаст вложенный селект с лимитом X"

Ян
вот взять сейчас курс битка. 33к-35к. среднее щнач...

размер окна exponentialMovingAverage задается в параметре exponentialMovingAverage(1) SELECT 1 AS value, number FROM numbers_mt(10); ┌─value─┬─number─┐ │ 1 │ 0 │ │ 1 │ 1 │ │ 1 │ 2 │ │ 1 │ 3 │ │ 1 │ 4 │ │ 1 │ 5 │ │ 1 │ 6 │ │ 1 │ 7 │ │ 1 │ 8 │ │ 1 │ 9 │ └───────┴────────┘ select value, time, exponentialMovingAverage(1)(value, time) over () from ( SELECT 1 AS value, number time FROM numbers_mt(10) ) ; ┌─value─┬─time─┬─exponentialMovingAverage(1)(value, time) OVER ()─┐ │ 1 │ 0 │ 0.9990234375 │ │ 1 │ 1 │ 0.9990234375 │ │ 1 │ 2 │ 0.9990234375 │ │ 1 │ 3 │ 0.9990234375 │ │ 1 │ 4 │ 0.9990234375 │ │ 1 │ 5 │ 0.9990234375 │ │ 1 │ 6 │ 0.9990234375 │ │ 1 │ 7 │ 0.9990234375 │ │ 1 │ 8 │ 0.9990234375 │ │ 1 │ 9 │ 0.9990234375 │ └───────┴──────┴──────────────────────────────────────────────────┘ select value, time, exponentialMovingAverage(1)(value, time) over (order by time) from ( SELECT 1 AS value, number time FROM numbers_mt(10) ) ; ; ┌─value─┬─time─┬─exponentialMovingAverage(1)(value, time) OVER (ORDER BY time ASC)─┐ │ 1 │ 0 │ 0.5 │ │ 1 │ 1 │ 0.75 │ │ 1 │ 2 │ 0.875 │ │ 1 │ 3 │ 0.9375 │ │ 1 │ 4 │ 0.96875 │ │ 1 │ 5 │ 0.984375 │ │ 1 │ 6 │ 0.9921875 │ │ 1 │ 7 │ 0.99609375 │ │ 1 │ 8 │ 0.998046875 │ │ 1 │ 9 │ 0.9990234375 │ └───────┴──────┴───────────────────────────────────────────────────────────────────┘

Ян
это не то. это простое скользящее среднее, а нужно...

@krokwen добрый вечер. удалось ли вам решить вопрос по ЕМА?

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта