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

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)

代码逻辑拆解

  1. continue的作用:当趋势没变化时,直接跳过后续逻辑,避免做无用功,让循环更高效。
  2. 反转判断逻辑:只有当趋势发生切换时,才会触发峰谷标记,精准定位到反转前的最后一条对应趋势记录(索引i-1)。
  3. 边界处理:开头先判断数据量是否足够,避免出现索引越界的错误。

扩展优化(可选)

如果你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:03:13