如何用Python的yfinance获取股票局部高低点并写入DataFrame
实现方法
1. 拉取股票历史数据
先用yfinance获取目标股票的日线数据,示例代码如下:
import yfinance as yf import pandas as pd from scipy.signal import find_peaks # 拉取AAPL的日线数据,时间范围可自行调整 ticker = "AAPL" df = yf.download(ticker, start="2023-01-01", end="2024-01-01")
2. 计算局部高低点
Yahoo Finance图表里的红绿点是经过过滤的局部极值点,我们可以用scipy.signal.find_peaks实现类似逻辑,通过参数控制极值的筛选条件:
- 局部最高点:直接对收盘价列找峰值,标记为1
- 局部最低点:把收盘价取反后找峰值,对应原位置就是低点,标记为0
示例代码:
# 设置筛选参数:distance控制相邻极值点的最小交易日间隔,height控制波动幅度阈值 min_distance = 10 # 至少间隔10个交易日,避免密集标记 min_height_ratio = 0.02 # 波动幅度至少为当前收盘价的2%,过滤小噪声 # 计算局部最高点(标记为1) peak_indices, _ = find_peaks(df['Close'], distance=min_distance, height=df['Close'] * min_height_ratio) # 计算局部最低点(标记为0):取反收盘价后找峰值 valley_indices, _ = find_peaks(-df['Close'], distance=min_distance, height=-df['Close'] * min_height_ratio) # 初始化标记列,默认无标记(NaN) df['Signal'] = pd.NA # 给局部高点赋值1 df.loc[df.index[peak_indices], 'Signal'] = 1 # 给局部低点赋值0 df.loc[df.index[valley_indices], 'Signal'] = 0
3. 验证与调整
你可以筛选出带标记的行查看结果,或者可视化验证:
import matplotlib.pyplot as plt plt.figure(figsize=(12,6)) plt.plot(df['Close'], label='Close Price') # 标记局部高点(红色上箭头) plt.scatter(df.index[peak_indices], df['Close'].iloc[peak_indices], color='red', marker='^', s=100, label='Local High (1)') # 标记局部低点(绿色下箭头) plt.scatter(df.index[valley_indices], df['Close'].iloc[valley_indices], color='green', marker='v', s=100, label='Local Low (0)') plt.legend() plt.show()
参数调整说明
distance:标记太密集就调大,太稀疏就调小height:可以改成固定金额(比如2美元),替代百分比,适配不同价格区间的股票- 还可以加
prominence参数,控制极值点的突出程度,进一步过滤无关噪声
内容的提问来源于stack exchange,提问作者Mike Cox
相关产品推荐
相关产品推荐

