так с exponentialMovingAverage?
с over или без, она выдает значение очень далекое от среднего, и чем больше выставляю период - тем меньше это значение становится.
к тому же, вне зависимости от периода, сохраняется прямая пропорция между значениями. если подобрать множители, то значения с разных периодов сходятся 1 в 1.
чяднт?
на всякий случай пошел в эксель, там по известной формуле ema=price*alpha + prev_ema*(1-alpha) при alpha=2/(1+N) - все выходит верно, я получаю средние значения около входных...
или если есть у кого рецепт расчета EMA в кликхаусе, поделитесь плиз
входные данные: выборка time_open, close_price из серии минутрых свечей с биржи. в качестве значения time в ema скармливаю toUnixTimestamp(time_open)
Это читали? https://altinity.com/blog/2020/3/9/real-time-moving-average-with-clickhouse-live-views
это не то. это простое скользящее среднее, а нужно именно экспоненциальное. там не просто сумма, а накапливающаяся сумма произведения нового значения на пропорциональный сглаживающий фактор и произведения предыдущего значения на обратно пропорциональный сглаживающий фактор. если совсем просто, то ema=p*a + ema*(1-a) сама по себе функция рекурсивная. и в кх есть exponentialMovingAverage, и даже дока по нему есть... "какая-то", но считает он хрень, хотя в описании доки сказано, что он считает именно то, что мне нужно, буквально ссылка на википедию в общем понятно. сделаю отдельный скрипт, которым буду перегенерять метрику и потом чекать в графане, неудобно ну и хер с ним...
к тому же, то, что они там делают, делается одной строчкой с оконной функцией...
ну возможно баг, покажите пример на 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 │ └───┴──────────────────────────────┘
еще раз, sum, avg и прочие - простые аггрегирующие функции, они берут всю кучу и считают. exponentialMovingAverage должен высчитываться рекурсивно из последнего значения. https://clickhouse.com/docs/en/sql-reference/aggregate-functions/reference/exponentialmovingaverage/
я не про это. OVER без ORDER BY выдает КОНЕЧНЫЙ результат в каждой строке для всего окна , он всегда ОДИН/EДИН.
вот взять сейчас курс битка. 33к-35к. среднее щначение должно быть где то в этом диапазоне, вне зависимости от периода. эта же функция с периодами 9, 12, 26 может выдавать значения около 3000, 2000, 1000 соответственно. и это ни разу не среднее, даже если пробовать их перемнобать на период. и опять же, пропорция у всех этих значений вне зависимости от периода, сохраняется абсолютно прчмая, без какого либо сдвига, в котором заключается суть этого среднего значения
? т.е. rows between X preceding and current row выдаст не тот набор, который выдаст вложенный селект с лимитом X?
в КХ не работают "выдаст вложенный селект с лимитом X"
размер окна 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 добрый вечер. удалось ли вам решить вопрос по ЕМА?
Обсуждают сегодня