SQL 股市数据分析:计算移动平均线

在股市分析中,移动平均线是一种常用的技术指标,用于评估股票价格的趋势。本文将介绍如何使用SQL查询来计算10日和30日移动平均线,并生成相应的信号。

SQL移动平均线计算示例

假设今天是第一天上班,分析师给了一组微软的收盘股价数据。她希望能提供一个报告,显示收盘数据、收盘价、10日移动平均、30日移动平均和信号。信号是根据10日移动平均是否大于30日移动平均来确定的,分别标记为"Over"或"Below"。

输出结果应如下所示:

DECLARE @DailyQuote TABLE ( MarketDate DATE, ClosingPrice DECIMAL(10,2) )

使用以下脚本创建表并填充示例数据:

如何计算移动平均线

在编写SQL查询之前,需要明确正在计算的内容。要计算收盘价的10日移动平均,需要计算当前和过去9天的收盘价。对于30日移动平均,将包括更多的天数。

计算移动平均的一个简单方法是设置一个窗口。可以使用OVER子句来实现。以下是计算10日移动平均MA10的语句:

SELECT MarketDate, ClosingPrice, AVG(ClosingPrice) OVER (ORDER BY MarketDate ASC ROWS 9 PRECEDING) AS MA10 FROM @DailyQuote

在OVER子句中,按MarketDate对行进行排序,然后使用PRECEDING子句定义窗口,从当前行开始,然后向上9行。这使得窗口总共有10行。

这种方法的一个问题是,对于结果中的前几行,10日移动平均是按一天、两天、三天的移动平均计算的,直到真正到达第十天。技术上,它应该从第十行开始计算。为了解决这个问题,还计算了ROW_NUMBER,如果ROW_NUMBER小于10,则返回NULL。

以下是计算ROW_NUMBER、10日和30日移动平均的公共表表达式(CTE):

WITH CTE_DailyQuote (MarketDate, ClosingPrice, RowNumber, MA10, MA30) AS ( SELECT MarketDate, ClosingPrice, ROW_NUMBER() OVER (ORDER BY MarketDate ASC) AS RowNumber, AVG(ClosingPrice) OVER (ORDER BY MarketDate ASC ROWS 9 PRECEDING) AS MA10, AVG(ClosingPrice) OVER (ORDER BY MarketDate ASC ROWS 29 PRECEDING) AS MA30 FROM @DailyQuote ) SELECT MarketDate, RowNumber, ClosingPrice, IIF(RowNumber > 9, MA10, NULL) AS MA10, IIF(RowNumber > 29, MA30, NULL) AS MA30, CASE WHEN RowNumber > 29 AND MA10 > MA30 THEN 'Over' WHEN RowNumber > 29 AND MA10 < MA30 THEN 'Below' ELSE NULL END AS Signal FROM CTE_DailyQuote ORDER BY MarketDate

通过CTE,能够比较ROW_NUMBER并返回NULL。最后一项是生成信号。为此,使用了CASE语句。这仅仅是比较10日移动平均和30日移动平均的问题,同时确保已经到达或超过了第30行结果。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485