#google-bigquery
#google-bigquery
Вопрос:
Я пытаюсь вычислить экспоненциальную скользящую среднюю (EMA) цены акции. Я использую формулу для вычисления EMA с этого сайта:http://www.iexplain.org/ema-how-to-calculate /
Я полностью застрял в вычислении правильной EMA. Запрос выполняется и возвращает результаты, но не возвращает точное значение EMA. Помощь очень ценится. Вы можете увидеть попытку рассчитать EMA с использованием формулы EMA, начиная со строки 4.
SELECT current_day.date as current_date, current_day.avg_price as current_date_price,
prev_day.prev_avg_price as previous_date_price, prev_2_day.prev_avg_price,
( ( current_day.avg_price * (2 / (22 1) ) ) ( ( ( prev_day.prev_avg_price * (2 / (22
1) ) )
( prev_2_day.prev_avg_price * (2 / (22 1) ) ) ) * (1 -( 2 / (22 1) ) ) ) ) as EMA
FROM
(select DATE(time) as date, ROUND(AVG(price),2) as avg_price FROM ds_5.tb_4978 group by
date) as
current_day
JOIN
(select DATE(USEC_TO_TIMESTAMP(time- 86400000000)) as prev_date, ROUND(AVG(price),2) as
prev_avg_price from ds_5.tb_4978 GROUP BY prev_date) as prev_day
ON current_day.date=prev_day.prev_date
JOIN
(select DATE(USEC_TO_TIMESTAMP(time- (86400000000*2))) as prev_2_date, ROUND(AVG(price),2)
as
prev_avg_price from ds_5.tb_4978 GROUP BY prev_2_date) as prev_2_day
ON current_day.date=prev_2_day.prev_2_date
GROUP BY current_date, current_date_price, previous_date_price,
prev_2_day.prev_avg_price, EMA
Это json-ответ на приведенный выше запрос: https://json.datadives.com/01843e08d5127e9d26d03fe0f842e735.json
Комментарии:
1. можете ли вы поделиться набором данных, чтобы получить рабочий запрос для вас?
2. Фелипе, можешь отправить мне в личку свой email, чтобы я мог добавить тебя в образец набора данных для этой конкретной таблицы?
3. Привет @FelipeHoffa и DataDives У меня такая же проблема, вам удалось вычислить EMA?
Ответ №1:
Я не думаю, что вы берете avg_price за предыдущий день. Вам нужно взять EMA за предыдущий день.
Я бы предпочел рассчитать EMA заранее; если это невозможно, возможно, загляните в MapReduce.
Ответ №2:
Это не полный ответ, но вместо того, чтобы выполнять самосоединение для получения текущей даты и предыдущей даты, вы можете использовать функцию LEAD () для получения времени и цены предыдущего дня, а не выполнять многократные объединения. Это может привести к более естественному коду и более быстрым запросам.
Например:
SELECT <calculate avg here> FROM (
SELECT DATE(time) as date, ROUND(AVG(price),2) as avg_price,
LEAD(time, 1) OVER (ORDER BY time DESC) as prev_day_time,
LEAD(price, 1) OVER (ORDER BY time DESC) as prev_price,
LEAD(time, 2) OVER (ORDER BY time DESC) as prev_2_day_time,
LEAD(price, 2) OVER (ORDER BY time DESC) as prev_2_price,
FROM [...])
Тем не менее, это работает, только если у вас ограниченное скользящее среднее (т. Е. вы собираетесь отслеживать скользящее среднее только за последние N дней. Если вы пытаетесь связать скользящую среднюю в цепочку бесконечно, SQL не будет хорошим решением.