fix: 시장 레짐 감지 KIS API 전환 + KOSPI/KOSDAQ 균형 배분
- detect_and_log_market_regime(): DB 조회 → KIS API 직접 호출 (KODEX200 069500) - 1차 KIS API (320일), 2차 DB 폴백 - 이전: DB에 KODEX200 데이터 없으면 UNKNOWN → 레짐 필터 미작동 - naver_finance: limit + kospi_ratio 파라미터 추가 - 기본 KOSPI 60% + KOSDAQ 40% 균형 배분 - 이전: KOSPI만 500개 채워지고 KOSDAQ 0개 되는 문제 해결 - batch_daily_analysis: 네이버 파이낸스 직접 호출로 변경 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -80,22 +80,27 @@ async def _fetch_page(client: httpx.AsyncClient, sosok: int, page: int) -> List[
|
||||
async def get_naver_stock_list(
|
||||
max_pages_per_market: int = 10,
|
||||
min_price: int = _MIN_PRICE,
|
||||
limit: int = 0,
|
||||
kospi_ratio: float = 0.6,
|
||||
) -> List[Tuple[str, str]]:
|
||||
"""KOSPI + KOSDAQ 시가총액 순위 종목 조회.
|
||||
|
||||
Args:
|
||||
max_pages_per_market: 시장별 최대 페이지 수 (페이지당 ~50종목)
|
||||
min_price: 최소 현재가 필터 (기본 5,000원)
|
||||
limit: 최종 반환 종목 수 제한 (0=제한 없음)
|
||||
kospi_ratio: limit 적용 시 KOSPI 비율 (기본 0.6 = 60%)
|
||||
|
||||
Returns:
|
||||
[(종목코드, 종목명), ...] — ETF/레버리지/스팩 제외, 가격 필터 적용
|
||||
"""
|
||||
stocks: List[Tuple[str, str]] = []
|
||||
seen_codes: set = set()
|
||||
kospi_stocks: List[Tuple[str, str]] = []
|
||||
kosdaq_stocks: List[Tuple[str, str]] = []
|
||||
|
||||
async with httpx.AsyncClient() as client:
|
||||
for sosok, market_name in ((0, "KOSPI"), (1, "KOSDAQ")):
|
||||
market_stocks = []
|
||||
market_stocks: List[Tuple[str, str]] = []
|
||||
for page in range(1, max_pages_per_market + 1):
|
||||
rows = await _fetch_page(client, sosok, page)
|
||||
if not rows:
|
||||
@@ -115,7 +120,29 @@ async def get_naver_stock_list(
|
||||
await asyncio.sleep(0.3) # 서버 부하 방지
|
||||
|
||||
logger.info("네이버 %s: %d개 종목 수집", market_name, len(market_stocks))
|
||||
stocks.extend(market_stocks)
|
||||
if sosok == 0:
|
||||
kospi_stocks = market_stocks
|
||||
else:
|
||||
kosdaq_stocks = market_stocks
|
||||
|
||||
# limit가 있으면 KOSPI/KOSDAQ 균형 배분
|
||||
if limit > 0:
|
||||
kospi_limit = int(limit * kospi_ratio)
|
||||
kosdaq_limit = limit - kospi_limit
|
||||
# 한쪽이 부족하면 다른 쪽에서 채움
|
||||
if len(kospi_stocks) < kospi_limit:
|
||||
kosdaq_limit += kospi_limit - len(kospi_stocks)
|
||||
kospi_limit = len(kospi_stocks)
|
||||
elif len(kosdaq_stocks) < kosdaq_limit:
|
||||
kospi_limit += kosdaq_limit - len(kosdaq_stocks)
|
||||
kosdaq_limit = len(kosdaq_stocks)
|
||||
stocks = kospi_stocks[:kospi_limit] + kosdaq_stocks[:kosdaq_limit]
|
||||
logger.info(
|
||||
"네이버 파이낸스 총 %d개 종목 (KOSPI %d + KOSDAQ %d)",
|
||||
len(stocks), min(len(kospi_stocks), kospi_limit), min(len(kosdaq_stocks), kosdaq_limit),
|
||||
)
|
||||
else:
|
||||
stocks = kospi_stocks + kosdaq_stocks
|
||||
logger.info("네이버 파이낸스 총 %d개 종목 수집", len(stocks))
|
||||
|
||||
logger.info("네이버 파이낸스 총 %d개 종목 수집", len(stocks))
|
||||
return stocks
|
||||
|
||||
Reference in New Issue
Block a user