最近yfinanceの仕様変更多すぎません?エラー吐いてる人も多いのでは。
私自身もここ最近の仕様変更で今回のが一番ややこしかったので、さっとではありますがTwitterの情報をもとにエラー内容と対応策解決策をまとめたいと思います。
はじめに
最近、Pythonの株価取得ライブラリ「yfinance」がエラーを起こしているという報告が多く見られます。
本記事では、X(旧Twitter)上で見つけた解決策・対応例を中心にまとめました。
よくあるエラーのパターン
-
Failed to get ticker -
MaxRetryError -
ConnectionError -
empty DataFrame returned
上記エラーが一般的なこれまでのエラーだったと思いますが、今回は、
-
YFrateLimitError
というエラーが起こりました。
その他にも、日本語フォルダ・パス問題によるSSLエラーもあるので、その辺についても終盤らへんで解説しています。
今回のエラーは主に「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をバージョンアップしても直らないエラーの解決策
例外①YFrateLimitError
今回のようなエラーについては、下記の情報が役に立ちました。
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() を差し替えられます。
yfinanceは学習用・研究用には便利ですが、本格的に自動売買や証券口座と連携させたい場合はAPI活用が必須です。
Pythonから直接株価データや注文情報を扱う方法は、こちらの記事で詳しく解説しています。
Pythonで三菱UFJeスマート証券APIを使った株価自動取得&シストレ売買プログラム入門を始めてみませんか?感情に左右されず冷静な判断で取引できる自動売買システムは、多くの投資家にとって魅力的なツールです。特に嬉しいことに、Pyth[…]
例外②日本語フォルダ・パス問題によるSSLエラー
Python実行環境が日本語フォルダ配下にある場合、yfinance内部で使用しているcurl_cffiやrequestsが証明書パスを正しく解釈できず、SSL: CERTIFICATE_VERIFY_FAILED や FileNotFoundError: cacert.pem not found のようなエラーを吐くケースがあります。
解決策
環境依存のパス問題を防ぐために、共通の証明書設定を自動適用するスクリプトを作成します。
下記コードをプロジェクト直下に env_fix.py として保存。
そして、実行ファイルで最初に以下を呼び出し。
これにより、フォルダ名が日本語でもSSL経路が安定し、curl_cffiモードでの証明書認識エラーが防止されます。
例外③古い環境変数キャッシュによる競合
原因
過去に YFINANCE_USE_CURL=false や独自のSSL設定を環境変数に手動登録していた場合、yfinance が内部的に curl_cffi を正しく選択できず、urllib3モードで失敗することがあります。
解決策
上記 env_fix.py の中で、
として環境変数を明示的に削除しているため、これにより自動的にcurlモードに復帰します。
古い環境をリセットしたい場合は、一度コマンドラインで以下を実行。
Python仮想環境やAnaconda環境でcacert.pemが認識されない
原因
condaやvenv環境ではcertifi.where()が仮想環境専用のパスを返すため、環境を切り替えた際に cacert.pem へのリンクが壊れることがあります。
解決策
上記の env_fix.py は自動でcertifi.where()から正しいパスをコピーするため、仮想環境を変更しても安全に動作します。
どうしても動作しない場合は以下のように直接パスを指定。
まとめ
というわけで、さっと説明していきましたが、分かりづらいなどあるかもしれませんがご容赦ください。
今回のエラーは私的には結構厄介だったため、非常にこの情報には助けられました。
このシェアが皆さんのお役に立てれば幸いです。
技術的な対処で解決できるエラーもありますが、「なんでうまくいかないんだろう」と気持ちが折れそうになったらこちらの記事も参考にしてみてください。
「もう疲れた。全部なくなれば楽になれるのに。」 ――投資で心が壊れる前に知ってほしいやめられない心理。 含み損、損切り、連敗。何をしても裏目に出て、気づけば自分を罰するようなトレードをしている。 FXでも株でも、この「お金がなくなれば[…]

