使用yfinance指定每日特定起始时间获股票数据时遇报错求助
解决Yahoo Finance 1分钟股票数据获取报错问题
你遇到的报错- F: Data doesn't exist for startDate = 1666286770, endDate = 1666287074,本质是请求了Yahoo Finance未存储的时间区间数据,核心原因有两个:
- 1分钟级股票数据仅保留最近7天内的记录,且仅能获取美股交易时段(美东时间9:30-16:00)的数据,非交易时段或超出7天范围的请求会返回无数据。
- 同时指定
period='1d'和start参数会触发API逻辑冲突,导致时间范围计算异常,请求了不存在的时段。
解决步骤及修改后的代码
import pytz import datetime as dt import yfinance as yf import pandas as pd # 替换成你的股票代码列表 ticks = ["AAPL", "MSFT"] def watchlist(): timezone = pytz.timezone('US/Eastern') now = dt.datetime.now(timezone) past_time = now - dt.timedelta(minutes=5) # 5分钟前的时间 # 校验1分钟数据的时间有效性 seven_days_ago = now - dt.timedelta(days=7) if past_time < seven_days_ago: print("请求的时间超出1分钟数据可获取范围(仅保留最近7天)") return # 校验是否在美股交易时段内 market_open = dt.time(9, 30) market_close = dt.time(16, 0) if not (market_open <= now.time() <= market_close): print("当前非美股交易时段,无法获取实时1分钟数据") return for ticker in ticks: syb = yf.Ticker(ticker) try: # 获取当日全时段1分钟数据 data = syb.history(interval="1m", period='1d') # 获取过去5分钟到现在的1分钟数据(仅用start/end,避免和period冲突) data2 = syb.history(interval="1m", start=past_time, end=now) # 先判断数据是否为空,再进行后续计算 if not data.empty and not data2.empty: if data['Open'].sum() < data2['Open'].sum(): print(f"{ticker} 全天Open总和: {data['Open'].sum()}") print(f"{ticker} 近5分钟Open总和: {data2['Open'].sum()}") print(f"{ticker} 需要关注") else: print(f"{ticker} 继续通过Robinhood卖出") else: print(f"{ticker} 无有效数据,跳过") except Exception as e: print(f"{ticker} 获取数据失败: {str(e)}") watchlist()
关键修改说明
- 移除参数冲突:获取
data2时仅用start和end定义时间区间,避免API混淆时间范围。 - 增加时间有效性校验:确保请求时间在最近7天内且处于美股交易时段,从根源避免无效请求。
- 空数据与异常处理:添加数据非空判断和异常捕获,防止程序因无数据直接崩溃。
- 变量名规范化:调整为符合Python命名习惯的格式,提升代码可读性。
内容的提问来源于stack exchange,提问作者Aaron Chris
相关产品推荐
相关产品推荐

