<p>可以使用极值点。找到局部最大值和最小值</p>
<ul>
<li>idx_u是极值点所在的指数</李>
<li>类型,0是最小值。1是最大值</李>
<li>close是位于极值点时的价格</李>
</ul>
<p></p>
<pre><code>def get_max_min(df, smoothing=4, window_range=10):
smooth_df = df['close'].rolling(window=smoothing).mean().dropna()
local_max = argrelextrema(smooth_df.values, np.greater)[0]
local_min = argrelextrema(smooth_df.values, np.less)[0]
price_local_max_dt = []
for i in local_max:
if (i > window_range) and (i < len(df) - window_range):
price_local_max_dt.append(df.iloc[i - window_range:i + window_range]['close'].idxmax())
price_local_min_dt = []
for i in local_min:
if (i > window_range) and (i < len(df) - window_range):
price_local_min_dt.append(df.iloc[i - window_range:i + window_range]['close'].idxmin())
maxima = pd.DataFrame(df.loc[price_local_max_dt])
minima = pd.DataFrame(df.loc[price_local_min_dt])
max_min = pd.concat([maxima, minima]).sort_index()
max_min.index.name = 'idx_'
max_min = max_min.reset_index()
max_min = max_min[~max_min.idx_.duplicated()]
max_min = max_min.reset_index(drop=True)
maxima.index.name = 'idx_'
maxx = maxima.reset_index()
maxx = maxx[~maxx.idx_.duplicated()]
maxx = maxx.assign(type=[1]*len(maxx))
maxx = maxx[['idx_', 'type', 'close']]
minima.index.name = 'idx_'
minn = minima.reset_index()
minn = minn[~minn.idx_.duplicated()]
minn = minn.assign(type=[0]*len(minn))
minn = minn[['idx_', 'type', 'close']]
resminMax = pd.concat([minn, maxx]).sort_values('idx_')
resminMax = resminMax.reset_index(drop=True)
return resminMax
</code></pre>