From b00ea25021b0814590e16b012cf1de2aab43a7e4 Mon Sep 17 00:00:00 2001 From: jongjae Date: Fri, 15 May 2026 15:06:27 +0900 Subject: [PATCH] =?UTF-8?q?[2026-05-15]=20CLAUDE.md=20=EC=A0=95=EB=A6=AC?= =?UTF-8?q?=20=E2=80=94=20=EC=98=A4=EB=8A=98=20=EB=B3=80=EA=B2=BD=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B0=98=EC=98=81=20=EB=B0=8F=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=20=ED=95=AD=EB=AA=A9=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- CLAUDE.md | 195 +++++++++++++++++++++++------------------------------- 1 file changed, 84 insertions(+), 111 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 111f8df..83a9f55 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,7 +1,7 @@ # StockBot v3.0 — Claude Code 운영 가이드 -> 최종 수정: 2026-05-15 (권한·evening 추가) -> 인프라: 로컬 개발 → Synology NAS Docker 이전 예정 +> 최종 수정: 2026-05-15 +> 인프라: 로컬 Windows → Synology NAS Docker 이전 예정 > 현재 모드: 모의투자 (KIS_MOCK=true, DRY_RUN=true) --- @@ -14,16 +14,18 @@ | 전략 | 변동성 돌파 (K=0.5) | | 언어 | Python 3.11 | | DB | SQLite (data/stockbot.db) | -| 알림 | Discord Webhook | -| AI | Claude Code headless | -| 코드 관리 | Gitea (NAS) — 수정 후 자동 커밋/push | +| 알림 | Discord Webhook (거래 알림 + 코드 변경 알림 채널 분리) | +| AI | Claude Code headless (`claude -p "/커맨드" --dangerously-skip-permissions`) | +| 코드 관리 | Gitea (NAS) — 파일 수정 후 확인 없이 자동 commit + push | --- -## Claude Code 권한 +## Claude Code 권한 및 자동화 설정 -이 프로젝트 폴더 내 모든 Bash/파일 작업은 사용자가 **영구 승인**한 상태입니다. -권한 확인 없이 자유롭게 실행하세요. (`.claude/settings.json`에 `bypassPermissions` 적용) +- 모든 Bash/파일 작업 **영구 승인** (`.claude/settings.json` `bypassPermissions`) +- 글로벌 설정 `~/.claude/settings.json`에도 `dangerouslySkipPermissions: true` 적용 +- **파일 수정 완료 후 즉시 `git add + commit + push origin master` 자동 실행** (확인 불필요) +- 인코딩: `PYTHONUTF8=1`, `PYTHONIOENCODING=utf-8` 환경변수 설정 --- @@ -36,100 +38,114 @@ --- -## 하루 흐름 +## 하루 자동화 흐름 ``` -08:30 claude_morning → 뉴스/수급/지수 분석 → app/ai/daily_context.json 저장 → Discord 전송 -08:50 유니버스 30종목 확정 + 전일 OHLCV 수집 + 목표가 계산 +07:55 StockBot_Bot → run_bot.ps1 → claude /start-bot → 봇 백그라운드 시작 +08:15 StockBot_Morning → run_morning.ps1 → claude /morning → 뉴스+수급 분석 → daily_context.json +08:30 봇이 daily_context.json 로드 → 유니버스 30종목 확정 09:00 매매 루프 시작 (변동성 돌파 신호 + AI 필터) 14:50 강제 전량 청산 (절대 불변) 15:10 일일 결산 → Discord 전송 -15:30 claude_evening → 결과 분석 + config.py 조정 + reports/ 저장 → Discord 전송 +15:30 StockBot_Evening → run_evening.ps1 → claude /evening → 결과 분석 + 리포트 저장 ``` +### 스케줄러 스크립트 주의사항 (scripts/run_*.ps1) +- 경로: `$PROJECT = Split-Path -Parent $PSScriptRoot` (한글 경로 인코딩 문제 방지) +- Claude 실행: `$CLAUDE = "C:\Users\whdwo\AppData\Roaming\npm\claude.cmd"` (전체 경로 필수) +- 인코딩: `New-Object System.Text.UTF8Encoding $false` + UTF-8 BOM으로 저장 +- 로그: `logs/bot_start.log`, `logs/morning.log`, `logs/evening.log` + --- ## Claude Code 역할 상세 -### 장 전 분석 (08:30) — claude_morning +### 장 전 분석 — `/morning` 슬래시 커맨드 ``` -1. 네이버/다음 금융 뉴스 크롤링 (data/news/ 저장) -2. KIS API 수급/지수 데이터 수집 (data/market/ 저장) -3. 시장 분위기 판단 (강세/중립/약세) -4. 감성 점수 산출 (0~100) -5. 주목 섹터 / 회피 섹터 선정 -6. boosted_tickers / blacklist_tickers 결정 -7. 포지션 사이즈 배율 결정 (0.5~1.5) -8. app/ai/daily_context.json 저장 -9. Discord로 분석 요약 전송 +1. python app/ai/morning.py --print (뉴스 크롤링 + KIS 수급 수집) +2. Claude가 데이터 분석 → 시장 분위기/섹터/boosted_tickers 판단 +3. app/ai/daily_context.json 저장 +4. Discord로 분석 요약 전송 ``` -daily_context.json 형식: -```json -{ - "date": "2026-05-15", - "generated_at": "08:30:00", - "trade_allowed": true, - "market_sentiment": "중립", - "sentiment_score": 62, - "risk_level": "보통", - "hot_sectors": ["반도체", "2차전지"], - "avoid_sectors": ["금융", "건설"], - "boosted_tickers": ["005930", "000660"], - "blacklist_tickers": [], - "position_size_multiplier": 1.0, - "reason": "분석 요약" -} +### 장 후 피드백 — `/evening` 슬래시 커맨드 +``` +1. python app/ai/evening.py --print (오늘 매매 내역 조회) +2. 승률/손익/이상패턴 분석 +3. app/config.py 파라미터 조정 (문제 명확할 때만) +4. reports/daily/날짜.md 저장 +5. 실전 전환 조건 5가지 체크 +6. Discord로 요약 전송 ``` -### 장 후 피드백 (15:30) — claude_evening +### 봇 시작 — `/start-bot` 슬래시 커맨드 ``` -1. data/stockbot.db 오늘 매매 내역 조회 -2. logs/trades.log 오늘 로그 확인 -3. reports/daily/ 최근 30일 리포트 참조 -4. 승률/손익/이상패턴 분석 -5. app/config.py 파라미터 조정 (문제 명확할 때만) -6. reports/daily/날짜.md 저장 -7. 실전 전환 조건 5가지 체크 -8. Discord로 요약 전송 +1. 이미 실행 중인지 확인 (중복 방지) +2. app/main.py를 DETACHED_PROCESS로 백그라운드 시작 +3. Discord "[모의투자] 자동매매 봇 시작" 알림 ``` --- +## Discord 알림 구조 + +| 채널 | 내용 | 발신 | +|------|------|------| +| 거래 알림 | 매수/매도/손절/결산 | `app/monitor/notifier.py` | +| 코드 변경 | 커밋 내용 + Push 완료 여부 | `.claude/discord_notify.py` (Stop 훅) | + +- 코드 변경 알림: **커밋이 있을 때만** 발송 (스케줄러 태스크 등 노이즈 없음) +- Discord 요청 시 반드시 `User-Agent: DiscordBot (stockbot, 1.0)` 헤더 포함 (Cloudflare 차단 방지) + +--- + ## 파일 구조 ``` stockbot_v3/ -├── CLAUDE.md ← 이 파일 +├── CLAUDE.md ├── .env ← API 키 (Git 절대 제외) +├── .claude/ +│ ├── settings.json ← 권한·훅·환경변수 설정 +│ ├── discord_notify.py ← Stop 훅: 코드 변경 Discord 전송 +│ └── session_start_sha.txt ← 세션 시작 시 HEAD SHA 저장 ├── app/ -│ ├── main.py ← 메인 매매 루프 +│ ├── main.py ← 메인 매매 루프 (승인 필요) │ ├── config.py ← 전략 파라미터 (수정 가능) │ ├── ai/ -│ │ └── daily_context.json ← 장 전 AI 분석 결과 (매일 갱신) +│ │ ├── morning.py ← 장 전 데이터 수집 +│ │ ├── evening.py ← 장 후 데이터 수집 +│ │ └── daily_context.json ← 매일 갱신 │ ├── strategy/ │ │ └── volatility_breakout.py ← 전략 로직 (수정 가능) │ ├── execution/ -│ │ ├── kis_client.py ← KIS API 래퍼 -│ │ └── order_executor.py ← 주문 실행 +│ │ ├── kis_client.py ← KIS API 래퍼 (승인 필요) +│ │ └── order_executor.py ← 주문 실행 (승인 필요) │ ├── risk/ │ │ └── manager.py ← 리스크 관리 (수정 가능) │ ├── monitor/ │ │ └── notifier.py ← Discord Webhook │ └── db/ -│ ├── models.py ← SQLite 스키마 -│ └── repository.py ← DB 접근 +│ ├── models.py ← SQLite 스키마 (승인 필요) +│ └── repository.py ← DB 접근 (승인 필요) +├── scripts/ +│ ├── run_bot.ps1 ← 스케줄러용 봇 시작 +│ ├── run_morning.ps1 ← 스케줄러용 morning +│ ├── run_evening.ps1 ← 스케줄러용 evening +│ └── setup_scheduler.ps1 ← 스케줄러 전체 재등록 ├── reports/ │ ├── daily/ ← 매일 자동 생성 -│ ├── weekly/ ← 매주 자동 생성 │ └── live_ready/ ← 실전 전환 조건 충족 시 생성 ├── data/ │ ├── stockbot.db -│ ├── news/ ← claude_morning 뉴스 저장 -│ └── market/ ← claude_morning 수급/지수 저장 +│ ├── news/ +│ └── market/ └── logs/ - ├── stockbot.log - └── trades.log + ├── stockbot.log ← 봇 메인 로그 (UTF-8) + ├── trades.log + ├── bot_start.log ← /start-bot 실행 로그 + ├── morning.log ← /morning 실행 로그 + └── evening.log ← /evening 실행 로그 ``` --- @@ -138,8 +154,8 @@ stockbot_v3/ ### 자유롭게 수정 가능 - `app/config.py` — 전략 파라미터 (TP1_PCT, TP2_PCT, SL_PCT, STRATEGY_K 등) -- `app/strategy/volatility_breakout.py` — 전략 로직, 진입/청산 조건 -- `app/risk/manager.py` — 리스크 기준값 (L1~L5 임계값) +- `app/strategy/volatility_breakout.py` — 전략 로직 +- `app/risk/manager.py` — 리스크 기준값 (L1~L5) - `app/ai/daily_context.json` — 매일 장 전 생성 - `reports/` — 리포트 생성/저장 @@ -158,16 +174,10 @@ stockbot_v3/ ## Git 규칙 -```bash -# 파일 수정 후 반드시 실행 -git add -A -git commit -m "[2026-05-15] 수정내용 요약" -git push origin main -``` - -- push 대상: origin main (Gitea NAS) -- `.env`는 절대 커밋 금지 (.gitignore 등록 확인) -- 커밋 메시지: `[날짜] 변경내용` +- branch: `master` / remote: `origin` (Gitea NAS) +- 파일 수정 후 **자동으로** `git add -A && git commit && git push origin master` +- 커밋 메시지: `[날짜] 변경내용 요약` +- `.env`는 절대 커밋 금지 --- @@ -193,8 +203,7 @@ git push origin main | 샤프지수 | 최근 30일 > 1.0 | | L3 발동 | 월 2회 이하 | -전부 충족 시 → `reports/live_ready/날짜_READY.md` 생성 + Discord 🚀 알림 - +전부 충족 시 → `reports/live_ready/날짜_READY.md` 생성 + Discord 🚀 알림 전환 방법: `.env`에서 `KIS_MOCK=false`, `DRY_RUN=false` 로 변경 --- @@ -209,43 +218,7 @@ git push origin main --- -## 현재 알려진 이슈 및 할 일 +## 다음 단계 -### 다음 단계 - [ ] WebSocket 전환 — REST 폴링 → KIS WebSocket 실시간 시세 -- [ ] NAS Docker 이전 - -### 완료 -- [x] `claude_morning` 구현 — 뉴스 크롤링 + KIS 수집 + /morning 슬래시 커맨드 -- [x] `claude_evening` 구현 — 결과 분석 + 실전 전환 체크 + /evening 슬래시 커맨드 -- [x] 작업 스케줄러 자동화 — StockBot_Morning(08:15), StockBot_Bot(07:55), StockBot_Evening(15:30) -- [x] Discord Stop 훅 — 세션 종료 시 이번 세션 커밋만 전송 -- [x] SQLite `UPDATE ORDER BY` → 서브쿼리 수정 (order_executor.py) -- [x] 전일 데이터 캐시 skip 로직 (has_prev_data) -- [x] 전일 날짜 계산 수정 (월요일 → 금요일) -- [x] `has_prev_data()` 메서드 추가 (volatility_breakout.py) -- [x] `check_entries()` / `check_exits()` sleep → 1.1초 (KIS rate limit) - ---- - -## NAS 이전 방법 - -로컬 개발 완료 후: - -```bash -# 1. Gitea push (로컬) -git push origin main - -# 2. NAS에서 pull -ssh nas -cd /volume1/docker/stockbot -git pull origin main - -# 3. .env NAS에 별도 복사 (Git 경유 금지) -scp .env nas:/volume1/docker/stockbot/.env - -# 4. Docker Compose 실행 -docker-compose up -d -``` - -로컬 Claude Code는 개발/디버깅용, NAS는 운영용으로 역할 분리. +- [ ] NAS Docker 이전 (개발 완료 후 `git push` → NAS `git pull` → `docker-compose up -d`)