0

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

我的数据库是结构化的:

id
stock_id
date
closing_price

和:

stock_id
symbol

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

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

这个问题与其他问题不同,因为有可变的短期和长期日期以及可变术语。

4

2 回答 2

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
于 2013-04-27T15:24:42.380 回答
0

请在 Stackoverflow 上查看这些较早的帖子:

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

于 2013-04-27T14:55:40.323 回答