2013-04-27 2 views
0

Я пытаюсь вычислить скользящие средние кроссовер с переменными датами.SQL Calculating Moving Average Кроссовер переменных длин

Моя база данных структурирована:

id 
stock_id 
date 
closing_price 

И:

stock_id 
symbol 

Например, я хотел бы узнать, если средняя цена возвращается X дней никогда не получает больше, чем средняя цена возвращая Y дней в течение последних Z дней. Каждый из этих периодов времени является переменным. Это нужно запускать для каждого запаса в базе данных (около 3000 акций с ценами, возвращающимися на 100 лет).

Я немного застрял в этом, у меня в настоящее время есть беспорядок подзапросов SQL, которые не работают, потому что они не могут объяснить, что X, Y и Z могут быть любым значением (0- N). То есть за последние 5 дней я мог бы искать запас, где 40-дневное среднее значение> 5, или 5> 40. Или я мог бы просматривать последние 40 дней, чтобы найти запасы, где 10-дневная скользящая средняя > 30-дневная скользящая средняя.

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

ответ

0

Вы можете найти увидеть эти более ранние сообщения о Stackoverflow:

Эти сообщения имеют решения на ваш вопрос.

+0

Этот вопрос отличается от других вопросов, поскольку есть переменная короткие и длинные сроки, а также переменная срок. – user1797484

0

Я думаю, что самый прямой способ сделать скользящую среднюю в MySQL - это использовать коррелированный подзапрос. Вот пример:

select p.*, 
     (select avg(closing_price) 
     from prices p2 
     where p2.stock_id = p.stock_id and 
       p2.date between p.date - interval x day and pdate 
     ) as MvgAvg_X, 
     (select avg(closing_price) 
     from prices p2 
     where p2.stock_id = p.stock_id and 
       p2.date between p.date - interval y day and pdate 
     ) as MvgAvg_Y 
from prices p 

Вам необходимо заполнить значения для x и y.

По соображениям производительности вам понадобится индекс на prices(stock_id, date, closing_price).

Если у вас есть опция для другой базы данных, Oracle, Postgres и SQL Server 2012 предлагают гораздо более эффективные решения для этой проблемы.

В Postgres, вы можете написать это как:

select p.*, 
     avg(p.price) over (partition by stock_id rows x preceding) as AvgX, 
     avg(p.price) over (partition by stock_id rows y preceding) as AvgY 
from p 
+0

У меня есть опция Postgres ... это действительно намного быстрее? Также это похоже на часть проблемы, но не на полную проблему. Он не учитывает Z --- то есть это происходит за прошлые X дней. Кроме того, помните, что X и Y могут меняться. Это моя точка. – user1797484

+0

Пример: я хотел бы, чтобы этот запрос мог найти как 10-дневную скользящую среднюю, пересекающую 50-дневную скользящую среднюю за последние 5 дней, так и 50-дневный переход через 10-дневную скользящую среднюю за последние 5 дней. Каждое из этих чисел, X, Y и Z являются переменными. – user1797484

+0

Вы вычислили скользящие средние в подзапросе и затем поместите логику в окружающий запрос. –

Смежные вопросы