如何查找连续2天股价上涨的股票及起始日期,并扩展至N天
找出连续N天收盘价上涨的股票及起始日期
一、连续2天上涨的实现(基于LAG窗口函数)
要找出连续2天收盘价上涨的股票及其起始日期,我们可以利用LAG()窗口函数获取每只股票前一天的收盘价,再判断当日收盘价是否高于前一日,满足条件的记录中,前一日即为连续上涨的起始日期。
SQL示例代码:
WITH daily_price_compare AS ( SELECT Stock_Ticker, Date_id, Close_Price, LAG(Close_Price) OVER (PARTITION BY Stock_Ticker ORDER BY Date_id) AS prev_day_close FROM stock_prices ) SELECT Stock_Ticker, LAG(Date_id) OVER (PARTITION BY Stock_Ticker ORDER BY Date_id) AS start_date, CONCAT(LAG(Date_id) OVER (PARTITION BY Stock_Ticker ORDER BY Date_id), ' ~ ', Date_id) AS consecutive_period FROM daily_price_compare WHERE Close_Price > prev_day_close ORDER BY Stock_Ticker, start_date;
执行这个查询后,会得到每只股票所有连续2天上涨的起始日期和对应时间段。
二、扩展到连续N天上涨的通用解法
如果需要查找连续N天(比如N=3、N=5)上涨的情况,多次嵌套LAG()会导致代码冗余且不易维护,推荐使用分组标记法结合窗口函数实现:
核心思路
- 为每只股票的每日价格标记是否上涨(当日收盘价>前一日则标记为1,否则为0)
- 通过累加“未上涨”的标记值,将连续上涨的日期划分为同一个分组
- 统计每个分组的天数,筛选出天数≥N的分组,取分组的最小日期作为起始日期
SQL示例代码(以N=3为例):
WITH price_trend_flag AS ( SELECT Stock_Ticker, Date_id, CASE WHEN Close_Price > LAG(Close_Price) OVER (PARTITION BY Stock_Ticker ORDER BY Date_id) THEN 1 ELSE 0 END AS is_up FROM stock_prices ), trend_groups AS ( SELECT Stock_Ticker, Date_id, SUM(CASE WHEN is_up = 0 THEN 1 ELSE 0 END) OVER (PARTITION BY Stock_Ticker ORDER BY Date_id) AS group_id FROM price_trend_flag ), group_summary AS ( SELECT Stock_Ticker, group_id, MIN(Date_id) AS start_date, MAX(Date_id) AS end_date, COUNT(*) AS consecutive_days FROM trend_groups GROUP BY Stock_Ticker, group_id HAVING COUNT(*) >= 3 -- 这里替换为你需要的N值 ) SELECT Stock_Ticker, start_date, end_date, consecutive_days FROM group_summary ORDER BY Stock_Ticker, start_date;
说明
- 第一部分CTE
price_trend_flag完成每日上涨标记,首日因无前一日数据,is_up为0 trend_groups通过累加未上涨标记,将连续上涨的日期归为同一分组,分组ID仅在价格下跌时递增group_summary统计每个分组的连续天数,筛选出符合N天要求的结果,最终输出股票、起始日期、结束日期及连续天数
需要调整连续天数时,只需修改HAVING COUNT(*) >= 3中的数值即可,适配任意N值的需求。
内容的提问来源于stack exchange,提问作者John Constantine
相关产品推荐
相关产品推荐

