mcpField
Y
yahoo-finance

yahoo-finance

github.com/gauss314数据与数据库253326 次安装20 周前更新
代码仓库

关于 yahoo-finance

这是一个通过非官方 HTTP 接口获取 Yahoo Finance 市场数据的 Python skill,无需 yfinance 等封装库。它提供单只及多只股票的数据脚本,并包含限流机制和接口参考文档。

主要功能

  1. 01获取历史 OHLCV 数据
  2. 02查询报价与公司基本面
  3. 03获取期权、搜索结果和新闻
  4. 04批量抓取并进行限流
  5. 05CLI 脚本与接口参考文档

适用场景

  1. 01将历史价格下载为 CSV
  2. 02查询股票报价和基本面
  3. 03批量收集多个股票代码的数据
  4. 04搜索股票代码及相关新闻

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/gauss314/skills --skill yahoo-finance

安装后在 Claude Code 中输入/yahoo-finance确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
API_REFERENCE.md
scripts/
batch_fetch.py
download_historical.py
fetch_all.py
fetch_quote.py

详细介绍

Yahoo Finance — 直接 API(不使用 yfinance)

Yahoo Finance 非官方 API。通过直接 HTTP requests获取股票、ETF、加密货币、外汇、债券、指数、期权、基本面和新闻数据,不使用 yfinance 或任何封装库。

基础 URL: https://query1.finance.yahoo.com 备用地址: https://query2.finance.yahoo.com


⚠️ 重要提示

  • Yahoo 自 2017 年起没有官方公共 API。这些端点均为非官方端点,可能会在不另行通知的情况下发生变化。
  • 某些端点需要通过cookie + crumb进行身份验证(下文会说明)。
  • v8/finance/chart 端点无需身份验证(只需使用浏览器的 User-Agent)。
  • 始终实现速率限制和错误处理。

完整文档

如需查阅所有端点、字段、JSON 结构、错误代码、国际股票代码、速率限制策略和详细示例,请参阅:

📖 references/API_REFERENCE.md

该文档包括:

  • quoteSummary 的 33 个模块及每个字段的说明
  • 每个端点的完整 JSON 响应
  • 国际股票代码(阿根廷为 .BA,巴西为 .SA 等)
  • WebSocket 流式传输
  • 筛选器、查询、热门趋势
  • 使用指数退避和 User-Agent 轮换的速率限制策略

身份验证:Cookie + Crumb

多个端点需要 crumb(CSRF 令牌),通过会话 cookie 获取。

import requests

BASE = "https://query1.finance.yahoo.com"
HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}

def yahoo_session():
    """Retorna requests.Session con cookie A3 y crumb."""
    s = requests.Session()
    s.headers.update(HEADERS)
    s.get("https://fc.yahoo.com", timeout=10)
    crumb = s.get(f"{BASE}/v1/test/getcrumb", timeout=10).text.strip()
    s.params = {"crumb": crumb}
    return s

# Uso:
# s = yahoo_session()
# r = s.get("https://query1.finance.yahoo.com/v7/finance/quote?symbols=AAPL,MSFT")
按身份验证要求划分的端点
无需身份验证(仅需 User-Agent)需要 crumb
v8/finance/chart(历史数据)v7/finance/quote(价格)
v1/finance/search(搜索)v10/finance/quoteSummary(基本面)
v1/finance/trending(趋势)v7/finance/options(期权)
v1/finance/lookup(查询)v6/finance/recommendationsbysymbol

端点 — 快速概览

1. OHLCV 历史数据 — v8/finance/chart

GET https://query1.finance.yahoo.com/v8/finance/chart/{symbol}?range=1y&interval=1d

参数示例
range1d、5d、1mo、3mo、6mo、1y、5y、10y、ytd、max
interval1m、5m、15m、1h、1d、1wk、1mo
eventsdiv,splits(包括股息和拆股)
import requests
headers = {"User-Agent": "Mozilla/5.0 (...) Chrome/120.0.0.0 Safari/537.36"}
r = requests.get("https://query1.finance.yahoo.com/v8/finance/chart/AAPL",
                 params={"range": "1y", "interval": "1d", "events": "div,splits"},
                 headers=headers)
