如何在DataFrame中检测过去7日内是否出现超20%的跌幅?
高效检测滚动7天内跌幅超20%的方法
别用循环,直接用pandas的**滚动窗口(rolling)**和向量化操作,效率能提升几个数量级,尤其适合大规模时间序列数据。以下针对两种需求场景给出实现方案:
场景1:当前价格相对过去7天最高价跌幅超20%
如果你的需求是判断每个日期的价格,是否比过去7个交易日(含当天)里的最高价跌了20%以上,可以这么写:
import pandas as pd # 处理日期格式并设为索引(如果Date是列的话) df['Date'] = pd.to_datetime(df['Date']) df.set_index('Date', inplace=True) # 计算过去7个交易日的滚动最高价(不足7天的按实际天数算) rolling_7d_high = df['Price'].rolling(window=7, min_periods=1).max() # 判断当前价相对最高价跌幅是否超过20% df['-20 Pct Move Trigger'] = (df['Price'] / rolling_7d_high - 1) <= -0.2
运行后,2024-01-19会被标记为True——当天价格3280相对于过去7天最高价4295,跌幅约23.6%,符合你的示例结果。
场景2:过去7天内任意时段出现过跌幅超20%
如果需要捕捉过去7天区间里任意两个交易日之间的跌幅超20%(比如某天下跌后又反弹),可以通过计算滚动最大回撤实现:
import pandas as pd df['Date'] = pd.to_datetime(df['Date']) df.set_index('Date', inplace=True) # 计算滚动窗口内的累积最高价 rolling_cummax = df['Price'].rolling(window=7, min_periods=1).cummax() # 计算每个价格相对窗口内最高价的跌幅 drawdown = df['Price'] / rolling_cummax - 1 # 找出窗口内的最大跌幅(即最小的drawdown值) rolling_max_drawdown = drawdown.rolling(window=7, min_periods=1).min() # 判断窗口内是否出现过跌幅超20%的情况 df['-20 Pct Move Trigger'] = rolling_max_drawdown <= -0.2
这种方法会标记所有曾出现过大幅下跌的日期,哪怕后续价格反弹。
为什么比循环高效?
pandas的滚动窗口操作是基于C语言的向量化运算,避免了Python循环逐行遍历的开销,数据量越大,速度差距越明显。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

