알파벤티지 sleep(5) 관련 문의
선생님 안녕하세요! 알파벤티지 api 호출 관련 문의드립니다.
강의 내용만 듣고 문의드립니다.(알파벤티지 호출 실행 안해본 상황)
알파벤티지 무료플랜이 분당 5회 제한으로 알고있는데, sleep을 5초로 하는 경우 분당 최대 10~12회 호출이 될것으로 예상이되는데요, sleep을 최소 12 이상으로 설정하는게 맞지 않나 싶어서 문의드립니다.
답변 2
1
안녕하세요, @yundyo님.
전제가 되는 한도 정보가 지금은 바뀌었습니다.
1. "분당 5회"는 옛날 한도입니다.
알파벤티지 무료 플랜은 예전엔 분당 5회 / 일 500회였는데, 그 후 일 100회 → 현재는 일 25회로 바뀌었습니다. 공식 premium 페이지와 support 페이지를 보시면 지금은 25 API requests per day만 명시하고 분당 제한은 표기하지 않습니다. 즉 지금 우리가 신경 써야 할 병목은 분당이 아니라 하루 총 25회입니다. 참고로 우리가 매일 분석하는 최대 종목 개수는 25개이기 때문에 한도 내에서 처리 가능합니다.
2. 그래서 sleep을 12로 늘리면 손해만 봅니다.
분당 제한이 걸려있는 상황이 아니기 때문에 파이프라인만 느려집니다(15종목 × 12초 = 3분). 반대로 하루에 파이프라인을 두 번 돌리면 sleep이 60초여도 25회 한도에 걸립니다. 관리해야 할 건 sleep 간격이 아니라 "하루에 몇 번 돌렸나"입니다. 우리 스케줄러는 하루 1회(21:00 KST)만 실행하고, 실적 캘린더는 별도 키를 쓰기 때문에 25회 안에서 여유 있게 돌아갑니다. 혹시나 향후 알파벤티지 API 정책이 변경된다면 그때 변경하면 될 것 같습니다!
3. 실제로 돌려보실 때 꼭 알아두실 부분
알파벤티지는 한도를 초과해도 에러가 아니라 HTTP 200을 돌려줍니다. 본문만 {"Information": "... our standard API rate limit is 25 requests per day ..."} 로 바뀝니다. 우리 코드는 response.status_code != 200만 체크하므로(stock_recommendation_service.py:513), 한도를 넘기면 feed가 빈 리스트가 되어 전 종목이 "관련 기사 없음"으로 조용히 넘어갑니다.
즉, 로그에 모든 종목이 "관련 기사 없음"으로 찍히면 sleep이 짧아서가 아니라 그날 25회를 다 쓴 것입니다. 테스트하실 때 여러 번 돌리셨다면 이 증상이 나올 수 있으니 참고해주세요~
정리하면 sleep 5는 그대로 두셔도 됩니다. 개선한다면 sleep을 늘리는 방향이 아니라, 응답 JSON에 Information/Note 키가 있는지 검사해서 "한도 초과"를 명시적으로 로그에 남기는 쪽이 실용적입니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
yundyo님, 문의하신 내용처럼 알파벤티지 무료 플랜이 분당 5회 요청 제한이라면 sleep(5)는 충분하지 않습니다.
요청 직후에 sleep(5)를 실행하는 구조라면 대략 다음과 같이 동작합니다.
while True:
response = requests.get(url)
time.sleep(5)
요청 처리 시간이 거의 없다고 가정하면 5초마다 한 번씩 호출되므로 이론적으로는 분당 약 12회 호출될 수 있습니다.
분당 5회 제한을 지키려면 호출 간격을 최소한 다음과 같이 설정하는 것이 맞습니다.
import time
response = requests.get(url)
time.sleep(12)
다만 실제 환경에서는 다음과 같은 이유로 12초를 정확히 사용하는 것보다 여유를 두는 편이 안전합니다.
- 알파벤티지의 요청 제한 계산 방식이 고정된 60초 단위가 아닐 수 있음
- 네트워크 지연 시간과 API 응답 시간을 고려해야 함
- 재시도 로직이 추가되면 예상보다 요청 횟수가 늘어날 수 있음
- 여러 종목이나 여러 지표를 조회하면 각각의 API 호출이 제한 횟수에 포함될 수 있음
따라서 다음처럼 13~15초 정도로 설정하는 것을 권장드립니다.
import time
import requests
for symbol in symbols:
response = requests.get(
"https://www.alphavantage.co/query",
params={
"function": "TIME_SERIES_DAILY",
"symbol": symbol,
"apikey": API_KEY,
},
)
if response.status_code == 200:
data = response.json()
print(symbol, data)
time.sleep(15)
또한 알파벤티지 응답에 "Note" 또는 "Information" 메시지가 포함되는 경우에는 요청 제한에 도달했을 가능성이 있으므로, 해당 응답을 확인하고 잠시 대기하도록 처리하는 것이 좋습니다.
결론적으로 강의 코드에서 sleep(5)를 사용하고 있다면 무료 플랜 기준으로는 부족할 수 있으며, 최소 sleep(12) 이상, 실제 운영에서는 sleep(13~15) 정도로 설정하시는 것이 안전합니다.
섹션2 질문이요
0
9
1
섹션1.9 질문입니다!
0
15
2
Kaggle 노트북(predict.ipynb) 관련
0
24
1
git bash .env
1
25
1
실전 계좌에서 운영하고 계신 분 계신가요?
1
45
2
클로드
1
50
2
pip install -r requirements.txt
0
57
2
명령 프롬프트
0
44
2
slack 알림 연동 강의 관련
1
77
2
supabase_key 관련
1
84
3
python run.py 실행시 에러 문제
1
100
2
커서창
1
67
2
cursor 환경
1
67
2
개발 환경 준비와 프로젝트 구조 강의 관련
1
62
2
저장 공간
1
64
2
colab 코드 실행시 error
1
54
2
llm_decision_logs 저장 실패(실적 컬럼 불일치)를 어떻게 해결할까요?
2
79
4
kaggle notebook에 service key 설정이 누락된 것 같습니다
1
73
2
주말에 실행할 경우 update_economic_data_in_background에 로직 변경 필요성
1
61
1
프로그램 실행시간에 대한 질문
1
63
2
비중 및 매수 종목수 조정.
1
66
2
Claude api가 소식 동기화가 늦는 문제
1
78
2
슬롯 관련 문의
1
56
2
실제 계좌 잔고 및 테스트중에
1
113
4