data = r.json()["chart"]["result"][0]
# data["timestamp"] -> fechas Unix
# data["indicators"]["quote"][0] -> open, high, low, close, volume
# data["indicators"]["adjclose"][0] -> precios ajustados
# data["events"] -> dividendos y splits
2. 报价 — v7/finance/quote
s = yahoo_session()
r = s.get("https://query1.finance.yahoo.com/v7/finance/quote?symbols=AAPL,MSFT,GOOGL")
quotes = r.json()["quoteResponse"]["result"]
for q in quotes:
    print(q["symbol"], q["regularMarketPrice"], q["regularMarketChangePercent"])

字段:regularMarketPrice、regularMarketChangePercent、marketCap、trailingPE、fiftyTwoWeekHigh/Low、dividendYield、volume、marketState(盘前/常规交易时段/盘后/休市)。

3. 基本面 — v10/finance/quoteSummary
s = yahoo_session()
r = s.get("https://query1.finance.yahoo.com/v10/finance/quoteSummary/AAPL",
          params={"modules": "assetProfile,financialData,defaultKeyStatistics,incomeStatementHistory,balanceSheetHistory,cashflowStatementHistory,earnings,recommendationTrend"})
fundamentals = r.json()["quoteSummary"]["result"][0]
profile = fundamentals["assetProfile"]           # sector, industry, employees, description
financials = fundamentals["financialData"]        # EBITDA, revenue, margins, ROE, ROA
stats = fundamentals["defaultKeyStatistics"]      # beta, shares, PE, PEG, short info

共有 33 个可用模块。完整列表请参阅 API_REFERENCE.md 第 4 节。

4. 期权 — v7/finance/options
s = yahoo_session()
r = s.get("https://query1.finance.yahoo.com/v7/finance/options/AAPL")
data = r.json()["optionChain"]["result"][0]
expirations = data["expirationDates"]
strikes = data["strikes"]
options = data["options"][0]  # calls + puts
5. 搜索 + 新闻 — v1/finance/search
r = requests.get("https://query1.finance.yahoo.com/v1/finance/search",
                 params={"q": "Apple", "quotesCount": 3, "newsCount": 5},
                 headers=HEADERS)
data = r.json()
# data["quotes"] -> tickers encontrados
# data["news"] -> noticias relacionadas

脚本

脚本描述
batch_fetch.py多股票代码批量获取,使用令牌桶 + ThreadPoolExecutor。报价批处理(所有代码通过 1 个请求获取)。并行获取图表数据,同时遵守速率限制。
fetch_all.py综合脚本:获取历史数据 + 报价 + 基本面 + 期权 + 搜索 + 推荐。适用于任何股票代码,可通过 CLI 参数配置。
fetch_quote.py快速获取指定股票代码的报价 + 基本面。
download_historical.py将 OHLCV 历史数据下载为 CSV。
batch_fetch.py — 具有速率限制的多代码批量获取
# Test seguro (3 tickers, solo chart, 2 req/s)
py scripts/batch_fetch.py --tickers AAPL,MSFT,NVDA --chart --rate 2.0

# Batch completo (quote en 1 request + charts en paralelo)
py scripts/batch_fetch.py --tickers AAPL,MSFT,NVDA,GOOGL,META,AMZN,TSLA --all --rate 2.0 --workers 4

# Solo quotes (siempre 1 request, imposible rate-limit)
py scripts/batch_fetch.py --tickers AAPL,MSFT,NVDA,GOOGL --quote

# Personalizar rate + workers
py scripts/batch_fetch.py --tickers AAPL,MSFT,NVDA --all --rate 1.5 --workers 3 --range 5y

