Hi 游客

更多精彩,请登录!

比特池塘 Python编程 正文

yfinance 批量下载历史数据

机器学习
8 0 0
yfinance

  1. import yfinance as yf
  2. import pandas as pd # 通常会用到 pandas
复制代码


1 创建 Tickers 对象
  1. tickers_list = ["AAPL", "MSFT", "GOOG", "AMZN"]
  2. tickers = yf.Tickers(" ".join(tickers_list)) # 或者直接 yf.Tickers("AAPL MSFT GOOG AMZN")

  3. print(tickers)
复制代码
2 批量下载历史数据

  1. # 批量获取过去一个月的数据
  2. multi_hist = tickers.history(period="1mo")
  3. print("\n批量获取的历史数据 (部分):")
  4. print(multi_hist.head())

  5. # 查看列索引结构
  6. print("\n多层列索引:")
  7. print(multi_hist.columns)

  8. # 访问特定股票的特定列数据
  9. print("\n访问 AAPL 的收盘价:")
  10. print(multi_hist['AAPL']['Close'].head())
  11. # 或者使用 stack() 方法转换数据结构,更方便按 Ticker 分组处理
  12. # stacked_hist = multi_hist.stack(level=0).reset_index().rename(columns={'level_1': 'Ticker'})
  13. # print("\n转换后的数据结构:")
  14. # print(stacked_hist.head())
复制代码
3 访问单个 Ticker 数据
  1. # 访问 Tickers 对象中的 Google (GOOG) Ticker 对象
  2. goog_ticker = tickers.tickers['GOOG']

  3. # 获取 Google 的 info
  4. goog_info = goog_ticker.info
  5. print(f"\nGoogle 的公司名称: {goog_info.get('longName')}")

  6. # 获取 Google 的财务数据
  7. goog_financials = goog_ticker.financials
  8. print("\nGoogle 的年度损益表 (部分):")
  9. print(goog_financials.head())
复制代码
4 使用 yf.download() 批量下载
  1. # 使用 yf.download() 批量下载历史数据
  2. data = yf.download("NVDA TSLA NFLX", start="2024-01-01", end="2024-04-01")
  3. print("\n使用 yf.download() 获取的数据 (部分):")
  4. print(data.head())

  5. # download 返回的 DataFrame 默认按数据字段分组 (Open, High, Low, Close, Adj Close, Volume)
  6. print("\nyf.download() 返回的列索引:")
  7. print(data.columns)

  8. # 访问特定字段的所有股票数据
  9. print("\n所有股票的收盘价:")
  10. print(data['Close'].head())

  11. # 访问特定股票的所有数据
  12. print("\nTSLA 的所有数据:")
  13. print(data.xs('TSLA', level=1, axis=1).head()) # 使用 xs 进行跨层级选择

  14. # 也可以设置 group_by='ticker' 使列索引先按 Ticker 分组
  15. data_grouped_by_ticker = yf.download("NVDA TSLA NFLX", start="2024-01-01", end="2024-04-01", group_by='ticker')
  16. print("\n按 Ticker 分组的数据 (部分):")
  17. print(data_grouped_by_ticker.head())
  18. print("\n按 Ticker 分组的列索引:")
  19. print(data_grouped_by_ticker.columns)
  20. print("\n访问 TSLA 的收盘价 (按 Ticker 分组):")
  21. print(data_grouped_by_ticker['TSLA']['Close'].head())
复制代码




Yahoo Finance 并未公开其确切的请求频率限制,但过于频繁的请求(尤其是在短时间内大量请求不同 Ticker 的多种数据)可能导致 IP 被暂时封禁(通常返回 HTTP 403 或 429 错误)。

策略:
尽量使用 Tickers 对象或 yf.download() 进行批量操作,而不是在循环中单独请求每个 Ticker。
如果在循环中进行请求,请在每次请求后加入适当的延迟(例如 time.sleep(1))。
避免不必要的数据请求。
如果需要大量数据,考虑分批次、在不同时间进行。


BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

机器学习 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    9