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

Pandas resample重采样结果与yfinance月度数据不匹配问题

根本原因
  • 核心错误是默认雅虎1mo间隔的月度数据是日频数据的月均值,实际上雅虎返回的原生月度K线遵循标准金融K线聚合规则,和均值计算完全无关:
    • 月度Open:当月第一个交易日的开盘价
    • 月度High:当月全部交易日的最高成交价
    • 月度Low:当月全部交易日的最低成交价
    • 月度Close/Adj Close:当月最后一个交易日的收盘价/复权收盘价
    • 月度Volume:当月全部交易日的成交量总和
      你之前用resample('MS').mean()是把整月所有交易日的开、高、低、收全部拉平算平均,出来的是月均成交价格,和原生月K线的开高低收根本不是一个统计口径,这是数据差异的核心来源。你贴的2022-05-01原生数据Close是13.68,正好是福特2022年5月最后一个交易日的收盘价,和你算出来的月均13.38差出0.3完全符合这个逻辑。
  • 时间标签认知偏差:雅虎原生月K的时间戳标记在当月月初(比如5月数据标2022-05-01)只是它的标签规则,统计范围就是完整自然月的交易数据,你之前调整MS/CM等重采样频率,只是改了重采样结果的时间标签位置,没有修改聚合逻辑,自然没法匹配。
  • 涨跌幅偏差放大的原因:原生月K算的pct_change是相邻两个月最后一个交易日收盘价的环比变动,你用月均价算的pct_change是相邻两个月日度收盘价均值的环比变动,两个指标的统计对象完全不同,偏差自然会被放大。
匹配原生月度数据的正确重采样实现

不要对所有列统一用mean()聚合,要对应标准月K的聚合规则写逻辑,代码如下:

import yfinance as yf
import pandas as pd

# 拉取日频原始数据
df = yf.download('f')
df = df[~df.index.duplicated(keep='last')]

# 按日历月初锚点重采样匹配雅虎月K标签规则,同时使用正确的聚合逻辑
monthly_df = df.resample('MS').agg(
    Open=('Open', 'first'),
    High=('High', 'max'),
    Low=('Low', 'min'),
    Close=('Close', 'last'),
    Adj_Close=('Adj Close', 'last'),
    Volume=('Volume', 'sum')
)

monthly_df['pct'] = monthly_df['Close'].pct_change()
print(monthly_df)

运行上述代码得到的结果,和直接调用yf.download(interval='1mo')返回的数值差异,仅会来自雅虎侧对复权因子、分红拆股历史数据的回溯更新,不存在逻辑层面的不匹配。

内容的提问来源于stack exchange,提问作者Slartibartfast

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 10:24:14