--- name: behive-watchlist description: 비하이브투자자문 유튜브 '종목분석' 영상에서 추출·저장한 목표가/매입가/손절가/요약 워치리스트 + 수동 추가·삭제 + 장중 15분 간격 시세 모니터링(buy/target/stop 트리거 → 레이 텔레그램). "OO 목표가 얼마야?", "삼성전자 워치리스트 추가해줘(매입 7만, 목표 8.5만)", "라온로보틱스 지워줘" 같은 요청에 사용. --- # behive-watchlist 비하이브투자자문 채널의 '종목분석' 영상이 새로 올라올 때마다(cron: 평일 07/12/18시), 관리자님 이메일로 요약 리포트가 발송되고 동시에 `state/behive_watchlist.json`에 종목별 구조화 데이터가 축적된다. 관리자님이 **수동으로 직접 추가**한 종목(`source: manual`)도 같은 파일에서 관리된다. 워치리스트 종목은 **평일 장중 15분 간격**으로 `watchlist_monitor.py`가 키움 현재가와 비교해 `buy`(매입가 근접)·`target`(목표가 도달)·`stop`(손절가 이탈) 트리거를 감지한다. 조건별 하루 1회 알림이며, 한 실행에서 걸린 항목을 **텔레그램에는 요약만 묶어서**, 상세 내용은 **이메일 한 통으로 묶어서** 발송한다. LLM 판단은 거치지 않고 순수 파이썬으로 동작. ## 언제 쓰는가 관리자님이 **워치리스트 조회/추가/삭제**를 요청할 때. 예시: - "비하이브에서 분석한 종목 뭐 있어?" → `list` - "삼미금속 목표가 얼마야?" → `show 삼미금속` - "펨트론 비하이브 분석 내용 보여줘" → `show 펨트론` - "삼성전자 매수 7만, 목표 8.5만, 손절 6.5만으로 워치리스트 추가" → `add` - "라온로보틱스 워치리스트에서 지워줘" → `remove 라온로보틱스` **주의**: 보유 중인 종목 현황은 `kiwoom-rest` 스킬로 조회(`kt00018`). 실시간 시세도 키움 `ka10001`(`kiwoom_client.py quote`) 사용. 이 스킬은 **관심종목 관리**만 담당. ## Commands 스크립트: `/Users/snowoyh/.openclaw/agents/stock/workspace/scripts/behive_youtube_digest.py` ```bash # 전체 종목 테이블 (종목명, 목표가, 상승률, 매입가, 저장일) python3 scripts/behive_youtube_digest.py list # 특정 종목 상세 (목표가/매입가/손절가/현재가/주요내용/기타/출처) # 현재가는 키움 ka10001에서 실시간 조회되어 자동 포함됨. python3 scripts/behive_youtube_digest.py show 삼미금속 # 종목명 일부만 적어도 부분일치 자동 매칭 (1건 매칭 시) python3 scripts/behive_youtube_digest.py show 펨 # → 펨트론 # 수동 추가 (관리자님이 "OO 워치리스트 추가"라고 할 때) # --code 생략 시 키움 ka10099 캐시로 종목명→코드 자동 매핑 (최초 1회 갱신) python3 scripts/behive_youtube_digest.py add 삼성전자 \\ --buy 70000 --target 85000-90000 --stop 65000 \\ --note "반도체 슈퍼사이클 초입" # target은 단일값("85000") 또는 범위("85000-90000") 둘 다 가능. # 워치리스트에서 제거 (관리자님이 "OO 지워줘"라고 할 때) python3 scripts/behive_youtube_digest.py remove 삼미금속 ``` ### 시세 감시 (수동 실행용) ```bash # 1회 감시 — 장외 시간이면 즉시 스킵 python3 scripts/watchlist_monitor.py check # 강제 실행 (장외·주말 포함) python3 scripts/watchlist_monitor.py check --force # 조건 평가만 — 텔레그램 발송 없이 결과 프린트 python3 scripts/watchlist_monitor.py dry-run ``` ## 답변 가이드 - `show` 출력을 그대로 관리자님께 전달. 불필요한 재포맷 금지. - 저장일시를 확인해서 "며칠 전 분석이에요"라고 맥락 첨부. - `show` 출력에 현재가가 자동 포함됨(키움 ka10001). 조회 실패 시 "현재가: 조회 불가"로 표기. - 관리자님이 "목표가까지 몇 %" 같은 계산을 추가로 원하면 `show`의 현재가와 목표가로 한 줄 계산해서 덧붙임. - 관리자님이 보유 종목인지 궁금해하면 `kiwoom-rest` 스킬(`kt00018`)로 현재 보유 종목과 대조해 덧붙임. - 수동 추가 요청 시 **종목코드는 생략**하고 종목명만 받아 `add`에 넘기면 됨 (키움 캐시가 자동 매핑). 매입/목표/손절 중 일부만 있어도 OK — 누락 필드는 해당 트리거가 비활성화될 뿐. ## Watchlist 스키마 (state/behive_watchlist.json) 종목명을 키로 하는 딕셔너리. 같은 종목이 재분석되면 최신 덮어쓰기. 수동 추가는 `video.source = "manual"`. ```json { "삼미금속": { "stock": "삼미금속", "code": "012210", "target": {"raw": "16,000~17,000원", "low": 16000, "high": 17000}, "buy": {"raw": "13,000원대 조정", "primary": 13000, "levels": [13000]}, "stop": {"raw": "12,000원 이탈", "value": 12000}, "upside_pct": 23.1, "summary": ["...", "..."], "notes": ["...", "..."], "video": {"id": "o9NBtRP1R3Y", "title": "...", "url": "...", "published": "..."}, "saved_at": "2026-04-23T07:00:00+09:00" } } ``` ## 트리거 조건 (watchlist_monitor.py) | 조건 | 발동 | 알림 헤더 | |---|---|---| | `buy` | 현재가 ≤ `buy.level × 1.05` (매입가 5% 이내 접근, 다중 레벨이면 가장 높은 1개만) | 텔레그램 `[매수구간 진입]` 요약 + 상세 이메일 | | `target` | 현재가 ≥ `target.low` (목표가 하단 도달) | 텔레그램 `[목표가 도달]` 요약 + 상세 이메일 | | `stop` | 현재가 ≤ `stop.value` (손절가 이탈) | 텔레그램 `[손절가 이탈]` 요약 + 상세 이메일 | - 조건별 **하루 1회** 알림 (종목+조건 단위 중복 방지, 상태는 `state/watchlist_alerts.json`). - 필드가 비어있으면 해당 조건 비활성. - 보유 종목은 `kt00018` 결과 재활용으로 ka10001 호출 절감. ## Files - Script: `scripts/behive_youtube_digest.py` (fetch/save/add/email/notify/list/show/remove) - Monitor: `scripts/watchlist_monitor.py` (check / dry-run, 장외 시간 자동 스킵) - Watchlist: `state/behive_watchlist.json` - Alert dedup: `state/watchlist_alerts.json` - Stock code cache: `state/stock_codes.json` (키움 ka10099, lazy 갱신) - Seen 기록: `state/behive_youtube_seen.json` - Fetch 캐시: `state/behive_last_fetch.json` - Cron: `비하이브 종목분석 요약` / `워치리스트 모니터링` — `cron/jobs.json`