【2025年5月】yfinanceがエラーを吐く原因と対処法まとめ(Twitter情報ベース)

最近yfinanceの仕様変更多すぎません?エラー吐いてる人も多いのでは。

私自身もここ最近の仕様変更で今回のが一番ややこしかったので、さっとではありますがTwitterの情報をもとにエラー内容と対応策解決策をまとめたいと思います。

DMM FX

はじめに

  • 最近、Pythonの株価取得ライブラリ「yfinance」がエラーを起こしているという報告が多く見られます。

  • 本記事では、X(旧Twitter)上で見つけた解決策・対応例を中心にまとめました。

よくあるエラーのパターン

  • Failed to get ticker

  • MaxRetryError

  • ConnectionError

  • empty DataFrame returned

上記エラーが一般的なこれまでのエラーだったと思いますが、今回は、

  • YFrateLimitError

というエラーが起こりました。

今回のエラーは主に「YFrateLimitError」

YFRatelimitError とは、yfinance(Yahoo Finance APIを扱うPythonライブラリ)を使ってデータ取得を試みた際に、アクセス回数の制限(レートリミット)を超えた場合に発生するエラーです。

 わかりやすく説明すると

yfinanceは、Yahoo Financeのウェブサイトを通じて株価や企業情報などのデータを取得しています。しかし、この取得には1時間あたり、あるいは短時間内でのアクセス数の上限が存在します。

この制限を超えてしまうと、「これ以上アクセスしないでください」という警告として YFRatelimitError が返されるのです。

まぁ例えると図書館で大量の本を一度に借りようとして「一人でそんなに借りないでください」と断られる、そんな状況に似ていますね…

主な原因としては

  • 短時間に大量のティッカー(銘柄)を連続で取得した

  • 複数スレッドやループで高速にAPIにアクセスした

  • スクリプトを何度も短時間で再実行した

「短時間に大量のティッカー(銘柄)を連続で取得した」

yfinanceでは、たとえば「AAPL(Apple)」「GOOGL(Google)」「MSFT(Microsoft)」など複数の株式データを一気に取得することができます。ただし、この「一気にたくさんリクエストを送る」動作が、Yahoo Financeのサーバーにとっては負荷になるのです。

特に10銘柄、50銘柄、100銘柄と数が増えるほど、「アクセスしすぎ!」と見なされやすくなり、レート制限エラー(YFRatelimitError)が発生しやすくなります。

「複数スレッドやループで高速にAPIにアクセスした」

Pythonでは、処理を早く終わらせるために「マルチスレッド」や「非同期処理」などの仕組みが使えます。これを使って複数のリクエストを同時に投げたり、高速で連続的にデータを取りに行くことが可能です。

しかし、これが逆に「過剰アクセス」と見なされる原因になります。
たとえば、0.1秒ごとに10銘柄にアクセスするようなコードを書くと、Yahoo Finance側から「これは機械的なアクセスだ」と判断され、ブロックの対象になる可能性があります。

「スクリプトを何度も短時間で再実行した」

スクリプト(Pythonのコード)をちょっと書き換えてはすぐ実行…という作業を短時間に繰り返していると、その都度yfinanceがYahoo Financeにアクセスしてしまいます

人間の手作業に見せかけたとしても、頻繁な再実行は自動化されたアクセスと同じ扱いを受けやすく、結果的に制限を超えてしまいます。
とくに調整中・検証中は、このパターンに気づかないままレート制限に引っかかることがあります。

主に試される回避策

  • データ取得の間隔を空ける

  • ティッカーの数を減らす

  • 時間を置いて再実行

アクセスの間に「ひと呼吸」置く(1秒待つだけでも違う)

yfinanceは一気に大量の情報を要求すると「ちょっと待って!」と怒られがちです。
たとえば100銘柄を一気にガンガン取りに行ったら、そりゃ制限に引っかかりますよね。

なので、処理の合間に1秒でも待つだけで、だいぶ優しくなってくれます。

import time

for ticker in tickers:
data = yf.download(ticker)
time.sleep(1) # ←これだけでだいぶ平和になる

これはもう人間関係と一緒ですね。急かされるとイヤになりますね。

一度に取りすぎない

「どうせだから全部の銘柄データを一括で!」と欲を出すと、yfinanceが機嫌を損ねます。
特に小型株やETFをたくさん扱っていると、APIが「多すぎ!」とシャットアウト。

なので、ティッカーの数を分けて処理する、あるいは本当に必要な銘柄だけに絞るというのも大事です。

時間を置く、という超シンプル解決法

そして最後に、超アナログだけど意外と効く方法。
それが「しばらく時間をおいて再実行」。

レートリミットって、一定時間が経つとリセットされることが多いので、
10分〜1時間ほど時間を空けてからもう一度やってみると、案外あっさり通ることもあります。

エラー詳細(Twitter情報)

Twitterの情報を拝見してみましょう。

いやみんな困るよなこれ本当に。

解決策・対応例(Twitter情報)

上記のように、yfinanceをアップグレードしたら直ったという人もいますね。

調査した結果だと、基本的にはyfinanceをアップグレードすれば解決できたという声が多かったように思います。

しかしながら一部の人では、それでも直らない人もいます。※私も同じでした。

例外として、動作環境・依存関係などによりエラーを吐き続ける人もいるようです。

そこでこの例外の解決策を見ていきましょう。

yfinanceをバージョンアップしても直らないエラーの解決策

今回のようなエラーについては、下記の情報が役に立ちました。

このポストで助かったという人も多いはず。ありがたやアークさん。

解決策→curl_cffi を使ってリクエストをカスタマイズする

ステップ①必要ライブラリをインストール

pip install curl_cffi yfinance

ステップ②curl_cffi を使ってセッションを作成


import yfinance as yf
from curl_cffi.requests import Session

# curlベースのHTTPセッションを用意
session = Session()

# yfinanceにセッションを渡して使う
ticker = yf.Ticker("AAPL", session=session)
data = ticker.history(period="1mo")

print(data)

その他解説

curl_cffi は、Pythonから「curlライクなリクエスト」を出すためのライブラリです。通常の requests よりも低レベルでOS寄りの挙動をするため、Bot判定を避けやすいです。

yfinance.Ticker()session= オプションを使って、カスタムHTTPセッションを渡すことが可能

yfinance の内部では requests と互換性があるように構成されているので、curl_cffi.requests.Session() を差し替えられます。

まとめ

というわけで、さっと説明していきましたが、分かりづらいなどあるかもしれませんがご容赦ください。

今回のエラーは私的には結構厄介だったため、非常にこの情報には助けられました。

このシェアが皆さんのお役に立てれば幸いです。

【2025年5月】yfinanceがエラーを吐く原因と対処法まとめ(Twitter情報ベース)
\情報配信中!/