如何使用Pandas追踪时间序列中的连续高点?
使用Pandas追踪时间序列中的连续高点(以MSFT收盘价为例)
嘿,这个需求在量化分析或者价格趋势追踪里太常见了!我来一步步带你实现,还会用微软(MSFT)的收盘价做实操演示,跟着代码走就行~
第一步:获取股票收盘价数据
首先咱们用你提到的yahooquery工具拉取MSFT的历史数据,不过要注意返回的是多层索引,得先整理一下:
from yahooquery import Ticker import pandas as pd # 初始化Ticker并获取历史数据 ticker = Ticker('MSFT', asynchronous=True) df = ticker.history() # 重置多层索引,方便后续处理 df = df.reset_index() # 确保日期列是datetime格式 df['date'] = pd.to_datetime(df['date']) # 只保留需要的日期和收盘价列(可选) df = df[['date', 'close']].sort_values('date').reset_index(drop=True)
第二步:追踪连续上涨的高点区间
这里分两种常见场景,你可以根据自己的需求选:
场景1:识别连续N天上涨的区间(每日收盘价高于前一天)
这种是追踪“连续走高”的趋势,我们可以标记每日是否上涨,再把连续上涨的时段分组统计:
# 1. 标记当日收盘价是否高于前一日 df['is_higher'] = df['close'] > df['close'].shift(1) # 2. 给连续上涨的时段分配唯一分组ID # 当is_higher的值发生变化时,分组ID+1 df['rally_group'] = (df['is_higher'] != df['is_higher'].shift(1)).cumsum() # 3. 统计每个连续上涨区间的关键信息 rally_summary = df[df['is_higher']].groupby('rally_group').agg( 起始日期=('date', 'first'), 结束日期=('date', 'last'), 连续上涨天数=('date', 'count'), 区间最高收盘价=('close', 'max') ).reset_index(drop=True) print(rally_summary.head())
这段代码会输出所有连续上涨的时段,比如哪几天连续涨了、涨了几天、区间内的最高点是多少,非常直观。
场景2:追踪历史新高点(收盘价高于之前所有交易日)
如果你的需求是找“创历史新高”的点,那逻辑更简单,用滚动最大值就能实现:
# 计算从上市以来到当日的收盘价最大值 df['rolling_max'] = df['close'].cummax() # 标记当日是否创历史新高 df['is_all_time_high'] = df['close'] == df['rolling_max'] # 筛选出所有历史新高点 all_time_highs = df[df['is_all_time_high']][['date', 'close']] print(all_time_highs.tail())
这样你就能得到所有MSFT收盘价创历史新高的日期和价格啦。
小提示
- 如果你的时间序列有缺失值,记得先用
df.dropna()或者df.fillna()处理,避免比较时出错; - 可以把这些逻辑封装成函数,方便复用在其他股票或者时间序列数据上。
内容的提问来源于stack exchange,提问作者user8270077




