如何使用for循环获取2年时间跨度的1分钟间隔股票价格数据
问题诊断
你对代码逻辑的理解确实存在错误,核心问题有3个:
- 自定义的
dl_data函数完全没有用到传入的参数i,每次调用该函数时的请求时间区间都是固定的「当前时间到2年前」,循环执行500多次本质是重复请求同一份数据,没有实现逐段往前拉取历史数据的效果。 - 函数内部请求的是默认粒度的日度行情,和你需要的1分钟粒度不匹配,即使请求成功返回的也是日度数据,和初始的1分钟数据拼接逻辑完全错误。
- Yahoo Finance本身对1分钟级行情的公开回溯周期做了限制,最多仅支持查询最近30天的1分钟数据,不管你怎么调整循环逻辑,都无法拿到超出这个时间范围的数据,这就是你最终数据最早只能追溯到特定时间点的核心原因。
修正后的实现方案
如果要在Yahoo Finance的限制范围内拉取所有可获取的1分钟数据,可以参考下面的代码逻辑:
import pandas as pd import yfinance as yf import datetime as dt tickers = ["SBUX", "MCD", "CMG", "WEN", "DPZ", "YUM", "DENN"] all_data = pd.DataFrame() # 每次拉7天,最多拉4次就覆盖30天上限 for i in range(4): end = dt.datetime.today() - dt.timedelta(days=7*i) start = end - dt.timedelta(days=7) period_data = yf.download(tickers, start=start, end=end, interval='1m')['Adj Close'] all_data = pd.concat([all_data, period_data]) # 去重排序 all_data = all_data.sort_index().drop_duplicates()
其他可行实现方式
- 更换数据源:如果确实需要2年的分钟级行情,可以改用支持长周期分钟数据的财经数据接口,例如国内的聚宽、Tushare Pro、通达信接口,海外的Alpha Vantage等,这类数据源多数需要注册账号,部分会有调用频率或者数据量的免费额度限制。
- 调整需求粒度:如果非必须用1分钟数据,可以改用5分钟、15分钟等更长粒度的行情,Yahoo Finance对这类粒度的回溯周期会更长,最高可以支持到最近2年的15分钟级数据。
内容的提问来源于stack exchange,提问作者atrmi
相关产品推荐
相关产品推荐

