Programming

📈 yfinance 429 오류 해결법: Too Many Requests 문제 완전 정복

quantoasis 2025. 5. 10. 14:34
반응형

최근 금융 데이터 수집을 자동화하려는 많은 개발자들이 yfinance를 활용해 Yahoo Finance API에서 데이터를 가져오고 있다. 그러나 2025년 4월 말부터 갑작스럽게 429 Too Many Requests 오류가 빈번하게 발생하고 있다. 본 포스팅에서는 이 오류의 원인 분석부터 해결 방법까지, 실전 코드와 함께 상세히 정리해보겠다.


🛑 문제 현상: 429 오류의 정체는?

❗ 에러 메시지

YFRateLimitError('Too Many Requests. Rate limited. Try after a while.')
  • 위 메시지는 Yahoo Finance API에서 너무 많은 요청이 들어오거나, Python의 requests 모듈을 통한 접근을 제한했을 때 발생한다.
  • 심지어 동일 코드를 웹 브라우저에서는 정상 작동하지만, Python에서는 차단되는 현상도 있다.

🧠 원인 분석: Yahoo의 TLS Fingerprinting

Yahoo는 최근부터 단순히 User-Agent만 변경해서는 우회할 수 없도록, TLS Fingerprinting이라는 고급 보안 방식을 도입했다. 이로 인해 브라우저가 아닌 Python의 requests로 접근 시 서버에서 비정상 요청으로 간주하고 차단하는 것이다.

이제는 단순한 헤더 조작만으로는 부족하다. 브라우저 수준의 TLS 설정을 흉내낼 수 있는 도구가 필요하다.


✅ 해결법: curl_cffi를 이용한 TLS 우회

🔧 필요한 패키지 설치

pip install curl_cffi
pip install --upgrade yfinance

curl_cffi는 브라우저처럼 TLS 요청을 흉내낼 수 있도록 도와주는 Python 라이브러리다.


🧪 실전 코드 예시: 세션 주입 방식

📌 yfinance + curl_cffi 통합 사용

from curl_cffi import requests
import yfinance as yf

# 브라우저(TLS) 환경을 흉내내는 세션 생성
session = requests.Session(impersonate="chrome")

# 세션을 yfinance 객체에 직접 주입
ticker = yf.Ticker("AAPL", session=session)
data = ticker.history(period="1mo")

print(data)
  • impersonate="chrome" 옵션으로 크롬 브라우저처럼 동작
  • session 파라미터를 통해 yfinance가 Yahoo API에 접속할 때 해당 TLS 세션을 사용

✅ 결과

429 오류 없이 정상적으로 가격 데이터 다운로드 성공!


📥 yf.download() 함수에서도 적용 가능

다수의 티커 데이터를 다운로드할 때도 아래와 같이 세션을 활용할 수 있다:

data = yf.download("MSFT AAPL TSLA", session=session, period="1mo")
print(data.head())

🐍 Anaconda 사용자라면?

일부 사용자는 Anaconda 환경에서 curl_cffi가 잘 설치되지 않는 문제를 겪을 수 있다. 이럴 경우에도 pip로 설치가 가능하다:

conda activate your_env_name
pip install curl_cffi

💬 커뮤니티 요약

  • Github 이슈 #2422에서 이 문제에 대해 많은 토론이 있었으며,
  • curl_cffi를 도입한 방식이 현재로서는 가장 효과적인 해결책이다.
  • 향후 yfinance 라이브러리의 업데이트로 내부적으로 curl_cffi가 자동 적용될 수도 있지만, 지금 당장은 수동으로 세션을 주입하는 것이 가장 안정적이다.

🧩 정리

항목 설명
오류명 429 Too Many Requests
원인 Yahoo의 TLS 검열 강화로 Python requests 차단
해결책 curl_cffi 사용하여 브라우저 환경을 흉내냄
적용방법 session=requests.Session(impersonate="chrome")
사용예 yf.Ticker("AAPL", session=session) 혹은 yf.download(..., session=session)

✨ 마무리

Yahoo Finance API는 무료로 접근 가능한 데이터 소스지만, 이제는 브라우저 외부의 접근을 점점 더 제한하고 있다.
단순히 User-Agent만 바꾸는 방식은 더 이상 통하지 않는다.
curl_cffi를 활용한 세션 주입 방식은 현시점에서 가장 확실하고 실용적인 해결책이다.
데이터 수집 자동화를 하고 있다면, 지금 바로 적용해보자.

반응형