求助:yfinance无法返回昨日行情数据问题
问题分析与解决
问题原因
你遇到的核心问题来自两个关键点:
- yfinance的
period参数逻辑:period="5d"指的是过去5个自然日,而非交易日,若包含周末等非交易日,实际返回的交易日数量会波动;同时如果当日未收盘,API不会返回完整的当日OHLC数据,容易造成“缺失昨日数据”的认知偏差(可能是时区或收盘时间差导致)。 - 时区不匹配:yfinance默认返回UTC时区的日期索引,和你本地时区的“昨日”可能存在错位,比如你本地的昨日对应UTC的前一天,导致数据看起来不符合预期。
修复后的代码
import yfinance as yf import pandas as pd from datetime import datetime, timedelta def get_last_two_days_ohlc(ticker): # 取过去7个自然日,确保覆盖足够的交易日(含周末) end_date = datetime.today() start_date = end_date - timedelta(days=7) # 用start/end精确指定日期范围,关闭自动调整 data = yf.download(ticker, start=start_date.strftime("%Y-%m-%d"), end=end_date.strftime("%Y-%m-%d"), auto_adjust=False) # 过滤未收盘的行(当日未结束时Open/High/Low会缺失) data = data.dropna(subset=['Open', 'High', 'Low', 'Close']) # 取最后两个已收盘的交易日 last_two_days = data.iloc[-2:] # 转换为本地时区(示例为上海时区,可根据你的需求修改) last_two_days.index = last_two_days.index.tz_convert('Asia/Shanghai') return last_two_days[['Open', 'High', 'Low', 'Close']] # 测试 ticker = "EURUSD=X" ohlc_data = get_last_two_days_ohlc(ticker) print(ohlc_data)
关键优化点
- 替换
period为start/end:精确控制日期范围,避免自然日与交易日的混淆,确保覆盖足够的潜在交易日。 - 过滤未收盘数据:通过
dropna指定检查OHLC字段,排除当日未完成交易的不完整数据。 - 时区统一:将索引转换为本地时区,消除UTC与本地时间的错位问题,让日期显示符合你的认知。
补充说明
如果运行代码时处于交易日的盘中时段,yfinance不会返回当日完整的OHLC数据(因为行情未结束),此时返回的最后一个交易日会是昨日;若在收盘后运行,API更新后就能获取当日数据。
内容的提问来源于stack exchange,提问作者Kobs
相关产品推荐
相关产品推荐

