如何用Pandas实现DataFrame局部高点前向匹配0.618斐波那契回撤行
问题解决方案
首先修正原代码的笔误:原代码中argrelextrema函数调用时引用的df1未定义,应改为当前的DataFrame变量df,否则会运行报错。
最简实现思路
不需要写嵌套循环,利用Pandas的自连接或者窗口函数就能快速实现需求,核心逻辑是先提取所有局部高点,再过滤符合时间先后、数值更高、0.618回撤匹配三个条件的配对。
完整可运行代码
方法1:自连接实现(灵活度最高,适合自定义配对规则)
import yfinance as yf import numpy as np from scipy.signal import argrelextrema import pandas as pd # 基础数据准备&局部高点提取 n = 2 df = yf.Ticker("INFY.NS").history(period='400d', interval='1D') df['max'] = df.iloc[argrelextrema(df['Close'].values, np.greater_equal, order=n)[0]]['Close'] # 提取所有非空局部高点序列 highs = df[['max']].dropna().reset_index() highs.columns = ['date', 'high_val'] # 自连接构造所有符合要求的高点对:后续时间 + 数值更高 highs['tmp_key'] = 1 high_pairs = highs.merge(highs, on='tmp_key', suffixes=('_prev', '_curr')) high_pairs = high_pairs.query("date_curr > date_prev and high_val_curr > high_val_prev") # 0.618回撤匹配逻辑,可根据你的实际规则调整 # 这里用的是通用斐波那契回撤规则:从后高点回落前高到后高上涨幅度的61.8%,允许1%误差 error_thresh = 0.01 high_pairs['retrace_0618_pos'] = high_pairs['high_val_curr'] - (high_pairs['high_val_curr'] - high_pairs['high_val_prev']) * 0.618 # 如果仅需要高点对的比值接近0.618,用下面的筛选逻辑即可 # matched_pairs = high_pairs[abs(high_pairs['high_val_prev']/high_pairs['high_val_curr'] - 0.618) <= error_thresh] # 如果需要匹配实际回撤到0.618位置的所有K线,用下面的逻辑 matched_rows = df[df.apply(lambda x: any(abs(x['Close'] - high_pairs['retrace_0618_pos']) <= error_thresh * x['Close']), axis=1)]
方法2:窗口函数实现(代码最简洁)
如果你只需要标记符合条件的局部高点,不需要全量配对结果,用expanding窗口一行就能实现:
# 匹配规则:后续高点 / 当前高点 ≈ 1.618,允许1%误差 df['is_matched'] = df['max'].expanding().apply( lambda s: any(abs(s.iloc[-1]/prev - 1.618) <= 0.01 for prev in s.iloc[:-1].dropna()) ).astype(bool) # 直接筛选结果 result = df[df['is_matched']]
优化建议
- 误差阈值可根据品种波动特性调整,通常波动率高的品种可以设为1%2%,波动率低的设为0.3%0.8%
- 数据量超过10万行时,可以把配对逻辑改成numpy广播运算,速度比pandas自连接快3~5倍
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

