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

求助:yfinance无法返回昨日行情数据问题

问题分析与解决

问题原因

你遇到的核心问题来自两个关键点:

  1. yfinance的period参数逻辑:period="5d"指的是过去5个自然日,而非交易日,若包含周末等非交易日,实际返回的交易日数量会波动;同时如果当日未收盘,API不会返回完整的当日OHLC数据,容易造成“缺失昨日数据”的认知偏差(可能是时区或收盘时间差导致)。
  2. 时区不匹配: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:55:06