You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 13:12:29