---
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`
