인사이트

방법론

이 페이지는 공개 저장소에 적힌 데이터 흐름, 상수, DTO 경로만 정리합니다.

데이터 흐름

  • 수집기: `collector`가 원천 데이터를 수집해 Supabase에 저장합니다.
  • 내보내기: `exporter`가 `web/exporters/static_data.py`와 `web/exporters/upcoming_data.py`를 사용해 공개 JSON DTO를 만듭니다.
  • : 브라우저는 published DTO origin의 `etfs / charts / holdings / news / upcoming` JSON만 읽습니다.

생명주기 규칙

  • 상장일 기준: `WINDOW_DAYS`는 `collector/constants.py`에서 60으로 선언되어 있습니다.
  • 반등 졸업 사용 여부: `ENABLE_REBOUND_GRADUATION`는 `collector/constants.py`에서 False로 선언되어 있습니다.
  • 표시 졸업: `collector/etf_lifecycle.py`의 `is_graduated_for_display`는 persisted graduated status만 사용합니다.
  • 표시 사유 코드: `collector/etf_lifecycle.py`의 `resolve_display_reason_code`는 비졸업 행에는 `discovery`를, 졸업 행의 비유효 `reason_code`에는 `legacy_unknown`을 반환합니다.

내보내기 사실

  • etfs.json: `web/exporters/static_data.py`가 `etf_master`에서 `code`, `name`, `listing_date`, `listing_price`, `current_price`, `status`, `graduation_reason_code`를 읽어 생성합니다.
  • upcoming.json: `web/exporters/upcoming_data.py`가 `etf_upcoming`과 listed-master lookup을 사용해 생성합니다.
  • 후보 단계: `web/exporters/upcoming_data.py`는 `candidate` 항목의 `listingDate`를 DTO에서 `null`로 씁니다.
  • 정렬: 상장예정 내보내기는 `filingDate`와 `filingNo`를 기준으로 내림차순 정렬합니다.

구성자산 한계

  • 표시 최소치: `holdings/{code}.json`의 `coverage.minimumItemCount`가 1 이상일 때만 구성자산 목록을 데이터로 표시합니다.
  • 상위 목표치: `coverage.targetTopHoldingCount`는 사용자에게 보여줄 목표 상위 보유종목 수이며, 원천이 항상 10개를 제공한다는 보장은 아닙니다.
  • 결측 상태: `coverage.availability`는 `available / partial / missing / stale` 중 하나이며, 빈 배열을 정상 데이터처럼 해석하지 않습니다.
  • 섹터 비중: `coverage.sectorWeightCoverage`가 `not_collected`이면 웹은 구성종목 이름에서 섹터 비중을 추정하지 않습니다.
  • 운영 알림: 일일 close 수집은 holdings baseline/source-empty advisory issue를 신호 단위로 갱신해 반복 결측을 추적합니다.