Python/Pandas实现趋势转折标记:识别数据集局部极值(峰谷)
识别股价走势中的峰(Peak)与谷(Trough)的实现方案
首先咱们先把核心逻辑掰扯清楚:
- 当上涨趋势转为下跌趋势时,反转前最后一条「上涨」记录就是峰(peak)
- 当下跌趋势转为上涨趋势时,反转前最后一条「下跌」记录就是谷(trough)
下面我会用Python结合带break/continue的循环来实现这个需求,先假设你的CSV数据结构大概是这样(示例):
date,price,trend
2024-01-01,100,up
2024-01-02,105,up
2024-01-03,103,down
2024-01-04,98,down
2024-01-05,101,up
步骤1:读取并预处理数据
先借助pandas来处理CSV(没装的话先跑pip install pandas),读取数据后新增一列signal用来标记峰/谷:
import pandas as pd # 读取目标CSV文件 df = pd.read_csv('stock_data.csv') # 初始化标记列,默认空值 df['signal'] = ''
步骤2:用循环识别峰谷(含break/continue)
这里我们会跟踪当前的趋势状态,遍历数据时判断趋势是否反转,一旦反转就回溯标记对应的峰/谷:
# 先做边界判断:数据量少于2条的话没法识别趋势反转 if len(df) < 2: print("数据量太少啦,没法判断趋势反转") exit() # 初始化趋势跟踪变量 prev_trend = df.iloc[0]['trend'] # 从第2条数据开始遍历(索引从1开始) for i in range(1, len(df)): current_trend = df.iloc[i]['trend'] # 如果当前趋势和上一个趋势一致,直接跳过本轮循环,继续下一条 if current_trend == prev_trend: prev_trend = current_trend continue # 趋势发生反转,开始标记峰谷 if prev_trend == 'up' and current_trend == 'down': # 上涨转下跌,反转前最后一条上涨记录就是峰 df.loc[i-1, 'signal'] = 'peak' elif prev_trend == 'down' and current_trend == 'up': # 下跌转上涨,反转前最后一条下跌记录就是谷 df.loc[i-1, 'signal'] = 'trough' # 更新趋势跟踪变量,继续下一轮循环 prev_trend = current_trend # 把处理后的结果保存到新CSV df.to_csv('stock_data_with_signals.csv', index=False)
代码逻辑拆解
continue的作用:当趋势没变化时,直接跳过后续逻辑,避免做无用功,让循环更高效。- 反转判断逻辑:只有当趋势发生切换时,才会触发峰谷标记,精准定位到反转前的最后一条对应趋势记录(索引
i-1)。 - 边界处理:开头先判断数据量是否足够,避免出现索引越界的错误。
扩展优化(可选)
如果你的CSV里没有现成的trend列,而是需要通过收盘价计算涨跌,可以先补上这一步:
# 根据收盘价计算涨跌趋势:当日收盘价>前一日为up,否则为down df['trend'] = df['price'].apply(lambda x: 'up' if x > df['price'].shift(1) else 'down') # 第一条数据没有前一日参考,设为缺失值或者自定义状态 df.loc[0, 'trend'] = pd.NA
这样整个流程就完整啦,完全用循环结合break/continue实现了你的需求,处理后的数据会在signal列清晰标记出所有的峰和谷。
内容的提问来源于stack exchange,提问作者Akash Narang
相关产品推荐
相关产品推荐

