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

最近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の情報を拝見してみましょう。

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

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

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

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

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

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

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

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

例外①YFrateLimitError

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

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

解決策→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[…]

初心者でも分かる!PythonとeスマートAPIで始めるシステムトレード入門

例外②日本語フォルダ・パス問題によるSSLエラー

Python実行環境が日本語フォルダ配下にある場合、yfinance内部で使用しているcurl_cffirequestsが証明書パスを正しく解釈できず、SSL: CERTIFICATE_VERIFY_FAILEDFileNotFoundError: cacert.pem not found のようなエラーを吐くケースがあります。

解決策

環境依存のパス問題を防ぐために、共通の証明書設定を自動適用するスクリプトを作成します。
下記コードをプロジェクト直下に env_fix.py として保存。

"""
env_fix.py
安全にSSL証明書を指定し、yfinanceのcurlエラーを防ぐための共通スクリプト
"""

import os
import certifi

def apply_cert_patch(verbose: bool = True):
    """
    日本語フォルダ環境でもcurl_cffiが証明書を正しく認識できるように設定。
    """
    cert_path = r"C:\certs\cacert.pem"

    # 確実に存在しているかチェック
    if not os.path.exists(cert_path):
        import shutil
        os.makedirs(os.path.dirname(cert_path), exist_ok=True)
        shutil.copy(certifi.where(), cert_path)
        if verbose:
            print(f"証明書ファイルを自動作成しました → {cert_path}")

    # 環境変数を設定
    os.environ["REQUESTS_CA_BUNDLE"] = cert_path
    os.environ["SSL_CERT_FILE"] = cert_path
    os.environ.pop("YFINANCE_USE_CURL", None)

    if verbose:
        print("SSL証明書設定を適用しました:")
        print("REQUESTS_CA_BUNDLE =", os.environ["REQUESTS_CA_BUNDLE"])
        print("SSL_CERT_FILE      =", os.environ["SSL_CERT_FILE"])
        print("YFINANCE_USE_CURL  =", os.environ.get("YFINANCE_USE_CURL", "Default (curl mode)"))

そして、実行ファイルで最初に以下を呼び出し。

from env_fix import apply_cert_patch
apply_cert_patch()

これにより、フォルダ名が日本語でもSSL経路が安定し、curl_cffiモードでの証明書認識エラーが防止されます。

例外③古い環境変数キャッシュによる競合

原因

過去に YFINANCE_USE_CURL=false や独自のSSL設定を環境変数に手動登録していた場合、yfinance が内部的に curl_cffi を正しく選択できず、urllib3モードで失敗することがあります。

解決策

上記 env_fix.py の中で、

os.environ.pop("YFINANCE_USE_CURL", None)

として環境変数を明示的に削除しているため、これにより自動的にcurlモードに復帰します。
古い環境をリセットしたい場合は、一度コマンドラインで以下を実行。

setx REQUESTS_CA_BUNDLE ""
setx SSL_CERT_FILE ""
setx YFINANCE_USE_CURL ""

Python仮想環境やAnaconda環境でcacert.pemが認識されない

原因

condavenv環境ではcertifi.where()が仮想環境専用のパスを返すため、環境を切り替えた際に cacert.pem へのリンクが壊れることがあります。

解決策

上記の env_fix.py は自動でcertifi.where()から正しいパスをコピーするため、仮想環境を変更しても安全に動作します。
どうしても動作しない場合は以下のように直接パスを指定。

cert_path = certifi.where()
os.environ["REQUESTS_CA_BUNDLE"] = cert_path
os.environ["SSL_CERT_FILE"] = cert_path

まとめ

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

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

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

技術的な対処で解決できるエラーもありますが、「なんでうまくいかないんだろう」と気持ちが折れそうになったらこちらの記事も参考にしてみてください。

関連記事

「もう疲れた。全部なくなれば楽になれるのに。」 ――投資で心が壊れる前に知ってほしいやめられない心理。 含み損、損切り、連敗。何をしても裏目に出て、気づけば自分を罰するようなトレードをしている。 FXでも株でも、この「お金がなくなれば[…]

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