如何用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
相关产品推荐
相关产品推荐

