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

如何用Python的yfinance获取聚合4小时K线历史股票数据及解决NaN问题

关于yfinance聚合K线数据及预聚合数据获取的问题

问题描述

据我所知,yfinance似乎不提供可下载的免费预聚合K线数据,因此我需要自行聚合数据。我尝试了以下代码,但生成的聚合DataFrame中出现大量NaN值,这似乎不太合理!我想知道是否有更好的方法来实现。另外,是否有简便方法直接从Yahoo Finance服务器获取已预聚合的数据?

尝试的代码

import yfinance as yf

df = yf.download("SPY", period="2y", interval='1h')
ohlc_dict = {'Open': 'first', 'High': 'max', 'Low': 'min', 'Close': 'last', 'Adj Close': 'last', 'Volume': 'sum'}
df = df.resample('4H', label='left').agg(ohlc_dict)
print(df)

运行结果

[*********************100%***********************]  1 of 1 completed
                                Open        High  ...   Adj Close    Volume
2020-11-17 12:00:00-05:00  361.36499  361.920013  ...  360.640015  22304320
2020-11-17 16:00:00-05:00        NaN         NaN  ...         NaN         0
2020-11-17 20:00:00-05:00        NaN         NaN  ...         NaN         0
2020-11-18 00:00:00-05:00        NaN         NaN  ...         NaN         0
2020-11-18 04:00:00-05:00        NaN         NaN  ...         NaN         0

[5 rows x 6 columns]

问题分析与解决方案

1. NaN值产生的原因

出现大量NaN是因为股票有固定交易时段(比如美股为当地时间9:30-16:00),按4小时重采样时会覆盖非交易时段(如深夜、凌晨),这些时段原本就没有交易数据,聚合后自然会出现NaN。

2. 优化后的聚合代码

可以通过过滤无效行或对齐交易时段来解决这个问题,以下是两种可行方案:

方案一:过滤无交易数据的行

import yfinance as yf

# 下载数据并统一时区为美国东部时间
df = yf.download("SPY", period="2y", interval='1h')
df = df.tz_convert('America/New_York')

# 定义聚合规则
ohlc_dict = {'Open': 'first', 'High': 'max', 'Low': 'min', 'Close': 'last', 'Adj Close': 'last', 'Volume': 'sum'}

# 4小时重采样后,过滤掉所有价格字段为空的行
df_4h = df.resample('4H', label='left').agg(ohlc_dict)
df_4h = df_4h.dropna(subset=['Open', 'High', 'Low', 'Close'], how='all')

print(df_4h)

方案二:对齐交易时段重采样

直接从美股开盘时间(9:30)开始按4小时划分区间,避免覆盖非交易时段:

import yfinance as yf

df = yf.download("SPY", period="2y", interval='1h')
df = df.tz_convert('America/New_York')

ohlc_dict = {'Open': 'first', 'High': 'max', 'Low': 'min', 'Close': 'last', 'Adj Close': 'last', 'Volume': 'sum'}

# 从9:30开始按4小时重采样,自动对齐交易时段
df_4h = df.resample('4H', label='left', offset='9h30min').agg(ohlc_dict)
df_4h = df_4h.dropna(subset=['Open', 'High', 'Low', 'Close'], how='all')

print(df_4h)

3. 预聚合数据的获取途径

Yahoo Finance官方没有开放免费的预聚合K线数据接口,yfinance也未提供相关功能。免费渠道下,只能先下载基础时段数据(如1小时线)后自行聚合。如果需要更高效的预聚合数据,可考虑付费数据服务商的API。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:45:55