56 lines
1.8 KiB
Python
56 lines
1.8 KiB
Python
import requests
|
|
import os
|
|
import pandas as pd
|
|
from dotenv import load_dotenv
|
|
from datetime import datetime
|
|
import time
|
|
|
|
# .env 파일에서 API 키 로드
|
|
load_dotenv()
|
|
API_KEY = os.getenv("POLYGON_API_KEY")
|
|
|
|
def fetch_all_us_stock_tickers(save_path="all_polygon_tickers.csv", delay_sec=13):
|
|
"""
|
|
Polygon.io에서 모든 US 주식 티커를 가져와 CSV로 저장
|
|
사용자의 요금제에 따라 요청 간 대기 시간 조절 가능
|
|
"""
|
|
base_url = "https://api.polygon.io/v3/reference/tickers"
|
|
params = {
|
|
"market": "stocks",
|
|
"active": "true",
|
|
"limit": 1000,
|
|
"apiKey": API_KEY
|
|
}
|
|
|
|
all_tickers = []
|
|
next_url = base_url
|
|
page = 1
|
|
|
|
while next_url:
|
|
print(f"🔄 요청 중 ({page} 페이지): {next_url}")
|
|
response = requests.get(next_url, params=params if next_url == base_url else {})
|
|
if response.status_code != 200:
|
|
raise Exception(f"요청 실패: {response.status_code} - {response.text}")
|
|
|
|
data = response.json()
|
|
results = data.get("results", [])
|
|
all_tickers.extend(results)
|
|
|
|
next_url = data.get("next_url")
|
|
if next_url and "apiKey" not in next_url:
|
|
next_url += f"&apiKey={API_KEY}"
|
|
|
|
page += 1
|
|
time.sleep(delay_sec) # 요청 간 간격 조정
|
|
|
|
# DataFrame으로 정리 후 저장
|
|
df = pd.DataFrame(all_tickers)
|
|
df.to_csv(save_path, index=False)
|
|
print(f"✅ 총 {len(df)}개 종목 저장 완료 → {save_path}")
|
|
|
|
if __name__ == "__main__":
|
|
print("전체 US 주식 티커를 가져옵니다. 요금제에 따라 요청 간 대기 시간을 조정하세요.")
|
|
delay = input("요청 간 대기 시간 (초) [기본: 13]: ").strip()
|
|
delay_sec = int(delay) if delay else 13
|
|
fetch_all_us_stock_tickers(delay_sec=delay_sec)
|