主要标志:

  • --rate:令牌桶的令牌数/秒(默认值:2.0 — 安全上限)
  • --burst:突发时可累积的令牌数(默认值:5)
  • --workers:并行线程数(默认值:4)

架构:

  1. 阶段 1 — 批量报价:所有代码通过 1 个请求获取(v7/finance/quote?symbols=AAPL,MSFT,...)
  2. 阶段 2 — 令牌桶:使用 ThreadPoolExecutor,由多个 worker 共享线程安全的 TokenBucket。每个 worker 在每次请求前获取一个令牌。速率为 2 req/s、burst=5 时,最多可以立即发起 5 个请求而不阻塞;之后令牌桶会稳定吞吐量。
fetch_all.py — 主脚本
python scripts/fetch_all.py --ticker AAPL --all                     # Todo lo disponible
python scripts/fetch_all.py --ticker GGAL --all --range 5y --interval 1d  # GGAL con 5 años
python scripts/fetch_all.py --ticker MSFT --chart --range max        # Histórico completo
python scripts/fetch_all.py --ticker NVDA --quote --fundamentals     # Quote + fundamentals
python scripts/fetch_all.py --ticker TSLA --all --all-modules        # Todos los módulos (~33)
python scripts/fetch_all.py --ticker AAPL --options                  # Solo opciones
python scripts/fetch_all.py -t AAPL -o mi_data.json -q               # Output a archivo, quiet

主要标志:

  • --all:获取所有数据(图表、报价、基本面、期权、搜索、推荐)
  • --chart:OHLCV 历史数据
  • --quote:实时价格
  • --fundamentals:基本面数据(quoteSummary)
  • --options:期权链
  • --search:搜索和新闻
  • --range / --interval:控制历史数据
  • --modules / --all-modules:quoteSummary 模块
  • --output:JSON 输出文件
GGAL 实际测试(已测试)
>> Chart (1y, 1d)... OK 250 bars
>> Quote...             OK Price: $50.33 (-1.62%)
>> Fundamentals...      OK 12 módulos (core)
>> Options...           OK 5 expiration dates, 17 calls, 19 puts
>> Search+News...       OK 5 news items
Guardado en: ggal_temp.json  (123 KB)

国际股票代码

Yahoo Finance 使用后缀表示美国以外的市场:

市场后缀示例
阿根廷(BCBA).BAGGAL.BA、YPFD.BA
巴西(Bovespa).SAPETR4.SA、VALE3.SA
墨西哥(BMV).MXWALMEX.MX
加密货币-USDBTC-USD、ETH-USD
外汇=XEURUSD=X
指数^^GSPC(S&P 500)

完整列表请参见 API_REFERENCE.md 第 14 节。


速率限制

限制行为
~2 req/s安全
3-5 req/s触发 429 的概率较高
>10 req/sIP 临时封禁

始终在请求之间使用 time.sleep(0.5),并实现指数退避。

批量获取多个代码时,请使用 batch_fetch.py,该脚本通过令牌桶实现 2 req/s、burst 为 5 的速率限制。与 yfinance(没有速率限制器,会同时启动 N 个线程)不同,batch_fetch 可确保总体吞吐量不会超过安全上限。


常见错误

错误原因解决方案
401 Unauthorized缺少 crumb使用 yahoo_session()
429 Too Many Requests速率限制等待 30-60s
Bad Requestcrumb 已过期重新生成 crumb
result 为空代码无效先通过 search 验证
Python-requests 被拦截默认 User-Agent设置为浏览器的 User-Agent

skill 结构

skills/yahoo-finance/
├── SKILL.md                          # Este archivo (quickstart)
├── references/
│   └── API_REFERENCE.md              # Documentación completa de todos los endpoints
└── scripts/
    ├── batch_fetch.py                # Batch multi-ticker con rate limiting (recomendado)
    ├── fetch_all.py                  # Script integral
    ├── fetch_quote.py                # Quote + fundamentals rápido
    └── download_historical.py        # Históricos a CSV

评论

支持 Markdown