我正在尝试计算可变日期的移动平均线交叉。
我的数据库是结构化的:
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日均线。
这个问题与其他问题不同,因为存在可变的短期和长期日期以及可变项。
答案 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
您需要填写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