diff --git a/docs/superpowers/specs/2026-05-15-confidence-signal-pipeline-v2-architecture.md b/docs/superpowers/specs/2026-05-15-confidence-signal-pipeline-v2-architecture.md index 806c3f8..3bf2d9b 100644 --- a/docs/superpowers/specs/2026-05-15-confidence-signal-pipeline-v2-architecture.md +++ b/docs/superpowers/specs/2026-05-15-confidence-signal-pipeline-v2-architecture.md @@ -3,6 +3,7 @@ **작성일**: 2026-05-15 **작성자**: gahusb **상태**: Approved for implementation (Phase 0 = architecture decisions, 코드 변경 없음) +**Amended 2026-05-15**: Chronos-2 채택 (LSTM 폐기) + Qwen3 14B 채택 (Claude Haiku 폐기). 모델 결정 11개 보정. **선행 컨텍스트**: - adversarial review (2026-05-13) — 신호 검증 인프라 필요성 - Stock Screener V1 (post-close 16:30 Top-N) — 가치 발굴 완성 @@ -17,24 +18,30 @@ V1 screener는 종가 기반 일별 Top-N 만 산출. V2는: - **가치 발굴 (stock-lab 종가 기반)** × -- **시점 분석 (web-ai 장중 LSTM + 분봉)** × -- **2차 검증 (agent-office Claude)** × +- **시점 분석 (web-ai 장중 Chronos-2 + 분봉)** × +- **2차 검증 (agent-office → web-ai Qwen3 14B Ollama)** × - **이중 텔레그램 (본인 = 기술 풀 / 아내 = 간소화)** = **확신의 신호** +**역할 분리 — 두 AI 모델**: +- **Chronos-2** (Amazon, 120M params, FP16 ~1GB) = 시계열 예측 엔진 (수치 → quantile 분포) +- **Qwen3 14B Q4** (Ollama, ~8.3GB) = 분석가/개발자 보조 두뇌 (자연어 메시지 + 전략 해석 + 코드 자동화) + --- ## 2. Phase 0 산출물 **본 spec 1 문서**. 코드 변경 0. 후속 Phase 1-7 의 모든 구현이 본 spec 의 결정을 따른다. -핵심 결정 6개: +핵심 결정 8개 (amend 시점): 1. 데이터 채널 — `web-ai pull from stock-lab` (web-ai 가 polling) 2. 데이터 소스 — KIS API 직접 (web-ai) + stock-lab API (settings/screener/portfolio) -3. Claude 2차 검증 — context augmentation (메시지 직접 작성 + 양방향 게이트) -4. 트리거 — 매수 (screener Top-20) + 매도 (portfolio 보유). 관심종목은 백로그 -5. 이중 텔레그램 — 본인 풀버전 + 아내 간소화. Claude 가 단일 콜에서 양쪽 생성 -6. 운영 — 시간대별 폴링 주기 (장전 5분 / 장중 1분 / 장후 5분 / 야간 1회) +3. **시점 예측 모델 — Chronos-2 (Amazon, 120M, zero-shot, quantile 분포)** +4. **2차 검증 모델 — Qwen3 14B Q4 (Ollama on web-ai, ~8.3GB, 응답 ~13초)** +5. 2차 검증 방식 — context augmentation (메시지 직접 작성 + 양방향 게이트) +6. 트리거 — 매수 (screener Top-20) + 매도 (portfolio 보유). 관심종목은 백로그 +7. 이중 텔레그램 — 본인 풀버전 + 아내 간소화. LLM 단일 콜에서 양쪽 생성 +8. 운영 — 시간대별 폴링 주기 (장전 5분 / 장중 1분 / 장후 5분 / 야간 없음 — Chronos-2 zero-shot) --- @@ -52,10 +59,11 @@ V1 screener는 종가 기반 일별 Top-N 만 산출. V2는: │ │ • /news-sentiment (옵션) │ │ │ │ ② KIS Client │ │ │ └────────────────────────────────┘ │ │ │ (WebSocket 분봉/호가) │ │ │ │ │ │ │ │ -│ ┌────────────────────────────────┐ │ │ │ ③ LSTM Predictor │ │ -│ │ agent-office :18900 │◄─┼──────┼──┤ (GPU, 60일 → 1일 예측) │ │ -│ │ • /signal (Claude 2차 검증) │ │ HTTP │ │ │ │ -│ │ • Telegram dispatcher (이중) │ │ push │ │ ④ Timing Analyzer │ │ +│ ┌────────────────────────────────┐ │ │ │ ③ Chronos-2 Predictor │ │ +│ │ agent-office :18900 │◄─┼──────┼──┤ (Chronos-2 120M zero-shot)│ │ +│ │ • /signal (Ollama 라우팅) │ │ HTTP │ │ 60일 → quantile 분포 │ │ +│ │ • Telegram dispatcher (이중) │ │ push │ │ │ │ +│ │ → web-ai Ollama HTTP 호출 │ │ │ │ ④ Timing Analyzer │ │ │ └─────────┬──────────────────────┘ │ trig │ │ (분봉 모멘텀) │ │ │ │ │ │ │ │ │ └────────────┼──────────────────────────┘ │ │ ⑤ Signal Generator │ │ @@ -70,17 +78,23 @@ V1 screener는 종가 기반 일별 Top-N 만 산출. V2는: **책임 분리**: - **stock-lab**: 가치 발굴 (8 노드 + 위생 게이트 + ATR), 사용자 설정 저장, portfolio 단일 진실원 -- **web-ai**: 시점 분석 (LSTM + 분봉), 시그널 생성, rate limit -- **agent-office**: 신호 2차 검증, 메시지 작성, 텔레그램 라우팅 +- **web-ai**: 시점 분석 (Chronos-2 + 분봉), 시그널 생성, rate limit, **Ollama LLM 호스팅 (Qwen3 14B Q4)** +- **agent-office**: 신호 라우팅 (web-ai Ollama HTTP 호출), 텔레그램 발송 (본인 + 아내) - **web-ui**: stock-lab settings 편집 (캔버스 UI). 신호 수신/표시는 V2 NOT. +**VRAM 분배 (RTX 5070 Ti 16GB, usable 15.5GB)**: +- Chronos-2: ~1GB +- Qwen3 14B Q4: ~8.3GB +- 합: ~9.3GB +- 여유: ~6GB (안전 마진) + --- ## 4. 데이터 소스 분담 | 데이터 | 출처 | 갱신 주기 | 저장소 | |--------|------|----------|-------| -| KRX 일봉 60일 (LSTM 학습) | KIS API (web-ai 직접) | 시작 시 + 종가 후 갱신 | web-ai 로컬 | +| KRX 일봉 60일 (Chronos-2 입력) | KIS API (web-ai 직접) | 시작 시 + 종가 후 갱신 | web-ai 로컬 | | 정규장 분봉/실시간 호가 | KIS API WebSocket (web-ai 직접) | 실시간 | web-ai 메모리 | | NXT 가격 스냅샷 (장전/장후) | KIS API + 네이버 모바일 백업 | 30초~1분 폴링 | web-ai 로컬 | | screener settings (가중치) | stock-lab API (web-ai pull) | 1-5분 | NAS `stock.db` | @@ -151,13 +165,13 @@ Response (agent-office → web-ai): } ``` -### 5.3 Claude 응답 (agent-office 내부) +### 5.3 web-ai Ollama 응답 (agent-office → Ollama HTTP) -agent-office 가 Claude 에게 보내는 prompt 의 응답 schema: +agent-office 가 web-ai 의 Ollama (Qwen3 14B Q4) 에 보내는 prompt 의 응답 schema: ```json { "decision": "send" | "hold", - "confidence_claude": 0.91, + "confidence_llm": 0.91, "reason": "외인+거래량+호재 일관성 강함", "warnings": ["KOSPI 약세 가능성"], "message_self": "🔔 매수 신호: 삼성전자 (005930)\n💡 신뢰도 ...", @@ -165,7 +179,13 @@ agent-office 가 Claude 에게 보내는 prompt 의 응답 schema: } ``` -`final_confidence = confidence_webai × confidence_claude`. 임계값 (default 0.7) 미만 또는 `decision="hold"` 면 silent (텔레그램 발송 안 함). +`final_confidence = confidence_webai × confidence_llm`. 임계값 (default 0.7) 미만 또는 `decision="hold"` 면 silent (텔레그램 발송 안 함). + +**프롬프트 엔지니어링 (Qwen3 14B JSON 강제)** — ai_news 슬라이스의 Claude JSON 강제 패턴 적용: +- system: "너는 한국 주식 분석가다. JSON 객체 하나만 반환한다." +- assistant prefill `"{"` 로 응답 시작 강제 +- temperature=0 +- 응답 파싱 실패 시 `decision="hold"` 폴백 (silent block) --- @@ -174,7 +194,7 @@ agent-office 가 Claude 에게 보내는 prompt 의 응답 schema: ### 6.1 매수 신호 (screener Top-20 종목 대상) 조건 (전부 충족): -1. LSTM 1-day 예측 > 0% 그리고 LSTM conf > 0.7 +1. Chronos-2 1-day quantile (median) 예측 > 0% 그리고 분포 폭 (90-10 분위수 / 50 분위수) < 0.6 (좁은 분포 = 높은 conf) 2. 분봉 모멘텀 = `strong_up`: - 5분봉 5개 연속 양봉 - 거래량 > 평균 1.5배 @@ -182,9 +202,9 @@ agent-office 가 Claude 에게 보내는 prompt 의 응답 schema: 종합 confidence: ``` -confidence_webai = LSTM_conf × 0.5 + minute_score × 0.3 + screener_norm × 0.2 +confidence_webai = chronos_conf × 0.5 + minute_score × 0.3 + screener_norm × 0.2 ``` -- `LSTM_conf` ∈ [0, 1] +- `chronos_conf` ∈ [0, 1] — Chronos-2 분포 폭에서 변환 (좁을수록 1에 가까움) - `minute_score` ∈ [0, 1] (5분봉 강도 + 거래량 multiplier 정규화) - `screener_norm` = 1 - (rank - 1) / 20 (rank 1 = 1.0, rank 20 = 0.05) @@ -193,7 +213,7 @@ confidence_webai = LSTM_conf × 0.5 + minute_score × 0.3 + screener_norm × 0.2 ### 6.2 매도 신호 (portfolio 보유 종목 대상) **손절선** (사용자 조정 가능, default -7%): -- `pnl_pct < -0.07` 시 즉시 매도 시그널 (LSTM/분봉 무관) +- `pnl_pct < -0.07` 시 즉시 매도 시그널 (Chronos-2/분봉 무관) - 메시지: "손절선 도달, 매도 검토" **익절선** (default +15%): @@ -201,7 +221,7 @@ confidence_webai = LSTM_conf × 0.5 + minute_score × 0.3 + screener_norm × 0.2 - 메시지: "익절선 도달, 부분 매도 또는 추세 추종 검토" **이상 신호** (보유 중 급격한 약세): -- LSTM 1-day 예측 < -1% + LSTM conf > 0.7 +- Chronos-2 1-day quantile (median) 예측 < -1% + 분포 폭 좁음 (chronos_conf > 0.7) - 분봉 모멘텀 = `strong_down` - KIS 호가 매도세 ≥ 60% - `confidence_webai > 0.7` 동일 임계값으로 전송 @@ -220,10 +240,10 @@ confidence_webai = LSTM_conf × 0.5 + minute_score × 0.3 + screener_norm × 0.2 ``` 🔔 매수 신호: 삼성전자 (005930) -💡 신뢰도 87/100 (web-ai 82 × Claude 91) +💡 신뢰도 87/100 (web-ai 82 × Qwen3 91) 📊 분석 근거: -• LSTM 예측: 다음날 +2.3% (conf 0.82) +• Chronos-2 예측: 다음날 +2.3% (분포 폭 좁음, conf 0.82) • Screener Top-3: 외인+거래량 강세 • AI 뉴스: +6.2 (HBM 양산 가시화) • 분봉 모멘텀: 강세 (5분봉 5연속 양봉) @@ -259,7 +279,7 @@ confidence_webai = LSTM_conf × 0.5 + minute_score × 0.3 + screener_norm × 0.2 📊 사유: • 평단 대비 -7.2% (손절선 도달) -• LSTM 다음날 -1.5% 예측 (conf 0.75) +• Chronos-2 다음날 -1.5% 예측 (conf 0.75) • 분봉 강한 매도세 매도 검토 권고. 평단 152,000원 → 현재 141,100원 @@ -276,16 +296,18 @@ confidence_webai = LSTM_conf × 0.5 + minute_score × 0.3 + screener_norm × 0.2 ## 8. 운영 모드 -| 시간대 | web-ai 동작 | 폴링 주기 | LLM 비용 (예상) | -|--------|------------|----------|----------------| -| **장전 (07:00-09:00)** | settings + screener pull + NXT 가격 + sentiment | 5분 | 0 (LLM 안 호출) | -| **장중 (09:00-15:30)** | KIS 분봉 + 호가 + LSTM 추론 + 시그널 생성 | 1분 | 신호 발생 시만 | -| **장후 (15:30-20:00)** | NXT 가격 + 보유 종목 PnL 추적 + 손절/익절 알림 | 5분 | 신호 발생 시만 | -| **야간 (20:00-07:00)** | LSTM 모델 일별 재학습 (1회 GPU full pass) | 1회 | 0 | +| 시간대 | web-ai 동작 | 폴링 주기 | 비용 | +|--------|------------|----------|------| +| **장전 (07:00-09:00)** | settings + screener pull + NXT 가격 + sentiment | 5분 | 0 | +| **장중 (09:00-15:30)** | KIS 분봉 + 호가 + Chronos-2 추론 + 시그널 + Qwen3 검증 | 1분 | 0 (LLM 로컬) | +| **장후 (15:30-20:00)** | NXT 가격 + 보유 종목 PnL 추적 + 손절/익절 알림 | 5분 | 0 | +| **야간 (20:00-07:00)** | (재학습 cron 없음 — Chronos-2 zero-shot) | — | 0 | -**예상 일 LLM 비용** (agent-office Claude 2차 검증): -- 일 신호 발생 ~10건 가정 × ₩150/콜 = **~₩1,500/일**, 월 ~₩45,000 -- LSTM 추론은 GPU 로컬, 비용 0 +**예상 LLM 비용**: +- **월 LLM API 비용 = 0** (Qwen3 14B Q4 로컬 호스팅) +- 전기료만 (Windows PC 상시 가동, RTX 5070 Ti 평균 idle ~30W + 추론 spike ~200W) +- 일 신호 3-5건 × ~13초 추론 = 일 GPU full load ~1분 정도, 무시 가능 +- **Chronos-2 추론은 GPU 로컬, 비용 0** --- @@ -303,21 +325,25 @@ Phase 2: web-ai Pull Worker + Signal API Client (2주) - 시간대별 폴링 스케줄러 - rate limit DB -Phase 3: KIS WebSocket + 분봉 + LSTM 인프라 (3주) +Phase 3: KIS WebSocket + 분봉 + Chronos-2 추론 (2주, ↓ 1주) - KIS WebSocket client (정규장 분봉 + 호가) - NXT 폴링 client (스냅샷 + 네이버 백업) - - LSTM 학습 파이프라인 야간 재학습 + - Chronos-2 zero-shot 추론 파이프라인 (HuggingFace 모델 로드 + 배치 추론) - 분봉 모멘텀 분류기 + - (재학습 인프라 X — Chronos-2 zero-shot) Phase 4: Signal Generator (1주) - - 매수 룰 (LSTM + 분봉 + 호가 + screener) + - 매수 룰 (Chronos-2 quantile + 분봉 + 호가 + screener) - 매도 룰 (손절/익절/이상) - confidence 계산 + 임계값 -Phase 5: agent-office /signal endpoint + Claude 검증 + 이중 텔레그램 (1-2주) - - POST /signal 라우터 - - Claude prompt (system + user + assistant prefill JSON) +Phase 5: agent-office /signal + Ollama Qwen3 검증 + 이중 텔레그램 (2주) + - POST /signal 라우터 (agent-office) + - web-ai 에 Ollama 서버 + Qwen3 14B Q4 설치 + - agent-office → web-ai Ollama HTTP client (Anthropic SDK 대체) + - Qwen3 prompt (system + user + assistant prefill JSON) - 본인/아내 dispatcher + - **A/B 테스트 1주 — 본인 chat 에 Qwen3/Claude Haiku 메시지 동시 발송 후 한 쪽 채택** Phase 6: web-ai 기존 trading bot 정리 (1주) - 자체 watchlist_manager 삭제 @@ -340,11 +366,14 @@ Phase 7: 운영 모니터링 + 4주 IC 검증 (1주 + 4주) 미래 슬라이스로 분리: - **관심종목 (watchlist) 모니터링** — Top-N + portfolio 외, 사용자 관심종목의 변동성 spike / 거래량 급증 알람 - **자동 매매 (KIS 실주문)** — Phase 8 검토. 4주 신호 hit-rate ≥ 60% 후 단계적 -- **DART 공시 통합** — Claude 검증 컨텍스트에 공시 추가 +- **DART 공시 통합** — LLM 검증 컨텍스트에 공시 추가 - **백테스트 화면** — 과거 신호 정확도 시각화 - **신호 hit-rate 대시보드** — web-ui 신규 페이지 - **분할 매수/매도 전략 추천** — Phase 7 이후 - **옵션/선물/해외 주식** — V3 검토 +- **Qwen3 14B "개발자 보조" 별도 endpoint** — 전략 해석/코드 자동화/디버그 도구. V2 흐름 외 사용자 챗봇 형태 (텔레그램 또는 web-ui chat). 같은 Ollama 인스턴스 재활용 +- **Claude API 폴백** — web-ai/Ollama 장애 시 anthropic 으로 자동 전환 (가용성 보강) +- **Kimi K2.6 API 옵션** — Qwen3 응답 품질 부족 시 ~80% 저비용 외부 API 대안 --- @@ -352,15 +381,17 @@ Phase 7: 운영 모니터링 + 4주 IC 검증 (1주 + 4주) | 위험 | 완화 | |------|------| -| Windows PC 다운 시 신호 zero | stock-lab은 정상. web-ai down 시 헬스체크 → 텔레그램 운영자 알림 | +| Windows PC 다운 시 신호 zero | stock-lab은 정상. web-ai down 시 헬스체크 → 텔레그램 운영자 알림. Ollama도 함께 다운 (같은 머신) → Claude API 폴백은 백로그 | | KIS API 장애 | NXT는 네이버 모바일 API 폴백. 분봉은 단기 재시도 + 일정 시간 후 alert | -| Claude 비용 폭증 | rate limit + 일일 spend cap (예: ₩5,000). 임계값 미만 silent block | +| **Qwen3 14B 한국어 메시지 품질 부족** | **Phase 5 A/B 테스트 1주 — Qwen3 vs Claude Haiku 메시지 동시 발송 후 우월한 쪽 채택. Qwen3 부족 시 Claude Haiku 로 폴백** | | False positive 다수 | 4주 IC + Phase 7 모니터링. 임계값 점진 상향 | -| LSTM drift | 야간 재학습 + 주간 ablation 비교 (이전 1주 모델 vs 신규) | -| 메시지 본인-아내 drift | Claude 단일 콜에서 양쪽 동시 생성 (drift 회피, 같은 reasoning) | -| 매도 신호 지연 | 분봉 1분 폴링. 손절선은 보유 종목 단순 비교 (LSTM 무관 즉시 트리거) | +| Chronos-2 분포 drift | 주간 ablation (forward return correlation 추적). drift 시 다른 foundation 모델 (Moirai-2.0) 으로 교체 검토 | +| 메시지 본인-아내 drift | LLM 단일 콜에서 양쪽 동시 생성 (drift 회피, 같은 reasoning) | +| 매도 신호 지연 | 분봉 1분 폴링. 손절선은 보유 종목 단순 비교 (Chronos-2 무관 즉시 트리거) | | stock-lab API 응답 지연 | web-ai 측 timeout 10s + 캐시 (마지막 성공 응답 ttl 5분) | | 종목 갱신 race condition | screener Top-20 변동 시 rate limit 키 = (ticker, action, date) | +| **Qwen3 응답 13초로 분봉 1분 안에 한 사이클 끝낼 수 없을 위험** | 신호 발생 빈도 일 3-5건이라 동시 처리 거의 없음. 큐 직렬 처리로 충분. 대량 신호 시 backpressure → Phase 7 모니터링 | +| **VRAM 빡빡 (Chronos-2 + Qwen3 = 9.3GB / 15.5GB)** | 여유 6GB 안전. 동시 로딩 시점 분리 (Chronos-2 추론 → 결과 메모리 보관 → Qwen3 호출). swap 발생 시 Phase 7 에서 Qwen3 8B 로 다운그레이드 검토 | --- @@ -378,11 +409,12 @@ Phase 7: 운영 모니터링 + 4주 IC 검증 (1주 + 4주) ## 13. 완료 조건 (Phase 0 DoD) 본 spec 완료 = 다음 조건 모두 충족: -- [ ] 사용자가 spec 검토 + 승인 -- [ ] git commit (`docs/superpowers/specs/2026-05-15-confidence-signal-pipeline-v2-architecture.md`) -- [ ] 6 핵심 결정 모두 명시적 (데이터 채널, 데이터 소스, Claude 검증, 트리거, 텔레그램, 운영) -- [ ] 4개 API 계약 (3 stock-lab pull + 1 agent-office push) 모두 schema 정의 -- [ ] Phase 1-7 분해 + 각 Phase 추정 기간 -- [ ] backlog + 위험/완화 매트릭스 + NOT 범위 +- [x] 사용자가 spec 검토 + 승인 (2026-05-15) +- [x] git commit (`docs/superpowers/specs/2026-05-15-confidence-signal-pipeline-v2-architecture.md`) +- [x] 8 핵심 결정 명시적 (데이터 채널, 데이터 소스, Chronos-2 예측, Qwen3 검증, context augmentation, 매수+매도, 이중 텔레그램, 운영 모드) +- [x] 4개 API 계약 (3 stock-lab pull + 1 agent-office push) 모두 schema 정의 +- [x] Phase 1-7 분해 + 각 Phase 추정 기간 (Phase 3 -1주, Phase 5 +0주 → 총 10-11주) +- [x] backlog + 위험/완화 매트릭스 + NOT 범위 +- [x] **Amend (2026-05-15): Chronos-2 + Qwen3 14B Q4 채택 + 11 보정** Phase 0 자체에는 코드 변경 0. 본 spec 승인 후 Phase 1 brainstorming 으로 자연스럽게 이어진다.