"""Symbol universe grouped by role. Keys are Yahoo Finance tickers. Group names are used by the renderer/prompt to organise the briefing, so keep them stable. """ from __future__ import annotations # group -> {ticker: display name (Korean)} SYMBOL_GROUPS: dict[str, dict[str, str]] = { "indices": { "^GSPC": "S&P 500", "^DJI": "다우존스", "^IXIC": "나스닥 종합", "^RUT": "러셀 2000", "^SOX": "필라델피아 반도체(SOX)", "^VIX": "VIX", }, "futures": { "ES=F": "S&P 500 선물", "NQ=F": "나스닥 100 선물", "YM=F": "다우 선물", }, "rates": { "^IRX": "미 3개월물", "^FVX": "미 5년물", "^TNX": "미 10년물", "^TYX": "미 30년물", }, "fx": { "KRW=X": "달러/원", "DX-Y.NYB": "달러인덱스(DXY)", "JPY=X": "달러/엔", }, "commodities": { "CL=F": "WTI 원유", "GC=F": "금", "HG=F": "구리", "BTC-USD": "비트코인", }, "sectors": { "XLK": "기술(XLK)", "XLF": "금융(XLF)", "XLE": "에너지(XLE)", "XLV": "헬스케어(XLV)", "XLI": "산업재(XLI)", "SMH": "반도체 ETF(SMH)", }, "korea_linked": { "EWY": "MSCI Korea ETF(EWY)", "CPNG": "쿠팡", "KB": "KB금융 ADR", "SHG": "신한지주 ADR", "PKX": "POSCO홀딩스 ADR", "KEP": "한국전력 ADR", "LPL": "LG디스플레이 ADR", "SKM": "SK텔레콤 ADR", }, "semis": { "NVDA": "엔비디아", "TSM": "TSMC", "MU": "마이크론", "AMD": "AMD", "AVGO": "브로드컴", "ASML": "ASML", }, "megacap": { "AAPL": "애플", "MSFT": "마이크로소프트", "GOOGL": "알파벳", "AMZN": "아마존", "META": "메타", "TSLA": "테슬라", }, } # Groups whose "change" is expressed in yield points / index points rather than percent POINT_CHANGE_GROUPS = {"rates"} GROUP_TITLES_KO: dict[str, str] = { "indices": "주요 지수", "futures": "야간 선물", "rates": "미국 국채 금리", "fx": "환율·달러", "commodities": "원자재·크립토", "sectors": "섹터 ETF", "korea_linked": "한국 연관(EWY·ADR)", "semis": "반도체", "megacap": "빅테크", } def all_tickers() -> list[str]: seen: dict[str, None] = {} for grp in SYMBOL_GROUPS.values(): for t in grp: seen.setdefault(t, None) return list(seen) def group_of(ticker: str) -> str | None: for g, members in SYMBOL_GROUPS.items(): if ticker in members: return g return None def display_name(ticker: str) -> str: for members in SYMBOL_GROUPS.values(): if ticker in members: return members[ticker] return ticker