SQL计算可变长度的移动平均线交叉

时间:2013-04-27 14:51:18

标签: mysql sql

我正在尝试计算可变日期的移动平均线交叉。

我的数据库是结构化的:

id
stock_id
date
closing_price

stock_id
symbol

例如,我想知道X天的平均价格是否会超过过去Z天内Y天的平均价格。每个时间段都是可变的。这需要针对数据库中的每一只股票运行(大约3000只股票的价格可以追溯到100年前)。

我有点困惑于此,我目前所拥有的是一堆乱用的SQL子查询,因为它们无法解释X,Y和Z都可以是任何值的事实(0-N )。也就是说,在过去的5天里,我可能正在寻找40天平均值> 0的股票。比5,或5>或者我可以在过去的40天里查找10天移动平均值> 1的股票。 30日均线。

这个问题与其他问题不同,因为存在可变的短期和长期日期以及可变项。

2 个答案:

答案 0 :(得分:0)

请参阅Stackoverflow上的这些早期帖子:

这些帖子可以解决您的问题。

答案 1 :(得分: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

您需要填写xy的值。

出于性能原因,您需要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