最近yfinanceの仕様変更多すぎません?エラー吐いてる人も多いのでは。
私自身もここ最近の仕様変更で今回のが一番ややこしかったので、さっとではありますがTwitterの情報をもとにエラー内容と対応策解決策をまとめたいと思います。
はじめに
-
最近、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の情報を拝見してみましょう。
yfinanceからデータとれなくなってる?
— ゆと (@quPFNsUr0JgLqpZ) May 11, 2025
ほかの手段考えた方がいいか
yfinanceの挙動があやしい。。。以前動いたけど今日は動かないみたいなことが多々起こってる。。
— hkns (@hknskn3) May 11, 2025
これこのままだとちょっと使えないかもだよ。。さっさと運用したいのに。。
いやみんな困るよなこれ本当に。
解決策・対応例(Twitter情報)
またyfinanceからデータが取得できなくなってたけど、pip install –upgrade yfinanceで無事にまたデータ取得できるようになって良かった…!
— TAK (@taknotes2) May 10, 2025
上記のように、yfinanceをアップグレードしたら直ったという人もいますね。
調査した結果だと、基本的にはyfinanceをアップグレードすれば解決できたという声が多かったように思います。
しかしながら一部の人では、それでも直らない人もいます。※私も同じでした。
うーん、yfinanceは最新にアップデートすれば問題なく動作するようだけど、同一プロジェクトで古いバージョンのpythonでしか動かないライブラリもあって、とても厄介、、、
— ちょっとずつ再開していきたいマン (@__R__K__) May 10, 2025
うーん、yfinanceは最新にアップデートすれば問題なく動作するようだけど、同一プロジェクトで古いバージョンのpythonでしか動かないライブラリもあって、とても厄介、、、
— ちょっとずつ再開していきたいマン (@__R__K__) May 10, 2025
例外として、動作環境・依存関係などによりエラーを吐き続ける人もいるようです。
そこでこの例外の解決策を見ていきましょう。
yfinanceをバージョンアップしても直らないエラーの解決策
今回のようなエラーについては、下記の情報が役に立ちました。
https://t.co/X6EE7o5d5a() のエラー「YFrateLimitError」について、curl_cffi のセッションを yf.Ticker(…, session=…) に渡し、history() を使う方法で解決🥲
— アーク@株🔰・格闘技・映画 (@arkkholic) May 9, 2025
「yfinanceを更新すれば直る」という報告も見かけましたが、自分のyfinanceは最新版でした。⚠️curl_cffi のインストールが必要です。 https://t.co/wkhAoVH0xk pic.twitter.com/bW8bD8WfqC
このポストで助かったという人も多いはず。ありがたやアークさん。
解決策→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()
を差し替えられます。
まとめ
というわけで、さっと説明していきましたが、分かりづらいなどあるかもしれませんがご容赦ください。
今回のエラーは私的には結構厄介だったため、非常にこの情報には助けられました。
このシェアが皆さんのお役に立てれば幸いです。