如何编写for循环基于YahooFinancials批量获取多只股票历史价格
基于YahooFinancials的多只股票历史数据批量下载方案
你之前两种实现报错的核心原因是雅虎财经旧版公开接口已升级鉴权规则,旧版pandas_datareader内置的雅虎数据源、直接拼接v7版本下载链接的请求方式都已被官方限制访问。基于你验证可用的YahooFinancials库,批量下载只需遍历股票代码列表即可实现,以下是可直接运行的代码。
前置依赖安装
先在终端执行命令安装所需依赖库:
pip install pandas openpyxl yahoofinancials
方案1:每只股票导出为单独CSV文件
和你单只股票导出CSV的逻辑完全对齐,自动遍历所有标的完成下载:
import os import time import pandas as pd from yahoofinancials import YahooFinancials # 配置参数 tickers = ['GOOG', 'AAPL', 'MMM', 'ACN', 'A', 'ADP', 'TSLA', 'TWTR', 'MSFT'] start_date = '2021-12-01' end_date = '2022-05-31' time_interval = 'daily' # CSV保存路径,替换为你自己的文件夹路径,确保文件夹已提前创建 save_path = '/Users/rangapriyas/Desktop/Prices/' # 遍历所有股票拉取数据 for ticker in tickers: try: # 拉取单只股票数据 yahoo_financials = YahooFinancials(ticker) data = yahoo_financials.get_historical_price_data( start_date=start_date, end_date=end_date, time_interval=time_interval ) # 数据格式整理,和你单只股票的处理逻辑保持一致 price_df = pd.DataFrame(data[ticker]['prices']) price_df = price_df.drop('date', axis=1).set_index('formatted_date') # 保存对应CSV文件 price_df.to_csv(os.path.join(save_path, f'{ticker}.csv')) print(f'{ticker} 数据下载完成') # 加1秒请求间隔,避免请求过于频繁被平台临时限制 time.sleep(1) except Exception as e: print(f'{ticker} 数据下载失败,错误信息:{str(e)}') continue
方案2:所有股票导出到同一个Excel的不同Sheet
对齐你之前多Sheet导出的需求,所有标的存在同一个Excel文件中:
import time import pandas as pd from yahoofinancials import YahooFinancials # 配置参数 tickers = ['GOOG', 'AAPL', 'MMM', 'ACN', 'A', 'ADP', 'TSLA', 'TWTR', 'MSFT'] start_date = '2021-01-01' end_date = '2022-05-31' time_interval = 'daily' # Excel文件保存路径 excel_save_path = 'historicalprices.xlsx' # 初始化Excel写入器 xlwriter = pd.ExcelWriter(excel_save_path, engine='openpyxl') for ticker in tickers: try: yahoo_financials = YahooFinancials(ticker) data = yahoo_financials.get_historical_price_data( start_date=start_date, end_date=end_date, time_interval=time_interval ) price_df = pd.DataFrame(data[ticker]['prices']) # 数据格式整理,可根据需求调整字段保留逻辑 price_df = price_df.drop('date', axis=1).set_index('formatted_date') # 写入对应名称的Sheet price_df.to_excel(xlwriter, sheet_name=ticker, index=True) print(f'{ticker} 数据写入完成') time.sleep(1) except Exception as e: print(f'{ticker} 数据处理失败,错误信息:{str(e)}') continue # 保存Excel文件 xlwriter.close() print(f'所有数据已保存到 {excel_save_path}')
注意事项
- 运行前请确保填写的文件保存路径真实存在,尤其是存放单独CSV文件的文件夹需要手动提前创建,否则会触发路径不存在报错
- 代码中添加了1秒请求间隔与异常捕获逻辑,单只股票拉取失败不会中断整个任务,会自动跳过失败标的继续执行剩余任务
- 可根据需求直接修改时间范围、时间粒度参数,
time_interval参数支持daily(日K)、weekly(周K)、monthly(月K)三个取值 - 如果需要保留原始时间戳字段,删除代码中
drop('date', axis=1)的逻辑即可
内容的提问来源于stack exchange,提问作者Priya Saivasan
相关产品推荐
相关产品推荐

